2012-02-23 8 views
2

Obj-Cでは、関数プロトタイプのベストプラクティスは何ですか?クラス内のすべての関数または必要な関数に含めるべきか(つまり、関数呼び出しが関数実装の前に行われる)関数ごとに関数プロトタイプを宣言する必要がありますか?

+0

は、あなたがより多くを説明できますか?公開ヘッダーと非公開のメソッドで公開されているメソッドについて話していますか?あるいは、他のものの宣言を先送りしますか? –

+0

私はプライベートインターフェイスを意味しました。プライベートメソッドの前方宣言。 –

+0

探しているものはありますか?これらの回答がうまくいく場合は、そのうちの1つを受け入れるべきです。 – QED

答えて

2

一般に、コンパイラが必要としない限り、プライベート関数とメソッドを宣言する必要はありません。私は積極的に宣言することは実際的なメリットはないと考えることができます。内部的な文書化の目的でさえ、ドキュメントのすべてをファイルの先頭に置くのではなく、関数の近くに置く方がよいでしょう。

もちろん、パブリックメソッドと関数をヘッダーに宣言する必要があります。また、そこにも同様に文書化する必要があります。しかしそれは別の問題です。

1

ソースファイルが非常に大きい場合、それは上部の内部のものすべてを文書化するために便利な(かつ丁寧)のようになります。

@interface MyClass() 
- (void)internalMethod; 
... 
@end 

しかし、彼らは循環参照を持っていない限り、する必要はありません。 (AコールB、BコールA、両方を最初に置くことはできません)。私はプライベートインターフェイスの必要性を取り除くために、ファイル内の1つを上に移動することが知られていました。

3

ベストは、定義したすべての関数とメソッドに対して正確に1つのプロトタイプを持つことです。そのプロトタイプは、クラス外の世界に関数を公開するかどうかによって異なります。プロトタイプをスキップして関数本体を含めるだけであれば、おそらくそれを離れてしまうでしょう。 (たとえば、以下の例では、実行時にクラス外からコントローラstopを送信することができます)。しかし、あなたが自分のドットをつけて、あなたのtを通過することを確認するのが最善です。下の私の例では、すべてが説明されていることに注意してください。うまくいけば、これは役に立ちます。

MyAppController.h:

@interface MyAppController : NSObject { 
    id thing; 
@private 
    id noneOfYourBeeswax; 
} 

@property (nonatomic, readonly) id thing; 

-(id)initWithThing:(id)thing; 
-(void)start; 

@end 

MyAppController.m:

@interface MyAppController() // anonymous category 

@property (readwrite, retain) id thing; 
@property (nonatomic, retain) NSThread *noneOfYourBeeswax; 

-(void)start_internal; 
-(void)stop; 

@end 


@implementation MyAppController 

@synthesize thing; 
@synthesize noneOfYourBeeswax; 

-(id)initWithThing:(id)thing_ { 
    if ((self = [super init]) != nil) { 
     self.thing = thing_; 
    } 

    return self; 
} 


-(void)start { 
    // I think I'm doing this wrong but you get the picture 
    self.noneOfYourBeeswax = [[[NSThread alloc] initWithTarget:self selector:start_internal object:nil] autorelease]; 
} 

// The real worker 
-(void)start_internal { 
    while (such and such) { 
     // do something useful 
    } 

    [self stop]; 
} 


-(void)stop { 
    // clean up 
} 

@end