拥有许多“initWith”参数通常是不好的做法吗?

时间:2011-12-16 01:17:23

标签: iphone objective-c ios cocoa-touch cocoa

比如说我有一个UIView的实现。 UIView包含两个标签,一个图像和一个框架。

我的" init"方法最终看起来像:

- (id)initWithFrameAndLabelArrayAndImage:(CGRect)frame:(NSArray *)labelArray:(UIImage *)image;

这被认为是不好的做法吗?有一个简单的" initWithFrame"更好吗?方法并将其他标签和图片另存为@properties?

3 个答案:

答案 0 :(得分:7)

没关系。 Apple经常这样做。例如,查看NSString:

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nsstring_Class/Reference/NSString.html

– initWithBytes:length:encoding:
– initWithBytesNoCopy:length:encoding:freeWhenDone:
– initWithCharacters:length:
– initWithCharactersNoCopy:length:freeWhenDone:
– initWithString:
– initWithCString:encoding:
– initWithUTF8String:
– initWithFormat:
– initWithFormat:arguments:
– initWithFormat:locale:
– initWithFormat:locale:arguments:
– initWithData:encoding:

但是,按照这些模式,你的:

- (id)initWithFrameAndLabelArrayAndImage:(CGRect)frame:(NSArray *)labelArray:(UIImage*)image;

应该是:

- (id)initWithFrame:(CGRect)frame labels:(NSArray *)labelArray image:(UIImage *)image;

现在,话虽如此,我可能不会传递一系列标签。我会传递数据并让自定义视图获取该数据并创建/布局子视图。您可以在公共方法中公开构成自定义视图的内部视图,并且可能希望在将来更改渲染和组合它们的方式。

另一种方法是使用委托来渲染标签,通过调用代表获取所需的数据来呈现标签 - 类似于表视图。

答案 1 :(得分:5)

虽然有多个参数很好,但你真的不应该有任何未命名的参数。在您的情况下,要调用您的方法,它将如下所示:

[[* alloc] initWithFrameAndLabelArrayAndImage:frame :array :image];

这通常是不好的做法。我会将您的自定义初始化程序重新排列为以下几行:

- (id)initWithFrame:(CGRect)frame labelArray:(NSArray *)labelArray image:(UIImage *)image;

甚至

- (id)initWithFrame:(CGRect)frame andLabels:(NSArray *)labels andImage:(UIImage *)image;

答案 2 :(得分:0)

我认为这基本上是一个偏好问题,但我个人喜欢在我发现我的参数列表运行时创建“便利方法”(即,使用默认值调用较长命名的短命名消息)。例如......

-(id)initWithFrame:(CGRect) frame {
 [self initWithFrame:frame andLabel:@"Default text"];
}

-(id)initWithFrame:(CGRect) frame andLabel: (NSString *) str {
...
}
...
-(id)initWithFrame:(CGRect) frame andLabel: (NSString *) str ... andMothersMaidenName:(id) etc { ... }

我确实问你为什么要使用“initWithFrameAndLabelArrayAndImage:”作为你的第一个参数,而不只是initWithFrame: andLabel: andArray: andImage:.将所有参数添加到第一个参数名称(然后在后续参数中重复它们)对我来说是多余的。

相关问题