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

Posted

技术标签:

【中文标题】有许多“initWith”参数通常是不好的做法吗?【英文标题】:Is it generally bad practice to have many "initWith" parameters? 【发布时间】:2011-12-16 01:17:22 【问题描述】:

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

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

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

这被认为是不好的做法吗?有一个简单的“initWithFrame”方法,而另一个标签和图片作为@properties,是不是更好?

【问题讨论】:

你最后得出了什么结论? 【参考方案1】:

没关系。苹果经常这样做。比如看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;

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

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

【讨论】:

很公平。感谢您的快速回复。【参考方案2】:

虽然有多个参数很好,但你真的不应该有任何未命名的参数。在你的情况下,调用你的方法看起来像这样:

[[* 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;

【讨论】:

【参考方案3】:

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

-(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:. 将所有参数添加到第一个参数名称(然后在后续的参数名称中重复它们)似乎是多余的我。

【讨论】:

以上是关于有许多“initWith”参数通常是不好的做法吗?的主要内容,如果未能解决你的问题,请参考以下文章

在 git 上编写多行提交消息是一种不好的做法吗? [关闭]

从您的方法返回异常是不好的做法

将预期结果基于单元测试中的实际结果是不好的做法吗?

在 Mandrill 中,向所有订阅者发送个性化时事通讯是一种不好的做法吗?

在打印日志时使用方法名作为记录器的参数是不好的做法?

使用 Null 来表示值是不好的做法吗?