Information Expert

Кто владеет данными — тому и принадлежит метод, который с этими данными работает. Базовый принцип GRASP, из него растут все остальные.

Что это / Зачем

  • Метод/операция размещается на том классе/модуле, у которого есть нужная для неё информация.
  • Альтернатива — лезть в чужие кишки и тащить данные наружу — ломает инкапсуляцию.
  • Каждая сущность — свой Information Expert. Класс не лезет внутрь подчинённого класса.

Признаки нарушения

  • Внешний код напрямую читает/пишет внутреннюю структуру (list.head.next().value = x).
  • Метод одной сущности оперирует данными другой (order.calcTotal(product) лазит в product.items).
  • if (x.type === 'group') {…} else {…} — снаружи диспетчеризуем поведение, которое должно жить на сущности.
  • Дублирование данных в нескольких местах после «удобного» доступа.

Пример

class List {
  #head = null; #tail = null;
  push(value) { /* безопасно */ }
  pop       { /* безопасно */ }
}
// клиент работает только через контракт — он не Information Expert на внутренностях
const l = new List();
l.push(1);
l.pop();

Антипаттерн / Что НЕ делать

// нарушение: лезем во внутренние ссылки списка
list.first.next() = newNode;
list.last = newNode;
// результат: дубли second, рассинхрон head/tail, хрупкость

🎓 Источники

  • 🎓 [GRASP Information Expert Principle] · 2021-02-25 · YouTube
    • Каждый класс — свой Information Expert. Модуль тоже может быть экспертом.
    • Пример: ring buffer — внутренняя реализация изменилась, контракт сохранён → ничего не сломалось.
  • 🎓 [GRASP: как думать про паттерны, Information Expert] · 2025-02-06 · YouTube
    • «Information Expert — это ключевая, базовая вещь, вокруг которой строится всё остальное».
    • Альтернативная позиция: «В JS культура такова, что ответственность размывается — кладём на GRASP, лезем в кишки. Это делает систему хрупкой».

См. также