Моделі анемічних доменів та введення доменних служб


19

Модель анемічного домену описується Мартіном Фаулером як анти-модель у дизайні, керованому доменом. Щоб мати ділову логіку на доменних моделях, часто використовують доменні служби. Але введення доменних служб у доменні моделі вважається шкідливим Вон Верноном (див. "Впровадження дизайну, керованого доменом", Сторінка 387).

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

Це дійсно багата доменна модель із введеними доменними службами порівняно з анемічною моделлю домену та звичайними доменними послугами ?


4
Я аж ніяк не експерт з цього питання, але я вважав, що тип логіки, що входить до доменних служб та доменних об'єктів, принципово відрізняється. Логіка, яка переходить в Сутності, - це логіка, необхідна для підтримання об'єкта у правильному стані. Це включає логіку перевірки та перетворення. Доменні служби, з іншого боку, призначені для логіки вищого рівня. Так, наприклад, доменна служба змоделювала б бізнес-процес, що включає декілька різних типів суб'єктів, є складними способами.
MetaFight

2
@MetaFight: Навіть якщо бізнес-процес складними способами впливає на декілька суб'єктів, ви можете досягти цього без служб, що надають хорошу модель домену Aggregate Root, тобто модель домену, яка має доступ до всіх уражених об'єктів як властивості або поля на собі.
Грег Бургхардт

Це має сенс :)
MetaFight

Відповіді:


16

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

Якщо у вас є анемічна модель, ви не повністю використовуєте те, що пропонує OOP. Якщо ви почнете вводити служби в ці моделі, ви, швидше за все, додаєте проблеми, які там не належать. Або це, або ваша модель більш анемічна, ніж ви думаєте. Чому б ще вам потрібна послуга, крім того, що вона пропонує щось необхідне, але відсутнє? (Відсутність може означати анемію.)

Уникнення обох "розповідей" призводить до більш міцного дизайну. Чи є у вас щось у сервісі, яке потребує модель? Можливо, це слід перенести на модель. Якщо ні, можливо, вам слід переглянути свої проблеми. Поведінка моделі повинна працювати всередині моделі. Він повинен головним чином (якщо не тільки) стосуватися себе членів. Але пам’ятайте, все одно знайдуться речі, які працюють над моделлю або з нею. Наприклад, моделі не повинні відкривати TCP-з'єднання або слухати події в інтерфейсі, навіть якщо вони якось пов'язані. Це чужа відповідальність і за те, що хтось ніколи не належить всередині моделі.


7
Я хотів би пам’ятати, що Ваша Доменна модель реалізує логіку бізнесу, а Ваші доменні служби виконують бізнес-логіку на Моделях домену. Різниця в тому, хто кого дзвонить. Служби можуть викликати методи Доменної моделі. Якщо доменні моделі викликають сервісні методи, ви перевернули шаблон зверху голови.
Грег Бургхардт

7

Це не суперечливо. Обидва учасники хотіли б, щоб ви ввели свій фактичний код у сам об’єкт домену.

тобто.

public class Order
{
    private string status = "not bought";
    public void Buy()
    {
        this.status = "bought";
    }
}

проти ADM

public class Order
{
    public string Status = "not bought";
}

public class BuyingService
{
    public Order Buy(Order order)
    {
         Order o = new Order();
         o.status = "bought";
         return o;
    }
}

проти введених послуг

public class Order
{
    public Order(IBuyingService bs)
    {
        _bs = bs;
    }
    private IbuyingService _bs;
    private string status = "not bought";
    public void Buy()
    {
        this.status = _bs.Buy();
    }
}

public class BuyingService : IBuyingService
{
    public string Buy()
    {
         return = "bought";
    }
}

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.