Ответ
Принцип разделения интерфейса (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, а не во всю эту многоходовочку. Просто пиздец как удобно.
Вот и весь принцип. Не делай из интерфейсов помойку, где всё в одну кучу. Дроби на мелкие, специализированные штуки. И будет тебе счастье, а не вот это вот всё.