Ответ
Опциональные методы (объявленные с @objc и optional) нарушают Принцип разделения интерфейса (Interface Segregation Principle - ISP).
Почему: ISP гласит, что «клиенты не должны зависеть от методов, которые они не используют». Большой протокол с опциональными методами заставляет клиентов знать о функциональности, которая им не нужна, и приводит к «раздутым» (fat) интерфейсам.
Пример нарушения в Swift:
@objc protocol DataProcessor {
func processData()
@objc optional func validateData() // Не все обработчики должны это делать
@objc optional func logProcess() // Не все нуждаются в логировании
}
Класс, реализующий только processData(), все равно зависит от всего протокола.
Решение по ISP: Разделить на несколько узкоспециализированных протоколов.
protocol DataProcessor {
func processData()
}
protocol DataValidator {
func validateData()
}
protocol ProcessLogger {
func logProcess()
}
// Класс реализует только нужные ему протоколы
class SimpleProcessor: DataProcessor { ... }