2011-12-16 5 views
5

例えばUIViewの実装があります。 UIViewには、画像とフレームの2つのラベルが含まれています。多くの「initWith」パラメータを使用することは一般に悪い習慣ですか?

私の "INIT" の方法は次のように見て終わる:

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

は悪い習慣と考えていることですか?単純な "initWithFrame"メソッドを持ち、他のラベルとピクチャを@propertiesとして持つ方が良いでしょうか?

+0

あなたが締結何をしてしまうのですか? – bryanmac

答えて

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つのアプローチは、デリゲートを使用して、必要なデータのデリゲートを呼び出すことによって、ラベルがレンダリングされるラベルをレンダリングすることです(テーブルビューと同様)。

+0

十分に公正。早速のお返事ありがとうございます。 –

0

基本的には優先事項だと思いますが、私は自分のパラメータリストがamokを実行している(つまり、デフォルト値を使って長いものを呼び出す短い名前のメッセージ)ことを見つけるたびに、あなたの最初のパラメータとして、しかし、むしろちょうどinitWithFrame: andLabel: andArray: andImage:.は、最初のパラメータ名にすべてのパラメータを追加(そしてそれらを繰り返すより:たとえば...

-(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」を使用する理由質問を行いますその後のもの)は私には重複しているようです。

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; 
関連する問題