Как должны быть реализованы частные и открытые члены в objective-c?

нет настоящего частного типа члена ...

У меня было некоторое обсуждение, связанное с использованием свойств и переменных экземпляра на работе, поэтому я хотел бы найти ответ на этот вопрос в вики. Теперь я знаю, что в 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, если таковые существуют, или на любую другую теорию, которая это проясняет.

23
задан VikingoS says Reinstate Monica 17 June 2012 в 22:13
поделиться