Подходит ли анемия домена в сервис-ориентированной архитектуре? - PullRequest
14 голосов
/ 04 мая 2010

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

Это вопрос, который мне приходилось задавать себе недавно после работы над проектом, в котором модель «предметной области» на самом деле является моделью постоянства; ни один из объектов домена не содержит никаких методов, и это очень намеренное решение.

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

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

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

Ответы [ 7 ]

5 голосов
/ 28 июля 2010

Я считаю, что анемичный домен, в то время как анти-паттерн OO, на самом деле является паттерном SOA. Правила немного изменились, так как мы повысили уровень абстракции.

Я продолжаю исследовать серию, которую я пишу, и в прошлом году у меня тоже была разглагольствования об этом в моем журнале. metallemon.blogspot.com/2008/07/soa-and-anemic-domains.html

http://hubpages.com/hub/Building-Service-Orientated-Architecture

5 голосов
/ 04 мая 2010

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

Вспоминая предыдущие проекты, я помню один, в котором использовались анемичные доменные объекты, у него было много проблем, в том числе ужасная доморощенная база данных xml, но, поскольку он основывался на сервисном подходе, было легко справиться с проблемами. по одному и сделать реальные успехи. В текущем проекте они пытались быть умными и привязывать доменные объекты к базе данных в стиле ActiveRecord, и не предпринимали никаких усилий для контроля их зависимостей. Тесная связь доменных объектов с базой данных, чрезмерное использование статических методов и подобная спагетти сеть зависимостей была большой частью того, что заставило эту кодовую базу стать преждевременно хрупким, негибким и непроверяемым шариком грязи. Поэтому я думаю, что, хотя невосприимчивые к объектам с расширенными возможностями доменные имена значительно упростят тестирование бизнес-логики, важно управлять своими зависимостями.

4 голосов
/ 20 января 2016

Шесть лет спустя, это требует серьезного обновления.

Простой ответ - да. Но сложный ответ - нет.

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

Проще говоря: ОО изначально определялся тем, как он отличался от своих предшественников. Более конкретно: C ++ определялся тем, как он отличался от C. Но определение ОО изменилось. Теперь у нас есть множество ОО Принципов.

Отказ от ответственности: многие из этих принципов были частично или полностью созданы до ОО и были просто востребованы или обновлены во время ОО-революции. Кроме того, я понимаю, что ОО был для LONG-Before C ++, но это не меняет мое утверждение:

Инкапсуляция, Наследование, Полиморфизм, Разделение проблем, Невосприимчивость к постоянству, Высокая сплоченность / Низкая связь, S, O, L, I, D и многие другие.

Не только это, но если вы следуете DDD и / или TDD, следуя этим принципам, вам почти не придется создавать архитектуру вообще. Просто следуя этим принципам, вы естественным образом получаете сервис-ориентированную архитектуру, в которой используются анемичные доменные модели.

Подумай об этом. Если у вас есть класс Employee с Save(), SendMessage() и PayEmployee() ..., вы нарушаете так много правил действующих Принципов ОО.

Когда вы анализируете и распределяете определенные обязанности в различных службах, хранилищах, командах, фабриках и т. Д. ... Вы не можете помочь , но у вас есть пустой класс сотрудника ... вроде.

Вроде?

Честно говоря, вам нужно помнить идею объектов значения. Понятие ОО не только эволюционировало, но и понятие «Анемия» также эволюционировало. Класс Employee, безусловно, не должен быть пустым. В нем может быть много «бизнес-логики».

Класс Employee может иметь:

  • Параметризованный конструктор, где параметры проверяются
  • Только для чтения Свойства, вычисляющие поля
  • Employee.ToString (), Employee.TryParse () и аналогичные методы объекта
  • Возможно, другие, специфичные для сотрудника

По сути, Сотрудник все еще страдает анемией. , конечно, никогда не будет никаких алгоритмов или логики потока кода в модели предметной области. Но не существует только одного вида бизнес-логики.

Когда Мартин Фаулер сказал, что модели анемичных доменов были анти-паттерном более десяти лет назад, он уже становился все более и более жизнеспособным. Его рассуждение было двояким, и оба раза - старые новости.

Его первым сгибом было то, что его защитное определение ОО состояло в том, что Код и Данные были женаты или «объединяли данные и обрабатывали вместе», в отличие от старого процедурного стиля. К сожалению, это верно только для плохого кода. Если мы следуем Наследованию и Полиморфизму, мы знаем, что функции ДЕЙСТВИТЕЛЬНО не живут в классе. Они живут по указателям, так что наследующие классы могут переопределять и перемещать их. Но ... они живут в коде, чтобы улучшить читаемость? Они, конечно, не должны! Они должны быть определены в интерфейсах и абстракциях и реализованы только в классах. Извините, Мартин, но в то время, как вы были правы, брак по коду / данным был огромным оригинальным аргументом в пользу ОО 2 десятилетия назад, но сейчас это не так уж и много.

Его второе замечание состояло в том, что он дисквалифицирует SOA как неправильно выполненную и указывает на некоторые описания, которые очень похожи на то, что мы сегодня называем N-Tiered Architecture. Конечно, я понимаю, что это не новая технология, но определения менялись с годами.

Не только Мартин Фаулер, но и многие другие после него немедленно цитировали его статью и поэтому заявили, что SOA сама по себе является анти-паттерном, потому что она требует анемичных моделей, что, по словам Фаулера, является анти-паттерном.

Итак, мы до этого ...

Анемичные доменные модели на самом деле не такие анемичные, как полагают люди. И SOA требуется, мы не можем сбрасывать со счетов это. К сожалению, это просто так.

Почему требуется SOA? - Это слишком наглядно. Но короткая история: в 90-х годах доменное программное обеспечение работало на ПК и серверах ... и аппаратное обеспечение "подключено" к этим монолитам. В наши дни вокруг нас буквально триллионов"компьютеров". Детекторы дыма, холодильники, часы, телефоны ... В наши дни Компьютеры подключаются к вещам . Таким образом, каждая идея, отдел, CONCERN и объект - это свой маленький домен. Мы требуем, чтобы SOA записывал их в свои собственные маленькие сервисы и даже подуслуги.

Следовательно: приложения теперь подключаются к службам (вместо служб подключаются к приложениям). Чтобы создать SOA, мы просто следуем действующим правилам OO, таким как SOLID и Разделение проблем. И когда мы делаем это, мы естественным образом получаем модели анемичных доменов ... Сорта.

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

3 голосов
/ 05 мая 2010

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

2 голосов
/ 04 мая 2010

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

1 голос
/ 28 июля 2010
1 голос
/ 04 мая 2010

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

Затем наступила реальность: мое представление об адресе не всегда совпадает с чужим. Хуже того, моя концепция адреса может меняться в зависимости от системы, над которой я работаю сегодня. И это просто.

И стало еще хуже. Наследование? Что это такое? Абстрактное, виртуальное ... просто ключевые слова, которые нужно вставить в код, чтобы закрыть компилятор.

И еще хуже: шаблоны кода. Нужно проверить объект? просто используйте этот вспомогательный шаблон здесь ...

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...