Бизнес-объекты - контейнеры или функциональные?[закрыто]

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

Вопрос

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

Пример - Возьмем объект customer, он, вероятно, содержит некоторые общие свойства (Name, Id и т.д.), должен ли этот объект customer также включать функции (Save, Calc и т.д.)?

Одна из линий рассуждений гласит, что отделите объект от функциональности (принцип единой ответственности) и поместите функциональность в уровень бизнес-логики или объект.

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

В наших последних двух проектах объекты были отделены от функциональности, но дебаты снова были подняты по новому проекту.Что имеет больше смысла?

Редактировать

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

Редактировать

Несмотря на то, что выборка ответов невелика, похоже, что большинство считает, что функциональность в бизнес-объекте приемлема до тех пор, пока она проста, но сохраняемость лучше всего размещать в отдельном классе / слое.Мы дадим этому шанс.Спасибо всем за вклад...

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

Решение

Объекты - это состояние и поведение вместе взятые.Если объект имеет разумное поведение (например, вычисляет возраст Человека по дате его рождения или общий налог для счета-фактуры), обязательно добавьте его.Бизнес-объекты, которые являются не чем иным, как DTO, называются "анемичной моделью предметной области". Я не думаю, что это требование дизайна.

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

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

Бизнес - объекты МОЖЕТ иметь бизнес-функциональность.

Постоянство - это не бизнес-функциональность , но является технической реализацией.

Короче говоря, длинная история:

  1. Сохранить / Обновить / Удалить / Найти и т.д. - держитесь подальше от бизнес-объектов на уровне сохранения.
  2. CalculateSalary, ApplyDiscount и т.д. Являются методами, связанными с бизнесом, и могут быть:
    1. методы бизнес-объектов (таким образом, BO является автономным представлением сущности) или;
    2. отдельные услуги реализация определенной функциональности (поэтому BO действуют больше как DTO).

Что касается пункта 2.
Я должен упомянуть, что подход 2.1 имеет тенденцию делать BOs слишком раздутым и нарушать SRP.В то время как 2.2 вводит больше технического обслуживания сложность.

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

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

Но все это облегчает разработку, тестирование и сопровождение проекта.

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

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

                          (Level of responsibility for behavior)
         Autonomy - - - - - - - - - - - - - - - - - - - Dependence  
      High
  C      -   <<GOD object>>                            <<Spaghetti code>>
  l      -
  a      -  
  s      -                                      
  s      -                 
         -                        
  s      -  
  i      -  
  z      -
  e      -  <<Template>>                                <<Framework>>
       low  

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

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

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

Только что написав это, я бы сказал, что существует корреляция между размером класса и степенью организации.Роберт К.Мартин (или "дядя Боб") рассматривает аналогичную тему с зависимостями пакетов в своей очень подробной статье о Принципы проектирования и шаблоны проектирования. JDepend ( Зависимость ) является реализацией идей, лежащих в основе графика на странице 26, и дополняет инструменты статического анализа такие , как Контрольный Стиль и PMD ( ПМД ).

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

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

Мы уже много лет используем CSLA-фреймворк Rocky Lhotka, и нам нравится, как он разработан.В этой структуре вся функциональность содержится в объектах.Хотя я вижу ценность разделения логики, я не думаю, что мы откажемся от этой философии в ближайшее время.

Бизнес-объекты должны быть предназначены для инкапсуляции данных и связанного с ними поведения бизнес-объекта, моделируемого этим объектом.Подумайте об этом так:одним из основных принципов объектно-ориентированного программирования является инкапсуляция данных и связанное с ними поведение в отношении этих данных.

Постоянство - это не поведение моделируемого объекта.Я нахожу, что разработка продвигается более гладко, если бизнес-объекты не знают о постоянстве.Разработка нового кода и модульное тестирование нового кода происходят быстрее и плавнее, если бизнес-объекты специально не привязаны к базовому интерфейсу.Это потому, что я могу высмеивать эти аспекты и забыть о необходимости проходить через обручи, чтобы добраться до базы данных, и т.д.Мои модульные тесты будут выполняться быстрее (огромный плюс, если у вас есть тысячи автоматизированных тестов, которые выполняются с каждой сборкой), и у меня будет меньше стресса, потому что у меня не будет сбоев тестов из-за проблем с подключением к базе данных (отлично, если вы часто работаете в автономном режиме или удаленно и не всегда можете получить доступ к своей базе данных, и, кстати, эти аспекты (подключение к базе данных и т.д.) Следует протестировать в другом месте!).

Другая линия рассуждений гласит: "нет, если у меня есть объект customer, я просто хочу вызвать Customer.Save и покончи с этим.Зачем мне нужно знать о том, как сохранить клиента, если я использую объект?

Зная , что Customer имеет Save метод уже знает, как сохранить объект customer .Вы не избежали проблемы, внедрив эту логику в свой бизнес-объект.Вместо этого вы сделали свою кодовую базу более тесно связанной и, следовательно, более сложной в обслуживании и тестировании.Переложите ответственность за сохранение объекта на кого-то другого.

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

С другой стороны, может ли BO быть композицией и методами контейнера данных (DTO?);имеется в виду, что BO являются чисто функциональными?Это позволило бы избежать всех преобразований между BO и DTO.

В архитектуре MVC,

Можем ли мы сказать, что Модель содержит бизнес-объекты.

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