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, лезем в кишки. Это делает систему хрупкой».