У меня было некоторое обсуждение, связанное с использованием свойств и переменных экземпляра на работе, поэтому я хотел бы найти для них ответ вики. Теперь я знаю, что в objective-c нет реального частного типа члена, все довольно широко. Тем не менее, я немного обеспокоен тем, как мы должны разрабатывать наши классы, а также соблюдать принципы ООП. Я хотел бы услышать мнения об этих трех подходах к разработке:
а. Согласно различным статьям и даже новым курсам развития iPhone в Стэнфордском университете, вы всегда должны использовать свойства везде, где можете. Однако IMHO, этот подход тормозит принципы проектирования ООП, поскольку в этом случае все участники становятся общедоступными. Зачем мне публиковать все внутренние/локальные переменные экземпляра снаружи? Кроме того, есть некоторые очень небольшие (но все же) накладные расходы, если вы используете синтезированные сеттеры через свойства, вместо этого используете локальный ivar напрямую. Здесь образец:
//==== header file =====//
@interface MyClass : NSObject
@property (nonatomic, retain) NSString *publicMemberWithProperty;
@property (nonatomic, retain) NSString *propertyForPrivateMember;
@end
В. Другой подход заключается в объявлении ivars в файле заголовка (без объявления относительных свойств) для частных членов и в том же заголовочном файле для объявления чистых свойств (без объявления относительных ivars) для публичных членов. В таком случае, ivars будут использоваться непосредственно в классе. Этот подход имеет смысл, но не использует все преимущества от свойств, потому что мы вручную выставляем старые значения перед установкой новых. Здесь образец:
//==== header file =====//
@interface MyClass : NSObject{
NSString *_privateMember;
}
@property (nonatomic, retain) NSString *publicMemberWithProperty;
@end
С. Объявлять чистые свойства (без объявления относительных ivars) для публичных членов в файле заголовка и объявлять чистые свойства (без объявления относительных ivars) для частных членов в частном интерфейсе в файле реализации. Такой подход ИМХО более ясен, чем первый, но остается тот же вопрос: почему у нас должны быть свойства для внутренних/локальных членов? Здесь образец:
//==== header file =====//
@interface MyClass : NSObject
@property (nonatomic, retain) NSString *publicMemberWithProperty;
@end
//==== implementation file =====//
@interface MyClass()
@property (nonatomic, retain) NSString *propertyForPrivateMember;
@end
Это решение свободы меня немного раздражает, и я хотел бы найти подтверждение от соответствующих источников о том, как все должно быть сделано. Тем не менее, я не смог найти такие строгие заявления в документах Apple по этому поводу, поэтому, пожалуйста, разместите ссылку на яблочные документы, если они есть, или на любую другую теорию, которая очищает это.