Анемичная модель и DTO
«Анемичная модель» — объект только с данными, без поведения. Часто называется антипаттерном, но для информационных систем — норма. DTO — структура на границе модулей: только поля, никакого поведения.
Что это / Зачем
- В реальном мире большинство доменных объектов пассивны: пациент, заказ, документ.
- Поведение живёт в use cases / сервисах, а не на сущности.
- DTO передаются между модулями/слоями — снижают зацепление, как интерфейсы.
Когда анемичная модель — норма
- Информационные системы (CRM, медицина, госуслуги) — карточка больного, а не сам больной.
- ~60-70% поведения уходит в use cases и сервисы (stateless классы).
- Бизнес-процесс — это пачка сервисов, а не метод на пациенте.
Пример: stateless service + анемичный entity
// анемичная entity — только данные
class Patient {
constructor(
public id: number,
public name: string,
public bloodGroup: string,
) {}
}
// поведение — в сервисе/use case
class DiagnosisService {
decide(patient: Patient, symptoms: Symptom): Diagnosis {
/* бизнес-логика */
}
}
DTO на границе модулей
// каждое пересечение модуля — DTO, не доменный объект
interface UserResponseDto { id: number; name: string; }
class UserController {
async get(id: number): Promise<UserResponseDto> {
const user = await this.repo.findById(id);
return { id: user.id, name: user.name }; // не отдаём весь user
}
}
Антипаттерн: активная доменная модель там, где не нужно
// Active Record на анемичной по сути сущности
class Patient {
save { db.exec(`INSERT…`); } // нарушение SOLID
decideDiagnosis { /* … */ } // не место в Patient
notifyDoctor { /* … */ } // не место в Patient
}
🎓 Источники
- 🎓 [Анемичная модель и DTO, слои в DDD] · 2025-02-09 · YouTube
- «Доменная логика очень редко бывает активной. Карточка больного — модель информационного представления, не самого больного».
- DTO нужен на границе между модулями — снижает зацепление, как интерфейс. В JS вместо DTO-классов часто используют схемы.
- 🎓 [DDD в JS/TS — где размещать бизнес-логику] · 2025-10-03 · YouTube
- «Поведение в 60-70% случаев — use cases или сервисы. Предметная область должна быть анемичной для информационных систем».
- 🎓 [UNION types и ORM, DTO, Query Builder] · 2025-12-17 · YouTube
- DTO — это форма объекта. V8 хорошо оптимизирует объекты со стабильной формой.