Предположим, вы пишете некоторый код для решения сложной бизнес-задачи. Если у вас анемичная модель предметной области, чем
, то ваши объекты вряд ли будут иметь какое-либо поведение, делая их немного больше, чем мешки добытчиков и установщиков. [..] Вместо этого есть набор сервисных объектов, которые захватывают всю логику домена, выполняя все вычисления и обновляя объекты модели с результатами.
Очень простой пример доступен на Wiki :
Анемичный
class Box
{
public int Height { get; set; }
public int Width { get; set; }
}
Не анемичный
class Box
{
public int Height { get; private set; }
public int Width { get; private set; }
public Box(int height, int width)
{
if (height <= 0) {
throw new ArgumentOutOfRangeException(nameof(height));
}
if (width <= 0) {
throw new ArgumentOutOfRangeException(nameof(width));
}
Height = height;
Width = width;
}
public int Area()
{
return Height * Width;
}
}
Вы также можетевзгляните на репозиторий IDDD_Samples на GitHub с примерами ограниченного контекста из книги «Реализация доменного дизайна» Вона Вернона. Там есть много хороших примеров.
Скрытие внутренних частей объекта защищает его целостность, не давая пользователям переводить внутренние данные компонента в недопустимое или несовместимое состояние. Если ваша бизнес-проблема сложна и у вас анемичная модель, ваш код быстро станет неуправляемым. Добавление новых функций даст вам головную боль и будет длиться дольше и дольше. Код будет нечитаем и не подлежит тестированию.
Также подробнее о модели анемичного домена на сайте Мартина Фаулера .