NSDictionary против пользовательского объекта
Вопрос довольно прост: когда я создаю новый API или класс обслуживания, я должен создать собственный класс для объектов, которые передаются, или я должен просто придерживаться NSDictionary
, который просто хранит данные в ключе -валютный формат.
Очевидно, есть плюсы и минусы, но где вы, ребята, думаете, является порогом использования одного над другим?
NSDictionary
:
+
Без зависимостей
+
Очень гибкий
+
Обычно используемый
+
Встроенная поддержка NSCoding
-
Структура не определена → Ошибки времени выполнения
Пользовательский объект:
+
Определенная структура
+
Аксессоры типа свойств: myObject.someProperty
-
Может привести к rel. большое количество классов для вложенных объектов
Обновить. Включены замечания из jbat100
Ответы
Ответ 1
На самом деле зависит от того, насколько вы ожидаете изменения модели данных. Работа с изменениями, когда у вас есть пользовательская модель данных на основе классов, может быть сложной, особенно когда у вас есть архивы (материал NSCoding) с разными версиями модели (в уже отправленных версиях вашего приложения), вы должны быть очень осторожны, чтобы обеспечить обратную совместимость и избегайте неприятных неожиданностей. В этом отношении модели, основанные на NSDictionary, являются, как вы говорите, более гибкими. Однако они не позволяют выполнять все индивидуальные проверки и поведение, которые выполняют пользовательские классы. Кроме того, пользовательские классы делают модель данных более явной для кодеров, незнакомых с кодом. По моему опыту разработчики часто становятся неаккуратными (особенно когда они неопытные), когда речь идет о моделях, основанных на NSDictionary, которые могут быстро привести к непостижимому беспорядку, поэтому, если вы спуститесь вниз маршрут, документ хорошо и быть дисциплинированным!
Ответ 2
У меня обычно есть набор моделей доменов, которые лучше подходят для подхода MVC для разработки iPhone. Наличие определенных объектов также позволяет значительно упростить безопасность типов, а также в долгосрочной перспективе снизить сложность. Если у вас есть NSDictionaries, содержащие NSArrays и другие NSdictionaries и т.д., Чтобы представлять ваш граф объектов, он может очень быстро стать неуправляемым.
Ответ 3
Если вам нужен доступ только для чтения и вам не нужны методы, вы можете сделать следующее:
@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];