Что такое принцип разделения интерфейса (Interface Segregation Principle)?

«Что такое принцип разделения интерфейса (Interface Segregation Principle)?» — вопрос из категории ООП, который задают на 22% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Принцип разделения интерфейса (Interface Segregation Principle, ISP) — один из принципов SOLID. Он гласит: «Клиенты не должны зависеть от методов, которые они не используют». На практике это означает, что лучше создавать множество узкоспециализированных интерфейсов (протоколов в Swift), чем один «толстый» универсальный интерфейс.

Проблема — нарушение ISP:

// "Толстый" протокол, заставляющий реализовывать ненужные методы
protocol Worker {
    func code()
    func test()
    func deploy()
    func cook() // Не относится к обязанностям программиста
}

class Programmer: Worker {
    func code() { /* ... */ }
    func test() { /* ... */ }
    func deploy() { /* ... */ }
    func cook() { // Программист вынужден реализовать этот метод
        fatalError("Программист не должен готовить!")
    }
}

Решение — следование ISP:

// Разделяем на специфичные протоколы
protocol Coder {
    func code()
}

protocol Tester {
    func test()
}

protocol DevOps {
    func deploy()
}

protocol Cook {
    func cook()
}

// Классы реализуют только нужные им протоколы
class Programmer: Coder, Tester { /* реализует code() и test() */ }
class Chef: Cook { /* реализует cook() */ }

Преимущества ISP:

  • Уменьшает связность (coupling): классы зависят только от необходимого функционала.
  • Повышает ясность: протоколы четко описывают конкретную роль.
  • Упрощает тестирование и модификацию: изменения в одном протоколе затрагивают меньше классов.