Насколько единственной принцип ответственности относится к анемичной/богатой доменной модели?

StackOverflow https://stackoverflow.com/questions/8808314

Вопрос

В настоящее время в проведении некоторого обзора кодекса, взятых из другой команды, и имеют одно сомнение в применении SRP и его связи с анемичной или богатой доменной моделью (как определено Мартином Фаулером). Концепция Rich Domain Model состоит в том, чтобы иметь интеллектуальный объект, который может не только установить/получить свои свойства, но и может выполнить более сложную бизнес -логику. Я задаюсь вопросом, как это вписывается в SRP?

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

class MyObject {
    // get set
    // parse sth

}

Метод хранения в хранении

   storage.store(key, object);

Разве это не нарушает SRP, если у MyObject есть метод хранилища, подобный этому

public void store(Storage storage) {
    storage.store('keyOne', fieldOne);
    storage.store('keyTwo', fieldTwo);
}

Из POV этого объекта это хорошая мысль, чтобы иметь возможность хранить свое состояние. Другим способом может быть представление здесь своего рода услуги и сделать это так:

public StorageService {
    private Storage;
    // constructor here
    ....
    public void store(MyObject myobj);
}

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

Как это разрешено в DDD? Модели в DDD по определению богаты и могут рассматриваться как слишком много обязанностей.

Это было полезно?

Решение

Богатая доменная модель (Rdm) означает, что логика управление моделью поведение принадлежит в модели, в отличие от обращения с моделью, как данные, с помощью Getters/Setters. Это делает нет Означает все, включая настойчивость, безопасность, как отобразить модель в графическом интерфейсе и т. Д.

RDM и SRP идут рука об руку, они не конфликтуют друг с другом.

Нарушение SRP/RDM:

Car {
   // possibly violates SRP
   storeInDatabase();  
   // smells like anemic domain model
   getEngineState();   
}

Следуя SRP/RDM:

// usings aspects to remove cross-cutting concerns from the model and follow SRP
@DatabaseSerializable 
Car {
   // rich domain model encapsulates engine state and exposes behavior
   drive();            
}

Другие советы

«Модели в DDD по определению богаты и могут рассматриваться как слишком много обязанностей» это упрощенная интерпретация DDD. Всегда это зависит от того, насколько хороши ваши модели. Вы можете создавать плохие модели, используя DDD (например, создание объектов со слишком большим количеством ответственности или создание анемических моделей). DDD и SRP - это две хорошие практики, так же, как рефакторинг, TDD и многие другие, но вы должны дополнить их использование своим опытом и суждением (или чужой). У всего есть свои плюсы и минусы, не будьте догматичны в отношении применения какой -либо практики.

@Garrett Hall

Я несколько не согласен с вашим заявлением: «RDM и SRP идут рука об руку, они не конфликтуют друг с другом». По моему опыту, когда SRP переоценен, это приводит к модели анемичной домены. «Нет, мы не можем сделать или даже помочь поддержать какую-либо настойчивость, нет, мы не можем сделать 21-CFR11, нет, мы даже не можем знать, что такое графический интерфейс ...» и ваш класс заканчивается ничего такого И просто иметь модель анемичной области.

И если RDM переоценен (это направление/ошибка, в которую я склонен падать), то SRP полностью падает на обочине, и вы в конечном итоге заметите, что в вашем классе есть 100 -х годов и явно слишком много делает.

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

"Познай себя". Если вы похожи на меня и склонны к чрезмерно сложным классам, имейте в виду. И когда вы видите чужой класс, который выглядит слишком сложным даже для вас, это большой красный флаг. Точно так же, если вы знаете, что вы довольно жестко о SRP, и вы видите класс, который выглядит анемичным даже по вашим стандартам, это основной запах кода.

Теперь, несколько отвечая на вопрос OP о хранении, я думаю, что многое зависит от того, насколько стабильно, стандартное и абстрактное хранилище. Если хранилище была какой -то стандартной абстракцией XML, CSV или RDB, у меня абсолютно нет проблем с объектами, зная, как хранить себя.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top