Модель анемичной области: плюсы и минусы - PullRequest
75 голосов
/ 03 ноября 2008

Я хотел бы знать, каковы плюсы и минусы использования модели анемичного домена (см. Ссылку ниже).

Фаулер Артикул

Ответы [ 16 ]

128 голосов
/ 01 мая 2011

Поскольку «модель анемичной области» является анти-шаблонной, почему существует так много систем, которые реализуют это?

Я думаю, что есть несколько причин

1. Сложность системы

В простой системе (которая содержит почти все примеры и примеры кода, которые вы можете найти в Интернете), если я хочу реализовать:

Добавление товара в заказ

Я поставил эту функцию на Заказ

public void Order.AddOrderLine(Product product)
{
    OrderLines.Add(new OrderLine(product));
}

Хороший и супер ориентированный на объект.

Теперь давайте скажем, что мне нужно убедиться, что мне нужно проверить, что товар существует в инвентаре, и выбросить исключение, если его нет.

Я больше не могу ставить его на заказ, так как не хочу, чтобы мой заказ зависел от инвентаря, поэтому теперь он должен перейти на службу

public void OrderService.AddOrderLine(Order order, Product product)
{
    if (!InventoryService.Has(product)
       throw new AddProductException

    order.AddOrderLine(product);
}

Я также мог бы передать IInventoryService в Order.AddOrderLine, что является еще одним вариантом, но все равно делает Order зависимым от InventoryService.

В Order.AddOrderLine все еще есть некоторая функциональность, но обычно она ограничена областью заказа, хотя, по моему опыту, бизнес-логика выходит за рамки объема заказа.

Когда система представляет собой нечто большее, чем просто CRUD, в итоге вы получите большую часть своей логики в OrderService и очень мало в Order.

2. Взгляд разработчика на ООП

В интернете много горячих дискуссий о том, какая логика должна применяться к сущностям.

что-то вроде

Order.Save

Должен ли Порядок знать, как себя спасти или нет? Допустим, у нас есть хранилища для этого.

Теперь можно заказать добавить строки заказа? Если я попытаюсь разобраться в этом, используя простой английский, это тоже не имеет смысла. Пользователь добавляет продукт в заказ, поэтому мы должны сделать User.AddOrderLineToOrder ()? Это похоже на излишество.

Как насчет OrderService.AddOrderLine (). Теперь это имеет смысл!

Мое понимание ООП состоит в том, что для инкапсуляции вы помещаете функции в классы, где функция должна будет получить доступ к внутреннему состоянию класса. Если мне нужен доступ к коллекции Order.OrderLines, я помещаю Order.AddOrderLine () в Order. Таким образом, внутреннее состояние класса не раскрывается.

3. Контейнеры IoC

Системы, в которых используются контейнеры IoC, обычно полностью анемичны.

Это потому, что вы можете тестировать свои сервисы / репозитории, которые имеют интерфейсы, но не могут тестировать доменные объекты (легко), если вы не установите интерфейсы на всех из них.

Поскольку «IoC» в настоящее время хвалят как решение всех ваших проблем с программированием, многие люди слепо следуют ему, и в результате получаются модели Anemic Domain Models.

4. ООП сложно, процедурно легко

У меня есть немного " Проклятие знания " на этом, но я обнаружил, что для новых разработчиков, имеющих DTO и Сервисы, намного проще, чем Rich Domain.

Возможно, это связано с тем, что с Rich Domain труднее узнать, на какие классы поместить логику. Когда создавать новые классы? Какие шаблоны использовать? и т.д ..

С сервисами без сохранения состояния вы просто добавляете их в службу с ближайшим именем.

36 голосов
/ 07 ноября 2008

Плюсы:

  • Вы можете утверждать, что это модель домена и хвастаться своим друзьям-разработчикам и поместите его в свое резюме.
  • Легко генерировать автоматически из таблиц базы данных.
  • сопоставляется с объектами передачи данных на удивление хорошо.

Минусы:

  • Ваша логика домена где-то существует иначе, вероятно, в классе, полном классовые (статические) методы. Или ваш графический интерфейс код. Или в нескольких местах, все с противоречивой логикой.
  • Это анти-паттерн, так что другие разработчики спросят, если вы понимать понятия объекта ориентированный дизайн.
20 голосов
/ 27 сентября 2011

После этого в моей голове уже долгое время была мысль. Я считаю, что термин «ООП» приобрел значение, которое на самом деле не предназначалось для него. Анаграмма означает «объектно-ориентированное программирование», как мы все хорошо знаем. Основное внимание, конечно, уделяется слову «ориентированный». Это не «OMP», что означает «объектно-ориентированное программирование». И ADM, и RDM являются примерами ООП. Они используют объекты, свойства, методы интерфейсов и так далее. Однако существует разница между ADM и RDM в том, как мы выбираем инкапсуляцию. Это две разные вещи. Сказать, что ADM плохой ООП, не является точным утверждением. Возможно, нам нужны разные термины для разных уровней инкапсуляции. Кроме того, мне никогда не нравился термин анти-паттерн. Это обычно назначается чем-то членами противостоящей группы. И ADM, и RDM являются допустимым шаблоном, они просто преследуют разные цели и предназначены для решения различных бизнес-задач. Те из нас, кто практикует DDD, должны, по крайней мере, ценить это и не опускаться до уровня других, избивая тех, кто решает внедрить ADM. Только мои мысли.

15 голосов
/ 28 февраля 2009

«Это анти-паттерн, поэтому другие разработчики спросят, понимаете ли вы концепции объектно-ориентированного дизайна».

«Модель анемичного домена - это анти-паттерн. У анти-паттернов нет плюсов».

Вопрос о том, является ли модель анемичной области анти-паттерном, является вопросом мнения. Мартин Фаулер говорит, что это так, многие разработчики, которые знают OO, говорят, что это не так. Изложение мнения как факта редко помогает.

И даже если бы это было общепринятым анти-паттерном, есть вероятность, что у него все еще будет некоторый (хотя и относительно небольшой) потенциал роста.

13 голосов
/ 03 ноября 2008

Мне кажется, что основным возражением Фаулера является то, что ADM не являются ОО, в следующем смысле. Если проектировать систему «с нуля» вокруг пассивных структур данных, которыми манипулируют другие фрагменты кода, то это, безусловно, пахнет скорее процедурным дизайном, чем объектно-ориентированным проектированием.

Я полагаю, что есть как минимум две силы, способные создать такой дизайн:

  1. Дизайнеры / программисты, которые все еще считают процедурно необходимым работать в объектно-ориентированной среде (или предполагают, что могут ...) для создания новой системы и

  2. Разработчики, работающие над созданием сервис-подобного "лица" в устаревшей системе , разработанной не в режиме OO (независимо от языка).

Если, например, кто-то создает набор служб для предоставления функциональных возможностей существующего приложения COBOL для мэйнфреймов, можно определить службы и интерфейсы с точки зрения концептуальной модели, которая не отражает внутреннее Структуры данных COBOL. Однако, если служба отображает новую модель на устаревшие данные, чтобы использовать существующую, но скрытую реализацию, то новая модель вполне может быть «анемичной» в смысле статьи Фаулера - например, набор определений и отношений в стиле TransferObject без реального поведения.

Этот тип компромисса вполне может быть обычным для границ, на которых идеалистически чистые ОО-системы должны взаимодействовать с существующей, не ОО-средой.

7 голосов
/ 12 мая 2011

Модель анемичного домена (ADM) может быть хорошим выбором, если ваша команда не может или не хочет создавать модель расширенного домена (RDM) и поддерживать ее в течение долгого времени. Победа с RDM требует тщательного внимания к доминирующим абстракциям, используемым в системе. Представьте, что в любой группе разработчиков не более половины и, возможно, только одна десятая ее членов компетентны в абстракциях. Если этот персонал (возможно, только один разработчик) не сможет поддерживать влияние на деятельность всей группы, РДМ уступит энтропии.

И энтропийная РДМ, в частности, вредит. Его разработчики будут усваивать суровые уроки. Сначала они смогут оправдать ожидания своих заинтересованных сторон, потому что у них не будет истории, чтобы соответствовать. Но поскольку их система становится более сложной (не сложной) , она становится хрупкой; разработчики попытаются повторно использовать код, но, как правило, приводят к появлению новых ошибок или отклонений в процессе разработки (и, таким образом, превышают их оценки).

Напротив, разработчики ADM будут устанавливать более низкие ожидания для себя, потому что они не ожидают повторного использования такого большого количества кода для новых функций. Со временем у них будет система с множеством несоответствий, но она, вероятно, не сломается. Их время выхода на рынок будет больше, чем при успешном RDM, но их заинтересованные стороны вряд ли осознают эту возможность.

5 голосов
/ 05 мая 2009

"Разработчики, работающие над созданием сервис-подобного" лица "в унаследованной системе, разработанной не-OO-способом (независимо от языка)."

Если вы думаете о многих LOB-приложениях, эти устаревшие системы часто не будут использовать ту же модель домена, что и вы. Модель Anemic Domain решает эту проблему с использованием бизнес-логики в классах обслуживания. Вы можете поместить весь этот интерфейсный код в вашу модель (в традиционном смысле ОО) - но обычно вы теряете модульность.

4 голосов
/ 21 июня 2012

Когда я впервые наткнулся на статью об Анемичной модели предметной области, я подумал: "Святой, черт возьми, вот что я делаю. Ужас!" Я выстоял и следовал ссылкам на книгу Эрика Эвана, считался хорошим примером и загружал источник. Оказывается, что «не использование модели анемичной области» не означает «не использование классов обслуживания, не использование посредников, не использование стратегий» или даже «наложение логики на класс, которым манипулируют».

Примеры DDD имеют классы обслуживания, XyzUpdaters, синглтоны и IoC.

Меня смущает, что именно представляет собой модель анемичной области. Я ожидаю, что "я узнаю это, когда увижу это". Пока я доволен положительным примером хорошего дизайна.

3 голосов
/ 09 ноября 2010

Это то же самое про, что и с большинством анти-паттернов: оно позволяет вам долго держать людей занятыми. Поскольку менеджерам, как правило, платят больше, когда они управляют большим количеством людей, существует сильный стимул не улучшаться.

1 голос
/ 26 марта 2017

Поработав со «зрелой» системой с ADM, я чувствую, что могу дать хотя бы некую неофициальную информацию по этому вопросу.

1) Отсутствие инкапсуляции

В действующей системе с ADM есть возможность написать, например, obj.x = 100; obj.save ', даже если это нарушает бизнес-логику. Это приводит к ряду ошибок, которые не встретились бы, если бы инварианты были смоделированы на объекте. Это серьезность и распространенность этих ошибок, которые я считаю самым серьезным негативом для ADM.

Мне кажется важным отметить здесь, что именно здесь функциональное решение и процедурные решения ADM значительно различаются, и любые сходства, которые другие могут привлечь к поверхностному сходству между ADM и функциональным решением, являются случайными.

2) Код блат

Я предполагаю, что объем кода, создаваемого в ADM, в 5-10 раз больше, чем было бы создано решением OOP / RDM. Это объясняется, возможно, 50% повторением кода, 30% кодом котельной плиты и 20% решением или решением проблем, возникающих из-за отсутствия RDM.

3) Плохое понимание проблем домена

ADM и плохое понимание проблем предметной области идут рука об руку. Возникают наивные решения, требования плохо учитываются из-за сложности поддержки их существующим DM, а ADM становится существенным барьером для инноваций в бизнесе, учитывая более длительные сроки разработки и отсутствие гибкости.

4) Сложность обслуживания

Требуется определенный уровень строгости, чтобы гарантировать, что концепция домена изменяется во всех местах, где она выражена, учитывая, что концепция может быть не просто повторной реализацией копирования и вставки. Это часто приводит к тому, что одни и те же ошибки исследуются и исправляются несколько раз.

5) Повышенная сложность при посадке

Я думаю, что одно из преимуществ RDM - это сплоченность концепций, которые позволяют быстрее понять предметную область. С ADM концепции могут быть фрагментированы и им не хватает ясности, поэтому новым разработчикам будет сложнее их приобрести.

Мне также хотелось включить расходы на операционную поддержку для ADM, которые выше, чем для RDM, но это будет зависеть от ряда факторов.

Как уже отмечали другие, посмотрите на DDD (Грег Эванс, Винс Вон и Скотт Миллетт), чтобы узнать о преимуществах RDM.

...