PassFront
  1. PassFront
  2. База знаний
  3. Принципы S.O.L.I.D

Что такое принцип разделения интерфейсов (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: исчезают заглушки, моки становятся маленькими; делят по группам клиентов, а не до интерфейса на каждый метод.

Другие вопросы раздела