Является ли частное синтезируемое свойство оксюмороном?

После изучения книги разработчика iPhone для начинающих и чтения примеров кода в Интернете, я заметил, что большинство программистов на Objective C синтезируют почти все переменные экземпляра. Некоторые переменные удобно изменять, но большинство не должно делать этого при соблюдении объектно-ориентированного принципа инкапсуляции. Худшие - это синтетические объекты, помеченные как частные. Программист на C ++, пытающийся использовать чужой код, будет читать общедоступные поля и методы в файле заголовка. Они пропустят частные переменные. Этот программист на C ++ не будет знать, что вы намеревались использовать закрытые свойства каким-либо осмысленным образом.

Взгляните на этот образец шаблона для ленивой загрузки изображения таблицы , предоставленного Apple:

Заголовок

@interface ParseOperation : NSOperation 

{
@private
    id  delegate;
    NSData          *dataToParse;
    NSMutableArray  *workingArray;
    AppRecord       *workingEntry;
    NSMutableString *workingPropertyString;
    NSArray         *elementsToParse;
    BOOL            storingCharacterData;
}

Источник

@interface ParseOperation ()
@property (nonatomic, assign) id  delegate;
@property (nonatomic, retain) NSData *dataToParse;
@property (nonatomic, retain) NSMutableArray *workingArray;
@property (nonatomic, retain) AppRecord *workingEntry;
@property (nonatomic, retain) NSMutableString *workingPropertyString;
@property (nonatomic, retain) NSArray *elementsToParse;
@property (nonatomic, assign) BOOL storingCharacterData;
@end

@implementation ParseOperation
@synthesize delegate, dataToParse, workingArray, workingEntry, workingPropertyString, elementsToParse, storingCharacterData;

Теперь я знаю, что это не C ++, и мы не должны предполагать, что все практики C ++ должны соблюдаться в Objective C. Но у Objective C должны быть веские причины для отхода от общих практик программирования.

  1. Почему все частные ivars синтезированы? Когда вы смотрите на проект в целом, только NSMutableArray * workingArray используется внешними классами. Так что ни у одного другого ивара не должно быть сеттеров и геттеров.
  2. Почему синтезируются очень чувствительные ивары? Во-первых, теперь, когда делегат id имеет установщик, пользователь этого объекта может переключать делегата в середине синтаксического анализа XML, что не имеет смысла. Кроме того, NSData * dataToParse - это необработанные данные XML, полученные из сети. Теперь, когда у него есть сеттер, пользователь этого объекта может повредить данные.
  3. Какой смысл отмечать все частными в заголовке? Поскольку все ivars синтезированы для получения геттеров / сеттеров, они фактически являются общедоступными. Вы можете установить для них все, что захотите, и вы можете получить их значение, когда захотите.

8
задан JoJo 27 April 2011 в 17:08
поделиться