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

Ответ

Принцип разделения интерфейса (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): классы зависят только от необходимого функционала.
  • Повышает ясность: протоколы четко описывают конкретную роль.
  • Упрощает тестирование и модификацию: изменения в одном протоколе затрагивают меньше классов.

Ответ 18+ 🔞

Да ты посмотри на эту дичь, блядь! Опять эти ваши принципы, как будто без них код сам себя не напишет. Ну ладно, слушай сюда, разберём эту хрень.

Вот представь, есть у тебя протокол Worker. Ну тип, работник, да? И в нём намешано всего: и код писать, и тестировать, и деплоить, и, сука, готовить! Это ж ёперный театр! Кто это придумал-то? Программист, который вынужден реализовывать метод cook(), просто охуевает. Он же не на кухне, блядь! Он пишет код, а его заставляют борщ варить. В итоге он пишет fatalError и посылает всех нахуй, и правильно делает.

А теперь смотри, как надо по-человечески. Берём этот жирный, неповоротливый протокол и — трах-бабах! — разносим его на кучу маленьких и понятных.

Вот тебе Coder — только код пишет. Tester — только тестирует. DevOps — только деплоит. И, наконец, отдельно, блядь, Cook — только готовит. Красота же!

Теперь программист (Programmer) спокойно подписывается под Coder и Tester, и ему похуй на готовку. А повар (Chef) наслаждается протоколом Cook. Никто никому не мешает, все счастливы.

В чём прикол-то, спросишь? Да в том, что:

  • Связность падает как градусник у здорового человека. Классы больше не тащат за собой кучу ненужного хлама.
  • Всё ясно как божий день. Глянул на протокол — и сразу понял, что этот тип умеет. Никаких сюрпризов.
  • Тестировать и менять — одно удовольствие. Захотел поменять что-то в деплое — тыкаешь только в DevOps, а не во всю эту многоходовочку. Просто пиздец как удобно.

Вот и весь принцип. Не делай из интерфейсов помойку, где всё в одну кучу. Дроби на мелкие, специализированные штуки. И будет тебе счастье, а не вот это вот всё.