Какой принцип SOLID нарушает использование опциональных методов в протоколе?

«Какой принцип SOLID нарушает использование опциональных методов в протоколе?» — вопрос из категории ООП, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Опциональные методы (объявленные с @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 { ... }