Поскольку наша кодовая база созревает, мне начинает не нравиться шаблон передачи словарей как способ упаковывать информацию для передачи сообщений или, что еще хуже, аргументов функции. Это требует, чтобы функция отправки и получения имела недокументированный API строковых литералов.Лучше, чем передавать NSDictionaries в качестве параметров?
..in some function..
NSDictionary *info = [NSDictionary dictionaryWithObjectsAndKeys:
thisObject, @"thisKey",
thatObject, @"thatKey",
nil];
[[NSNotificationCenter defaultCenter] postNotificationName:@"MY_NOTIFICATION" object:nil userInfo:info];
....
, а затем в слушателе someClass
«s
- (void)someClassListener:(NSNotification *)notification {
NSDictionary *info = [notification userInfo];
ThisObject *ob1 = [info objectForKey:@"thisKey"];
ThatObject *ob2 = [info objectForKey:@"thatKey"];
}
Вы должны помнить, что thisKey
и thatKey
ключей типа ThisObject
и ThatObject
для этого уведомления, что вы могли бы создать некоторые константы где для тех, но это не решит проблему.
И скажем, что у вас есть функция, которая требует 15 аргументов, вы не собираетесь делать функцию с 15 параметрами, было бы намного проще (хотя и менее читаемо) просто передать словарь, но теперь у вас есть такой же проблема, как указано выше.
Я играл с созданием «классов сообщений» в этих заголовочных файлах этого класса (т.е. два интерфейса в одном заголовке), а класс сообщений - это просто список объектов, которые вы определяете и отправляете методу, который создает более сильный контракт, но это кажется неправильным.
Было бы замечательно, если бы я мог сделать что-то вроде typeDef
объект параметра в заголовке, но не поддерживает NSObject
Вот только такие вещи, как int
или float
т.д.
По существу я пытаюсь создать более сильный контракт между отправителем сообщения и приемником сообщений, будь то функции или уведомления.
Я упоминаю константы для ключей как не хорошее решение, потому что вам все равно нужно искать, что такое ключ, и не создавать сильный контракт, для чего будет значение (объект), больше похоже на предложение. Инкапсулирование данных в класс было направлением, которое я изучал, но кажется громоздким создать класс для каждого сообщения, которое я хочу передать, будь то 2 аргумента равны 10, не согласны ли вы? – Shizam
@Shizam, Если эти сообщения будут помещены в разные словари, тогда вам, вероятно, понадобится более одного класса. Но если вы говорите о сообщениях, которые иногда передают два ключа из словаря, а иногда и 10, то это все равно будет только одним классом. – rdelmar
@rdelmar Что я имею в нашей программе, у нас, вероятно, есть 10-15 уникальных уведомлений, каждому из этих уведомлений потребуется свой собственный класс, чтобы определить его свойства для сообщения и т. Д. – Shizam