Первый метод:
Плюсы:
- Более гибкие возможности для будущих изменений.
Минусы:
- Может привести к большому оператору switch или к грязному оператору if ... else if ... else.
- Вероятно, в любом случае приводит к серии явных методов.
- Требуется тип приведения.
Второй метод:
Плюсы:
- Нет типа приведения.
- Если методы являются необязательными, делегат беспокоит только те объекты, которые его интересуют.
Минусы:
- Если методы не являются обязательными и интерфейспозже, все делегаты будут получать предупреждения, пока не будут реализованы новые методы.
- Если методы не являются обязательными, это может быть множество методов, которые можно реализовать для каждого делегата.
Обычно при создании интерфейсов делегатов я склоняюсь к обобщениям для будущей расширяемости.Изменение API, особенно с открытым исходным кодом, может быть очень сложным.Кроме того, я не совсем понимаю, почему у вас один XML-парсер делает так много.Вы можете рассмотреть другой дизайн.17 различных XML-документов кажутся много.Помимо этого, я предложу третий метод.
Третий метод:
Создать словарь, который отображает строки в блоки.Блоки, вероятно, будут иметь тип void(^BlockName)(id obj)
.Ваш парсер определит серию строк, которые будут ключами для ваших различных блоков.Например,
NSString * const kFooKey = @"FooKey";
NSString * const kBarKey = @"BarKey";
// And so on...
Кто бы ни создавал синтаксический анализатор XML, он регистрирует блок для каждого ключа, который их интересует. Он должен регистрироваться только для ключей, которые его интересуют, и он полностью гибок для будущих изменений.Поскольку вы регистрируетесь для явных ключей / объектов, вы можете подтвердить переданный тип без приведения типа (по существу Design By Contract ).Это может быть слишком сложно для того, что вы хотите, но я нашел подобные проекты очень полезными в моем коде.Он сочетает в себе плюсы обоих ваших решений.Это основной недостаток, если вы хотите использовать SDK, который не имеет блоков.Тем не менее, блоки становятся де-факто стандартом с Objective-C.
Кроме того, вы можете определить протокол, который включает в себя общие функциональные возможности ваших 17 объектов, если вы еще этого не сделали.Это изменит тип вашего блока на void(^BlockName)(id<YourProtocol> obj)
.