Что такое принцип разделения интерфейсов (ISP)
Принципы S.O.L.I.D
Принцип разделения интерфейсов: клиенты не должны зависеть от методов, которыми не пользуются; много узких интерфейсов лучше одного универсального.
Пример нарушения
/**
* Контракт Machine: print(), scan(), fax()
*/
class SimplePrinter {
print() { console.log('printing'); }
scan() { throw new Error('Не поддерживается'); }
fax() { throw new Error('Не поддерживается'); }
}Простой принтер без факса вынужден реализовывать fax() заглушкой — ломается и LSP; а при изменении «толстого» интерфейса пересобираются все клиенты, даже не пользующиеся изменённым методом.
Исправление
Разбить на Printer, Scanner, Fax: многофункциональное устройство реализует все три, простое — только Printer. Клиенты зависят от нужного минимума.
Что это даёт
- Моки в тестах маленькие: подменять два метода вместо пятнадцати.
- Изменение интерфейса затрагивает только реальных пользователей метода.
- Интерфейсы читаются как роли:
Readable,Disposable.
Грань
Не дробить до интерфейсов-на-один-метод без причины: разделение идёт по группам клиентов, а не из фанатизма.
Коротко для собеседования
ISP — клиент зависит только от тех методов, которые вызывает. Толстый интерфейс разбивают на роли вроде Printer и Scanner: исчезают заглушки, моки становятся маленькими; делят по группам клиентов, а не до интерфейса на каждый метод.