Анемичная модель и 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 хорошо оптимизирует объекты со стабильной формой.

См. также