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