Анемічна модель домену: плюси / мінуси


Відповіді:


39

Плюси:

  • Ви можете заявити, що це модель домену, похвалитися друзями-розробниками та розмістити її у своєму резюме.
  • З таблиць баз даних легко генерувати автоматично.
  • Він напрочуд добре відображається в об’єктах передачі даних.

Мінуси:

  • Логіка вашого домену існує десь ще, ймовірно, у класі, повному класу (статичних) методів. Або ваш графічний інтерфейс. Або в кількох місцях, все з суперечливою логікою.
  • Це анти-шаблон, тому інші розробники запитають, чи розумієте ви поняття об’єктно-орієнтованого дизайну.

7
+1 Момент генерування коду з таблиць баз даних дуже важливий для деяких людей. Якщо ви перебуваєте в режимі швидкого прототипування, автоматична генерація коду надзвичайно корисна. Ми не прикидаємось, що це правильний дизайн ОО, і якщо об’єднати речі недбало, це створює "технічний борг". Тим не менш, у багатьох проектах час виходу на ринок є вищим пріоритетом.
Білл Карвін,

62
Ні. Чи є анемічна модель анти-зразком - це питання думки. Фаулер (чию роботу я поважаю і, як правило, дотримуюсь), каже, що це так. Я не згоден (не те, що моє слово має якусь вагу), і багато хто в окопах ОО також не погоджуються. Моделювання чистого ОО не застосовується в усіх випадках, про що знає вся галузь з досвіду. Крім того, анемічна модель все ще може дотримуватися вказівок щодо моделювання ОО. Тож бачення конкретних випадків, коли хтось подає заявку, не ставить під сумнів розуміння дизайну ОО.
luis.espinal

12
Чи є який-небудь шаблон анти-шаблоном - це питання думки. Надійна модель домену - це хороший дизайн ОО, а анемічна модель домену - поганий дизайн ОО. Тому в контексті ОО це анти-шаблон. Це не означає, що воно не звикає або є недоречним у всіх випадках, але з особистого досвіду я вважаю це гіршим за одиночну залежність.
Террі Вілкокс,

7
Я відчуваю, що існує тенденція до функціонального програмування, і модель домену, як правило, має багато побічних ефектів. Я відчуваю, що анемічна модель домену повертається, оскільки вона дозволяє більш функціональний стиль програмування, коли ваша бізнес-логіка очікує отримання даних та повернення оброблених даних. Ваш рівень обслуговування контролює потік всього цього, знаючи, які дані потрібно обробити яким методом бізнес-логіки.
Didier A.

2
@TerryWilcox Ну, я не є функціональним експертом, але функціональне програмування також має структури даних. Анемічна модель домену використовує об’єкт просто як контейнери даних, вони більше схожі на структури. Моя думка полягає в тому, що за допомогою ADM ви можете перейти до більш функціонального шляху, де у вас є незмінні дані, які з часом трансформуються в нові та нові стани. Я бачу, як це робиться в Scala, наприклад, намагаючись використати трохи ООП і застосувати до нього деякий FP. Трохи схоже на те, що вони пояснюють це тут: slideshare.net/debasishg/qconny-12
Didier A.

131

Оскільки "Анемічна модель домену" є анти-шаблоном, чому існує так багато систем, які реалізують це?

Думаю, причин є кілька

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 і дуже мало в порядку.

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

В Інтернеті є багато бурхливих дискусій щодо того, яка логіка повинна йти на сутності.

Щось на зразок

Замовити. Зберегти

Чи повинен Орден знати, як врятувати себе чи ні? Скажімо, у нас є сховища для цього.

Тепер замовлення може додати рядки замовлення? Якщо я намагаюся зрозуміти це, використовуючи просту англійську мову, це насправді теж не має сенсу. Користувач додає Продукт до Замовлення, тож ми повинні робити User.AddOrderLineToOrder ()? Це здається надмірним.

Як щодо OrderService.AddOrderLine (). Тепер це має сенс!

Я розумію ООП полягає в тому, що для інкапсуляції ви ставите функції в класи, де функція потребуватиме доступу до внутрішнього стану класу. Якщо мені потрібно отримати доступ до колекції Order.OrderLines, я розміщую Order.AddOrderLine () на Order. Таким чином внутрішній стан класу не виявляється.

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

Системи, що використовують контейнери IoC, як правило, повністю анемічні.

Це тому, що ви можете протестувати свої служби / сховища, які мають інтерфейси, але не можете перевірити об’єкти домену (легко), якщо ви не встановите інтерфейси на всіх них.

Оскільки "IoC" в даний час оцінюється як вирішення всіх ваших проблем програмування, багато людей сліпо дотримуються його, і таким чином в кінцевому підсумку виходять моделі Anemic Domain.

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

У мене є трохи " Прокляття знань " з цього приводу, але я виявив, що для нових розробників використання DTO та служб набагато простіше, ніж Rich Domain.

Можливо, це тому, що з Rich Domain важче знати, на яких класах покласти логіку. Коли створювати нові класи? Які шаблони використовувати? тощо.

З послугами без громадянства ви просто ляпаєте їх у службу з найближчим іменем.


Думаю, це залежатиме від того, наскільки складним воно стане. 1. Якби це просто, як у 1-2 залежностях - я б тримав це в класі Order. 2. Якщо помірність складності - я б створив клас OrderLines і використовував Order.OrderLines для обробки зв'язку <-> OrderLines, а також пов'язаних із нею залежностей. 3. Але у випадку великої складності - я б використовував службу прикладних програм OrderService для забезпечення більшості зовнішніх залежностей, зберігаючи при цьому будь-яку логічну модульну схему замовлення в порядку.
Eric P

13
Прекрасне резюме - усі ці причини є причиною того, що це не анти-шаблон. Відданість слов’ян О.О. Тепер додайте паралельно без проекції і спостерігайте, як ви зав'язуєте себе у вузли за допомогою стилю Фаулера Подивіться на компанії, які роблять паралелізм у масштабі (наприклад, Google), і подивіться, скільки вони роблять ОО.
DanH

Гарно сказано. Використовуючи Грааль, я не впевнений, що 3 ° призводить до анемії. Що стосується 1 °, то справді ви закінчуєте логіку переміщення на сервісному рівні в будь-якому нетривіальному додатку. Але я все ще маю домен-орієнтований підхід із використанням Grails. Що робить це насправді не настільки хорошим, оскільки ваш домен є вашим улюбленим місцем для логіки, але ви переміщуєте біти на один шар за потреби.
youri

4
Я не бачу кореляції IoC з анемією. Здається, це абсолютно не пов’язана проблема. Незалежно від того, реалізують інтерфейси ваших служб / сховищ АБО доменні об’єкти, нічого спільного з їх тестуванням. Швидше, ви тестуєте служби / сховища / об'єкти домену і відокремлюєте їх від їх залежностей, які самі реалізують інтерфейси. І чи правильно ви це робите, чи ні, я не бачу жодної кореляції з IoC.

2
Те, що стосується DDD, з яким я борюся з Grok, це ваш перший момент: "Коли система більше, ніж просто базовий CRUD, у вас опиняться більша частина вашої логіки в OrderService і дуже мало в порядку". Для мене це має сенс, але хіба мета DDD не може використовуватися для систем, які є більш складними?
Ден Лінг,

20

Після цього в мене в голові вже дуже давно виникає думка. Я переконаний, що термін "ООП" набув значення, не по-справжньому призначеного для нього. Як ми всі добре знаємо, анаграма означає "об'єктно-орієнтоване програмування". Фокус, звичайно, зосереджений на слові "орієнтований". Це не "OMP", що означає "програмоване програмування". І ADM, і RDM є прикладами ООП. Вони використовують об'єкти, властивості, інтерфейси методів тощо. Однак існує різниця між ADM та RDM у тому, як ми вирішили інкапулювати речі. Це дві різні речі. Сказати, що ADM поганий ООП, не є точним твердженням. Можливо, нам потрібні різні терміни для різних рівнів інкапсуляції. До того ж мені ніколи не подобався термін анти-шаблон. Зазвичай його призначають чомусь члени протиборчої групи. І ADM, і RDM є дійсним зразком, вони просто мають на увазі різні цілі і призначені для вирішення різних потреб бізнесу. Ті з нас, хто практикує DDD, повинні, принаймні, це оцінити, а не падати на рівень інших, розбиваючи тих, хто вирішив впровадити ADM. Тільки мої думки.


16

"Це анти-шаблон, тому інші розробники запитають, чи розумієте ви поняття об’єктно-орієнтованого дизайну".

"Анемічна модель домену є анти-шаблоном. Анти-шаблони не мають плюсів."

Чи є модель анемічного домену анти-шаблоном, це питання думки. Мартін Фаулер каже, що так, багато розробників, які знають ОО навиворіт, кажуть, що це не так. Висловлення думки як факту рідко буває корисним.

Навіть якби це було загальновизнаним анти-шаблоном, є ймовірність, що він все одно матиме деякий (хоча і відносно невеликий) верх.


2
... які є? Я не намагаюся обдурити вас чи когось іншого, але мені справді цікаво щодо плюсів. Про мінуси згадували тисячу разів, але я все ще шукаю стійких плюсів ADM (окрім полемічних фраз).
struppi

6
... це схоже на те, що хтось намагається зіграти диявольського прихильника з невеликим шоу для цього. the chances are it would still have some (though relatively little) upside.Тоді назвіть, будь ласка! Принаймні один, замість гіпотези!
Сани

2
Легше знати, де належить якась логіка для всього, що не пов’язане з однокласним (будь-який реальний бізнес). Як сказано в інших місцях, "багата модель домену" в кінцевому підсумку має логіку в декількох місцях (сервісний рівень, кілька класів, що беруть участь в графіках об'єктів, ...). Крім того, RDM не дозволяє вам легко бачити всю бізнес-логіку, не дозволяє легко уникнути циклів і т. Д. Німі структури даних без логіки мають своє місце в додатку OO.
ymajoros

1
Я вважаю, що ця стаття дає вагомий
syclee

1
Антипаттерни завжди створюють проблеми, і ми успішно поставили кілька дещо великих додатків (2 або 3 роки розробки 10 розробників працюють> 300KLOC) з високоякісними рішеннями, що використовують шаблон, і не відчуваючи, що з ним щось не так, тому не може бути так погано, якщо він дозволяє створити хороший код під час його використання.
Ігнасіо Солер Гарсія

13

Мені здається, що головне заперечення Фаулера полягає в тому, що ADM не є ОО, у наступному сенсі. Якщо розробляти систему "з нуля" навколо пасивних структур даних, якими маніпулюють інші фрагменти коду, то це, безумовно, більше пахне процедурним дизайном, ніж об'єктно-орієнтованим дизайном.

Я припускаю, що існують принаймні дві сили, здатні створити такий дизайн:

  1. Дизайнери / програмісти, які досі вважають, що процедурно потрібно працювати в об'єктно-орієнтованому середовищі (або припускати, що вони можуть ...) для створення нової системи, і

  2. Розробники працюють над тим, щоб поставити сервісне "обличчя" на застарілу систему, розроблену за принципом, що не стосується ОО (незалежно від мови).

Якщо, наприклад, хтось будував набір служб, щоб викрити функціональність існуючого додатка COBOL на мейнфреймі, можна було б визначити служби та інтерфейси з точки зору концептуальної моделі, яка не відображає внутрішні структури даних COBOL. Однак якщо служба відображає нову модель із застарілими даними для використання існуючої, але прихованої реалізації, тоді нова модель цілком може бути "анемічною" у розумінні статті Фаулера - наприклад, набір визначень стилю TransferObject та стосунки без реальної поведінки.

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


8

Анемічна модель домену (ADM) може бути хорошим вибором, якщо ваша команда не може або не хоче створити розширену модель домену (RDM) та підтримувати її з часом. Перемога з RDM вимагає пильної уваги до домінуючих абстракцій, що використовуються в системі. Згадайте, що в будь-якій групі розробників не більше половини, а можливо, лише десята частина її членів компетентна з абстракціями. Якщо цей персонал (можливо, лише один розробник) не зможе зберегти вплив на діяльність всієї групи, RDM піддасться ентропії.

І ентропійний RDM болить, зокрема,. Його розробники засвоять суворі уроки. Спочатку вони зможуть відповідати очікуванням своїх зацікавлених сторін, тому що не матимуть жодної історії, щоб виправдати. Але в міру ускладнення їх системи (не складної) вона стає крихкою; розробники намагатимуться повторно використовувати код, але, як правило, спричинятимуть нові помилки або відстежуватимуть розвиток (і, таким чином, перевищуватимуть їх оцінки).

На відміну від цього, розробники ADM встановлюватимуть для себе нижчі очікування, оскільки вони не сподіваються повторно використовувати стільки коду для нових функцій. Згодом у них з’явиться система із багатьма невідповідностями, але вона, ймовірно, не розірветься несподівано. Їхній час виходу на ринок буде довшим, ніж при успішному RDM, але їх зацікавлені сторони навряд чи сприймуть таку можливість.


5

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

Якщо ви думаєте про багато додатків LOB, ці застарілі системи часто не використовуватимуть ту саму модель домену, що і ви. Anemic Domain Model вирішує це за допомогою бізнес-логіки в класах обслуговування. Ви можете розмістити весь цей інтерфейсний код всередині вашої моделі (у традиційному розумінні ОО), - але, як правило, ви втрачаєте модульність.


1
Бінго. Тут, здається, багато людей сумують за човном. ADM мають свою мету. Їх неправильне використання є протидією, але вони самі не є.
luis.espinal

4

Коли я вперше натрапив на статтю про Anemic Domain Model, я подумав: "Holy s ***, ось що я роблю. Жах!" Я витримав і слідував за посиланнями на книгу Еріка Евана, який вважався хорошим прикладом, і завантажив джерело. Виявляється, "не використовувати анемічну модель домену" не означає "не використовувати класи обслуговування, не використовувати посередники, не використовувати стратегії" і навіть "накладати логіку на клас, яким маніпулюють".

Приклади DDD мають класи обслуговування, XyzUpdaters, одиночні та IoC.

Я все ще бентежусь, що саме таке анемічна модель домену. Я очікую, що "я це дізнаюсь, коли побачу". Наразі я задоволений позитивним прикладом гарного дизайну.


1
Згодом я придбав книгу Еріка Евана і настійно рекомендую її. Він наводить вагомі приклади протилежності анемічним моделям доменів.
jamie

4

Попрацювавши із "зрілою" системою з 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.


1
Чи є Грег Еванс таємною дитиною Грега Янга та Еріка Еванса? Я не знав, що Вінс Вон теж писав книги з DDD, але, можливо, Вон Вернон теж почав діяти :)
knittl

О боже, здається, моя пам’ять, коли я писав вище, була дещо заплутаною. Дякую, що
вказали

2

Це такий самий професіонал, як і у більшості анти-шаблонів: він дозволяє тривалий час зайняти багатьох людей. Оскільки менеджерам, як правило, платять більше, коли вони керують більшою кількістю людей, існує сильний стимул не вдосконалюватися.


7
У такому випадку дозвольте мені переформулювати це. ^^^ Суто анекдотичні докази, що використовуються для виведення загальнозвучного твердження.
luis.espinal

Коли ми знайдемо достатньо анекдотичних доказів, ми зможемо отримати закономірність. І ця закономірність добре відома та адекватно описана в літературі з питань управління змінами.
Stephan Eggermont

4
"І ця закономірність добре відома і адекватно описана в літературі про управління змінами". - Цитати, будь ласка. Точніше, кореляція не передбачає причинно-наслідкових зв’язків . Це означає, що лише тому, що ви бачите, як люди крутять свої тяганини через наявні анти-шаблони (зокрема, програмні шаблони та анемічні моделі доменів ), це не означає, що пізніше існує для виправдання першого, що є те, що ви щойно розтрубили. Риторичні гасла - це погана карикатура на пояснення складних питань. Тож знову ж таки, кореляція не означає причинно-наслідковий зв’язок.
luis.espinal

4
Можливо, ви захочете прочитати «Управління якісним програмним забезпеченням» Джеральда М. Вайнберга, особливо том 4. І я стверджую лише про можливу причину подальшого існування, а не для його виникнення. Принцип Петра забезпечує адекватну альтернативу.
Stephan Eggermont

Дякую, я прочитаю це, коли отримаю можливість (+1 за цитування). Чи ця книга представляє це як відомий анти-шаблон? На додаток до цього, чи претендує / демонструє не просто кореляція, а й причинність ? Зараз ви заявляєте про це як про «можливе» пояснення . Ваш оригінальний текст висловлює це як певність, з більшою риторикою, ніж деталізацією (саме тому я назвав це "чистою спекуляцією"). Тоді це був ваш намір , чи просто редакційна випадковість, хто знає, і я можу зробити висновок лише з того, що є в тексті на момент його прочитання.
luis.espinal

2

Відповідно до відповіді Еріка П, а також того, що писали деякі інші вище, здається, що головним недоліком ADM є втрата ООД, зокрема збереження логіки та даних концепції домену разом, щоб деталі реалізації були приховані, поки API може бути багатим.

Далі Ерік зазначає, що за межами класу домену часто є інформація, необхідна для логіки дії на цей клас, наприклад перевірка інвентаризації перед додаванням товару до замовлення. Однак я сумніваюся, чи відповідь - це рівень обслуговування, який містить цю всеосяжну логіку, чи його краще обробляти як частину дизайну об’єкта. Хтось повинен знати про об’єкт «Інвентаризація», «Продукт» та «Замовлення». Можливо, це просто об’єкт OrderSystem, який має члена Інвентаризації, список Замовлення тощо. Це не буде сильно відрізнятися від Послуги, але я думаю, що це концептуально більш узгоджено.

Або подивіться на це так: Ви можете мати Користувача з внутрішнім кредитним балансом, і кожен раз, коли викликається User.addItemToOrder (item), він отримує ціну товару та перевіряє кредит перед його додаванням тощо. Це здається розумним OO дизайн. Я не впевнений, що саме втрачено, замінивши це на Service.addItemToUserOrder (користувач, елемент), але я також не впевнений, що виграли. Думаю, втратою став би додатковий рівень коду, плюс незграбніший стиль написання та вимушене незнання базової Моделі Домену.


1

Слід зазначити, що у міру зростання систем у міру ускладнення та деталізації варіацій, інкапсуляція та консолідація точок інтерфейсу, які надає добре розроблена об'єктна модель передачі повідомлень, робить набагато безпечнішими зміни та підтримку критичного коду без широкого рефакторингу.

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

Я міг би також додати, що далеко не у всіх випадках потрібна модель домену (не кажучи вже про ADM). Іноді краще використовувати більш процедурний / функціональний стиль завдання, керований даними, і це не залежить від загально логічної логіки / бізнес-правил.

Якщо ви намагаєтесь визначитися з плюсами і мінусами цілого додатка, я думаю, важливо спершу розробити, як би міг виглядати кожен із них для вашої програми ДО того, як ви навіть почнете писати один рядок коду. Після того, як ви оформили CRC або встановили каркасну програму в обох стилях, зробіть крок назад і вирішіть, який із них має більше сенсу та краще підходить для програми.

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


1

Це дає кращу передбачуваність. Менеджерам це подобається, особливо якщо за проект витрачається час і матеріали. Кожна зміна означає багато роботи, тому складна робота може бути прихована за великою кількістю повторюваних робіт. У добре розробленій системі СУХОГО передбачуваність дуже погана, оскільки ви постійно робите нові справи.


1

Після того, як я вперше прочитав книгу Еріка Еванса про дизайн, керований доменом, я насправді не зрозумів, що це не просто купа тактичних зразків для створення хороших класів моделей доменів.

Дізнавшись більше про тему та використовуючи стратегічні зразки, я нарешті почав розуміти, що спочатку мова йде про глибоке розуміння ділових проблем, які ви намагаєтеся вирішити.

І лише після цього ви можете вирішити, які частини системи підходять для застосування тактичних зразків, таких як агрегати, сутності , сховища тощо, поряд із так званими розширеними моделями доменів (на відміну від анемічних ). Але для того, щоб скористатися цими закономірностями, має бути достатньо складнощів щодо бізнес-логіки для цієї частини системи .

Отже, коли справа стосується впровадження вирішення розглянутої проблеми, спочатку слід визначити, чи краще підходити до цієї конкретної проблеми з використанням підходу, заснованого на CRUD, чи інвестування в багату модель домену разом із згаданими тактичними моделями.

Якщо CRUD має більше сенсу, наприклад, якщо відсутня складна бізнес-логіка, і більша частина логіки пов'язана з перетворенням, передачею та збереженням даних, що реалізують модель домену, це може бути невимушеним надлишком. Це не означає, що роботи не буде багато, а просто не найбільше зусиль щодо впровадження дають ділові правила. Але в цьому випадку не існує такого поняття, як анемічна модель домену , просто тому, що доменної моделі взагалі немає . Ви, швидше за все, побачите такі речі, як DTO (Об'єкти передачі даних) або DAO(Об'єкти доступу до даних) та класи обслуговування, які будуть працювати з даними. І відповідні операції значною мірою пов'язані з перетворенням даних з одного подання в інше та переміщенням даних із дуже малою або майже відсутністю ділової логіки.

Якщо ви визначили, що існує багато складної бізнес-логіки, яка з часом також зміниться, ніж інвестування в модель домену - з мого досвіду - хороша ідея. Причина полягає в тому, що простіше представити бізнес-перспективу за допомогою коду та полегшити розуміння відповідних операцій, що відображають діловий домен та його правила. Це не означає, що в кожному випадку використання повинні існувати класи доменних моделей. Наприклад, якщо немає стану, який мутується та зберігається, також можуть бути лише служби домену, які містять логіку домену, реалізовані більше як чисті функції.

Але якщо існує також стан, який мутується і зберігається, що також має мету та значення в діловій сфері, держава та поведінка, що змінює цей стан, слід інкапсулювати . Зважаючи на це, ніхто не може обійти бізнес-правила настільки легко, що призводить до недійсних станів та серйозних збоїв. Так звані анемічні моделі доменів часто є джерелом таких проблем. . Це часто трапляється, якщо ви бачите код, де різні компоненти працюють в одному і тому ж «анемічному» класі доменної моделі, перевіряючи якусь частину його стану та змінюючи якусь частину його стану, не дбаючи про загальні інваріанти цього господарюючого суб’єкта. Не потрібно називати це анти-шаблоном, але важливо це розумітиВи втрачаєте багато переваг багатих моделей доменіву підході, заснованому на DDD, разом із згаданими проблемами. При використанні моделі домену, де поведінка та її дані розміщені в одному класі, також може бути безліч різних "клієнтів", що викликають операції цього класу, але їм не потрібно дбати про те, щоб ділові інваріанти суб'єкта господарювання дотримувались як клас доменної моделі завжди подбає про це, а також може повідомити "клієнта" про недійсні операції або навіть викинути винятки як мережу безпеки.

Так нижня лінія , я думаю , що це важливо не плутати структури даних , як класи (такі як DTOS або DAO , ) з анемією , класів моделі домену . У ретельно та навмисно підібраному підході, що базується на CRUD, немає переваг у спробі використовувати модель домену, оскільки існує занадто менш складна бізнес-логіка.

Під анемічною моделлю домену я б посилався на код, з якого я бачу, що існує багато складної бізнес-логіки та бізнес-правил, які розподілені між різними компонентами, які, швидше за все, повинні бути близькими до даних, які ця логіка змінює.

Є також ще один урок, який я вивчив по дорозі: якщо ви намагаєтесь використовувати ту саму ділову мову (яку також називають повсюдною мовою ) у своєму коді, яку стейкхолдери використовують у своєму щоденному робочому житті, ви вже здобуваєте стільки переваг щодо розуміння діловий домен та покращення читабельності коду, що настільки вам допоможе, незалежно від того, використовуєте ви підхід на основі CRUD або модель домену.


0

Щоб розширити відповідь Майкла, я вважав би (досить) зрозумілим, куди повинен йти цей код: у виділеному Посереднику, який обробляє взаємодію між Орденом та Інвентарем.

З мого POV головне в домені полягає в тому, що він ПОВИНЕН утримувати просту поведінку тестування, isInThisState()методи і т. Д. З мого досвіду вони також розпорошені по сервісі сльозами (sic :)) у більшості компаній, або копіюються, і нескінченно переписуються. Все це порушує стандартні правила згуртованості.

На мій погляд, підхід повинен полягати в тому, щоб прагнути до СД, що має настільки велику кількість бізнес-поведінки, наскільки це практично, а решту розміщувати у чітко відведених місцях (тобто не в послугах)


Річ у Медіаторі полягає в тому, що між ними та процедурним програмуванням дуже мало різниці; ви просто групуєте деякі функції, які не належать до жодного об'єкта. Той факт, що ви згрупуєте їх в інший об'єкт, не має великої різниці.
Роб Грант,

0

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

Перевага для нас від використання ADM порівняно з RDM можна побачити в тому, як ми зберігаємо об'єкти в db. Розробники, що працюють над нашими застарілими кодовими системами, можуть використовувати наші бізнес-об'єкти (з нової системи) і продовжувати використовувати свій поточний рівень доступу до даних, щоб зберегти ці об'єкти на базі даних. Використання RDM змусило б розробників нашої застарілої системи вводити об’єкти сховища в нашу бізнес-модель ... що не відповідало б їх поточному рівню доступу до даних.


-15

Модель анемією домену є анти-патерн. Антишаблони не мають плюсів.


10
Я не погоджуюсь. У більшості Антипаттернів є кутові кейси, в яких вони є кращим рішенням, ніж інші альтернативи.
Білл Карвін,

19
Антишаблони мають плюси. Тому люди ними користуються, хоча це, як правило, погані ідеї.
Крістофер Джонсон

6
Папуга, що щось є анти-зразком, як факт, коли це лише думка (навіть якщо це щось із калібру Фаулера), це не є дійсною формою відповіді.
luis.espinal

@luis: Якраз те, що я збирався написати, перш ніж побачив, як ти коментуєш. Крім того, існують інструменти, які служать меті. Якщо Фаулер не хоче називати це OO, це нормально. Але це не означає автоматичного поганого рішення / архітектури / тощо.
JensG
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.