Перейти к основному содержимому

MAPPER — модель кода и предметная область

Разработчику Архитектору

MAPPERModel: Abstract Partial and Programmable Explaining Reality (модель: абстрактная, частичная, программируемая, объясняющая реальность). Это правило проектирования: код — модель реальности, а не набор технических деталей без связи с предметной областью.

Статья — мост между культурой именования и стиля и доменной моделью. Дальше: анемичные модели и примитивы, указатель тем.


Зачем нужна явная модель

Программа всегда описывает упрощённый срез мира: вы не кодируете физику Вселенной, а только то, что нужно для задачи (заказ, платёж, маршрут робота). Ошибка начинается, когда в коде появляются сущности, которых нет в предметной области, или одна реальная вещь размазана по десяти string и int.

Критерий MAPPERСмысл для разработчика
Model (модель)Есть осознанная картина домена, а не «поля как в таблице БД»
Abstract (абстрактная)Детали скрыты; снаружи видны операции и инварианты
Partial (частичная)Моделируем только нужные аспекты, без лишнего
Programmable (программируемая)Поведение выражено в коде, а не в голове одного автора
Explaining RealityИмена и границы объектов узнаваемы экспертом предметной области

Петер Наур формулировал близкую мысль: программа — это теория о части мира, которую вы автоматизируете. MAPPER делает эту теорию проверяемой на ревью: «есть ли в коде лишний объект?», «не размазали ли мы Invoice по трём сервисам?».


Биекция «реальность ↔ код»

Идеальная (и недостижимая на 100 %) цель — биекция: каждому значимому понятию в домене соответствует один явный элемент модели (класс, тип, модуль), и наоборот.

// Слабая модель: «деньги» размазаны по примитивам
void Charge(decimal amount, string currencyCode) { ... }

// Ближе к MAPPER: деньги — объект предметной области
void Charge(Money total) { ... }

Нарушение биекции — частый источник запахов:

  • примитивная одержимостьstring email, double latitude вместо Email, GeoPoint (статья 6, 4-02/616);
  • анемичные модели — класс Order только с геттерами, вся логика в OrderService;
  • лишние if и null — вместо явного состояния или Null Object (статья 8);
  • глобалы и синглтоны — «объект есть в коде», но в реальности так не устроено (статья 9).
Связь с DDD и архитектурой

MAPPER не заменяет доменную модель и чистую архитектуру, а задаёт критерий качества кода внутри домена: сущности и value object должны быть узнаваемы аналитиком и тестируемы без «магии» в утилитах.


Единственный принцип проектирования программ

На практике все остальные практики чистого кода сводятся к установке: сопоставляйте реальные сущности с проектом в масштабе один к одному (насколько это возможно в выбранной парадигме).

  1. Сначала поведение и границы — что объект делает и что запрещено; имена — потом (культура имён).
  2. Один уровень абстракции в методе — читатель не переключается между «бизнесом» и «SQL/JSON» в одной функции.
  3. Явные предусловия — неверные комбинации отсекаются рано (быстрый провал).
  4. Рефакторинг от запаха к модели — не «переименовать переменную», а «найти недостающий объект» (см. методы рефакторинга).

Частичность и объяснимость

Модель намеренно неполная. Для интернет-магазина не нужен класс CustomerDNA; для расчёта скидки не нужна полная история кликов. Частичность — это дисциплина: не тащить в код понятия «на будущее» (YAGNI).

Explaining Reality — проверка с экспертом или с тестом:

  • «Что в системе называется Reservation
  • «Где живёт правило отмены брони — в одном месте или в пяти if

Если объяснение требует схемы из двадцати стрелок между сервисами, модель в коде, скорее всего, разъехалась с реальностью.


MAPPER и ИИ-генерация кода

Модели выдают объёмный, правдоподобный текст, который легко нарушает биекцию (лишние хелперы, дубли, null, глубокие if). MAPPER — чек-лист ревьюера:

  • каждый новый класс — кто в домене?
  • можно ли заменить пачку флагов одним объектом состояния?
  • тест фиксирует поведение, а не «снимок» сгенерированного шума?

См. вайб-кодинг и риски ИИ.


Мини-практикум на ревью

ВопросПлохой знакКуда смотреть
Сколько «сущностей» в задаче на словах?В коде их вдвое больше или меньше6, 13
Где правило X?В Utils, Manager, Helper1
Что при невалидных данных?null, тихий return8, 10
Меняется ли смысл при рефакторинге?В одном PR и фича, и перестройка10, легаси

См. также

Дальше: Анемичные модели и примитивыУсловия, null и контракты.


См. также

Другие статьи этого же раздела в боковом меню (как на странице "О разделе").