Ответ
Анемичная модель (Anemic Domain Model) — это антипаттерн объектно-ориентированного проектирования, при котором классы модели данных содержат только свойства (данные) и методы доступа к ним (геттеры/сеттеры), а вся бизнес-логика вынесена в отдельные сервисные классы. Это нарушает базовый принцип ООП — инкапсуляцию данных и поведения в одном объекте.
Проблемы анемичной модели:
- Нарушение инкапсуляции: Модель становится "тупым" контейнером для данных.
- Распыление логики: Бизнес-правила размазываются по множеству сервисов, что усложняет их понимание и поддержку.
- Сложность тестирования: Для тестирования простого правила необходимо создавать моки сервисов.
- Риск несогласованного состояния: Сервисы могут менять объект, не соблюдая его внутренние инварианты.
Пример анемичной модели (Swift):
// Анемичная модель — только данные
struct User {
var name: String
var age: Int
}
// Логика вынесена в сервис
class UserService {
func isAdult(user: User) -> Bool {
return user.age >= 18
}
}
Исправленная (богатая) модель:
// Богатая модель инкапсулирует и данные, и поведение
struct User {
var name: String
private(set) var age: Int // Возможен контроль за изменением
var isAdult: Bool {
return age >= 18
}
mutating func haveBirthday() {
age += 1
}
}
// Использование
var user = User(name: "Alice", age: 17)
print(user.isAdult) // false
user.haveBirthday()
print(user.isAdult) // true
Вывод: Анемичную модель стоит использовать осознанно (например, для простых DTO), но в предметной области (Domain Layer) предпочтительна богатая модель, которая обеспечивает лучшую инкапсуляцию, сопровождаемость и тестируемость.