Что такое анемичная модель (Anemic Domain Model) в ООП?

«Что такое анемичная модель (Anemic Domain Model) в ООП?» — вопрос из категории Архитектура, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Анемичная модель (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) предпочтительна богатая модель, которая обеспечивает лучшую инкапсуляцию, сопровождаемость и тестируемость.