7

Я часто сталкиваюсь с такими вариантами дизайна и немного борюсь; Я ищу некоторые другие перспективы.Лучшая альтернатива объектам Objective-C только для данных?

Я часто хочу сохранять списки или передавать куски состояния, которые в основном представляют собой только набор значений. Значения, как правило, являются примитивными типами: поплавками, NSTimeIntervals, CGPoints и т. Д.

Моим первым наклонением часто является создание структур C для этих наборов свойств, например.

typedef struct _STATE { 
    float foo; 
    NSTimeInterval elapsed; 
    CGPoint point; 
} STATE; 

т.д.

Но C структуры не дружат с родной коллекции классов какао (NSArray, NSSet, NSDictionary), и используя overmany их отслеживать множество из состояния чувствует, как он работает против зерно остатка моего кода, совместимого с какао, - я получаю и управляю массивами структур, а также передаю строковые указатели в сообщениях и т. д.

С другой стороны, поскольку необработанная производительность не обязательно критическая , Я мог кодировать эти значения в NSDictionary, обертывая их все в NSValue или NSNumber, но полученный синтаксис вряд ли немногословен, и немного хрупкий, требуя тип и имя корректность во время выполнения как для вставки и поиска:

[stateDict setObject:[NSNumber numberWithFloat:foo] forKey:@"bar"]; 
... 
float something = [[stateDict objectForKey:@"bar"] floatValue]; 

и некоторых видов, как NSTimeInterval, только в состоянии использовать с некоторым (спорным) хакером (в этом случае приведение типа к двойному).

Наконец, я мог бы создавать объекты контейнера только для данных, с частными данными-членами и только с геттерами/сеттерами. (Они будут называться «beans» на Java.) Они более сложны для доступа, чем словари, более Cocoa, чем структуры, но мне кажется, что это излишний, особенно если мне нужны только они как «внутренние классы», которые используются для управления состоянием внутренний для одного типа объекта.

Как вы, отличное программирование какао, публично, сделайте это?

ответ

14

В зависимости от ситуации я запускаю либо с использованием классов NSDictionary для произвольных данных, либо создаю классы контейнеров (теги @ property/synthesize в Objective C делают это очень просто). При использовании ObjC для заголовка файла:

@interface StateObject : NSObject { 
    NSNumber *foo; 
    NSTimeInterval *elapsed; 
    CGPoint point; 
} 

@property (retain) NSNumber *foo; 
@property (retain) NSTimeInterval *elapsed; 
@property (copy) CGPoint point; 

@end 

можно затем использовать @synthesize <variable> в файле .m для автоматического создания сеттеры/добытчиками. Затем, в то время как анонимные NSNumbers еще злобные, вы можете сделать:

myStateObject.foo = [NSNumber numberWithFloat:7.0]; 

Это должно занять большую часть боли прочь, и позволяет использовать классы сбора какао для улучшения данных ерзать.

+4

+1.Создание классов моделей - это почти всегда путь, если у вас нет кода с очень высокой критичностью, когда накладные расходы на использование объектов могут вызвать проблемы. –

+3

Спасибо за это Matt. В этом случае вам даже не нужно обертывать float с помощью NSNumber - для доступа к примитивным типам можно использовать синтаксис @property. (Конечно же, для NSTimeInterval, который является примитивным поплавком typedef'd.) –

2

Не обязательно одобрять этот подход как «лучший», но между вашими предложениями есть промежуточная точка: создайте C-структуры для хранения информации, а затем оберните структуры в объекты NSValue, когда вам нужно поместить их в структуры данных Cocoa , Вы можете видеть, что UIKit делает это в некоторых случаях с такими структурами, как CGPoint в уведомлениях (и я уверен, что AppKit делает тоже).

Подробнее об этом см. В разделе «Использование значений» в Number and Value Programming Topics for Cocoa.

 Смежные вопросы

  • Нет связанных вопросов^_^