Должен ли я объявить прототип функции для каждой функции? - PullRequest
2 голосов
/ 23 февраля 2012

В Obj-C, какова лучшая практика для прототипа функции?Должен ли я включать их для каждой функции в моем классе или только для той, которая необходима (то есть вызов функции происходит до реализации функции)

Ответы [ 3 ]

3 голосов
/ 23 февраля 2012

Наилучшая практика - иметь ровно один прототип для каждой функции и метода, который вы определяете.Где должен находиться этот прототип, зависит от того, хотите ли вы представить функцию миру за пределами вашего класса.Если вы пропустите прототип и просто включите тело функции, вам, вероятно, это сойдет с рук.(Например, в приведенном ниже примере вы можете отправить свой контроллер stop из-за пределов класса во время выполнения.) Но лучше всего удостовериться, что вы поставили точки i и пересекли 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
2 голосов
/ 23 февраля 2012

Вообще говоря, нет необходимости пересылать объявления частных функций и методов, если это не требуется компилятору. Я не могу придумать никакой практической пользы для упреждающего объявления. Даже для целей внутренней документации лучше поместить документацию ближе к функции, а не в начало файла.

Конечно, вы должны объявить публичные методы и функции в заголовке, и вы должны также документировать их там. Но это отдельная проблема.

1 голос
/ 23 февраля 2012

Если ваш исходный файл довольно большой, было бы полезно (и вежливо) задокументировать внутренние файлы сверху:

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

Но в этом нет необходимости, если у них нет циклических ссылок.(A вызывает B, B вызывает A, не может поставить оба в первую очередь).Мне известно, что я поднялся на один уровень выше, чтобы избежать необходимости в частном интерфейсе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...