Вопрос с собеседования · Java

Что такое anemic domain model, чем она плоха и когда всё-таки допустима?

MiddleПринципы проектирования
Коротко

Анемичная модель: сущности — мешки геттеров и сеттеров, вся логика в сервисах. Снаружи ООП, внутри процедурный код: инварианты никто не охраняет, одно правило дублируется по сервисам, объект легко привести в невалидное состояние.

  • Лечение — поведение в сущностях: 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?
  • Где проходит граница между доменной логикой и логикой приложения?

Разбор темы

Связанные вопросы

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования