NSDictionary против пользовательского объекта

Вопрос довольно прост: когда я создаю новый API или класс обслуживания, должен ли я создавать собственный класс для объектов, которые передаются, или я должен просто придерживаться NSDictionary, который просто хранит данные в формате стиля ключ-значение. .

Очевидно, что есть плюсы и минусы, но где, по вашему мнению, порог использования одного над другим?

NSDictionary:

+ Нет зависимостей
+ Очень гибкий
+ Часто используется
+ Встроенная поддержка NSCoding
- Структура не определена -> Ошибки выполнения

Пользовательский объект:

+ Структура определена
+ Методы доступа в стиле свойства: myObject.someProperty - Может привести к отн. большое количество классов для вложенных объектов

Обновление: включены замечания от jbat100.


person Besi    schedule 21.11.2011    source источник
comment
Это зависит от ваших предпочтений. Например, у меня всегда есть логика бизнес-уровня (BLL), и я обычно создаю пользовательские объекты.   -  person beryllium    schedule 21.11.2011


Ответы (3)


Это действительно зависит от того, насколько вы ожидаете, что ваша модель данных изменится. Работа с изменениями, когда у вас есть настраиваемая модель данных на основе классов, может быть сложной, особенно когда у вас есть архивы (вещи NSCoding) с разными версиями модели (в уже отправленных версиях вашего приложения), вы должны быть очень осторожны, чтобы обеспечить обратную совместимость и избежать неприятных сюрпризов во время выполнения. В этом отношении модели на основе NSDictionary, как вы говорите, более гибкие. Однако они не допускают всех настраиваемых проверок и поведения, которые делают пользовательские классы. Кроме того, пользовательские классы делают модель данных более явной для кодеров, незнакомых с кодом. По моему опыту, разработчики часто проявляют небрежность (особенно неопытные) при работе с моделями на основе NSDictionary, что может быстро привести к непонятному беспорядку, поэтому, если вы опустите это маршрут, хорошо документируйте и будьте дисциплинированы!

person jbat100    schedule 21.11.2011
comment
Спасибо за упоминание о NSCoding. Я не знал об этой ситуации. Я добавил это в список за и против - person Besi; 21.11.2011

Обычно у меня есть набор моделей предметной области, которые лучше подходят для подхода MVC к разработке iPhone. Наличие определенных объектов также позволяет вам намного проще обеспечивать безопасность типов, а также снижает сложность в долгосрочной перспективе. Если у вас есть NSDictionaries, содержащие NSArrays и другие NSDictionaries и т. д. и т. д. для представления вашего графа объектов, он может очень быстро стать неуправляемым.

person Simon Lee    schedule 21.11.2011

Если вам нужен доступ только для чтения и не нужны методы, вы можете сделать следующее:

@interface NSDictionary (MyClassCategory)
-(NSString*) someField;
@end

@implementation NSDictionary (MyClassCategory)
-(NSString*) someField {
    return [self objectForKey:@"someField"];
}
@end

typedef NSDictionary MyClass;

И используйте его:

 MyClass* myClass = ...;
    NSString* value = [myClass someField];
person Aliaksandr Andrashuk    schedule 21.11.2011
comment
Какой смысл создавать категорию вместо создания собственного класса? - person Godfather; 03.04.2014