Что такое anemic domain model, чем она плоха и когда всё-таки допустима?
Анемичная модель: сущности — мешки геттеров и сеттеров, вся логика в сервисах. Снаружи ООП, внутри процедурный код: инварианты никто не охраняет, одно правило дублируется по сервисам, объект легко привести в невалидное состояние.
- Лечение — поведение в сущностях: order.pay() вместо order.setStatus(PAID)
- Допустимо: CRUD без бизнес-правил, DTO, транзакционные скрипты в простых системах
- Связь с feature envy и Tell, don't ask
А ещё JPA подталкивает к анемии — сеттеры и конструктор без аргументов
Подробно
Дай определение Фаулера и объясни суть претензии: снаружи это ООП, внутри — процедурный код с отдельными структурами данных, поэтому одно бизнес-правило дублируется по нескольким сервисам, а объект можно привести в невалидное состояние. Свяжи с feature envy и «Tell, don't ask». Обязательно назови границу применимости: в тонком CRUD, в DTO и на границах системы анемичная модель уместна — там просто нет инвариантов. Сильный ответ добавляет способ лечения: перенести правила к данным, ввести типы домена вместо примитивов, проверять инварианты в конструкторе.
Что хотят услышать
- Определение и претензия.
- Когда это нормально.
Частые ошибки
- Объявлять анемичную модель безусловным злом без разговора о контексте.
- Путать её с DTO: DTO анемичен по назначению.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Модель без связей между сущностями; плоха тем, что требует много JOIN
- ✗Модель, в которой сущности сами сохраняют себя в базу; плоха связностью с инфраструктурой и поэтому недопустима никогда
- ✓Сущности без поведения: правила живут в сервисах
- ✗Модель из неизменяемых объектов, которые нельзя сохранить через JPA
Что спросят дальше
- Как это связано с primitive obsession?
- Где проходит граница между доменной логикой и логикой приложения?
Разбор темы
- DRY, KISS, YAGNI и качество связей
Дублирование знания против дублирования текста, цена преждевременной абстракции, связность и связанность, закон Деметры, каталог code smells и когда рефакторить.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.