После изучения книги разработчика 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 должны быть веские причины для отхода от общих практик программирования.
NSMutableArray * workingArray
используется внешними классами. Так что ни у одного другого ивара не должно быть сеттеров и геттеров. id
имеет установщик, пользователь этого объекта может переключать делегата в середине синтаксического анализа XML, что не имеет смысла. Кроме того, NSData * dataToParse
- это необработанные данные XML, полученные из сети. Теперь, когда у него есть сеттер, пользователь этого объекта может повредить данные. частными
в заголовке? Поскольку все ivars синтезированы для получения геттеров / сеттеров, они фактически являются общедоступными. Вы можете установить для них все, что захотите, и вы можете получить их значение, когда захотите.