Сколько логики должно быть в объектах модели вашего домена - PullRequest
15 голосов
/ 23 января 2009

Только что закончил читать этот пост Грега Янга, где он говорит о том, что Microsoft рекомендует шаблоны с тупыми объектами передачи данных. Он подразумевал, что в сообществе Java дела идут в другом направлении.

Мой вопрос: сколько логики должно быть в объектах вашей сущности? Наша философия, в которой я работаю (магазин C #), заключается в том, что если вы не можете сериализовать его, не помещайте его в сущность.

Ответы [ 5 ]

17 голосов
/ 23 января 2009

Матовый,

Я бы сказал, что ваш магазин пишет процедурный код. Я хочу пояснить, что нет ничего плохого в том, что многие большие системы (включая многие, над которыми я работал) были написаны с использованием процедурного кода. Для этого есть время и место.

Теперь процедурному коду нет места в модели предметной области. Если вы хотите использовать более процедурный стиль, который подойдет, но используйте его с чем-то вроде Table Module или Active Record pattern. Я полагаю, что не столько отсутствие ОО, как это разрушительно в руководстве, но использование модели предметной области с процедурной логикой.

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

Теперь, чтобы вернуться к тому, что такое «поведение», я бы хотел сосредоточиться на вопросе с объектно-ориентированной точки зрения, а не с точки зрения «доменного дизайна». Объект обычно инкапсулирует некоторое состояние и, как правило, демонстрирует некоторые варианты поведения.

быстрое повторение: инкапсулировать состояние, выставлять поведение

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

Customer c = GetCustomerFromRepository();
c.Status = CustomerStatuses.Deleted;
c.LastUpdated = DateTime.Now;
c.UpdatedBy = GetCurrentUser();
CustomerRepository.Save(c);

У нас есть нарушение SRP ... Этот код является кодом, который должен соответствовать поведению объекта клиента, поскольку "Ответственность" объекта клиента заключается в.

Инкапсулировать информацию о клиенте и раскрыть поведение.

Таким образом, мы видим, что было бы лучше иметь метод Customer.Delete (). (да, это плохой пример, я знаю ...)

Теперь мы бы также достигли этого, используя TDD. Нам гораздо легче иметь дело в тестах со швом, который обеспечивает поведение, чем со швами, где выставлено все состояние. Причина этого в том, что мне не нужно дублировать логику в моих тестах. Код клиента не заботится о том, как работает удаление ... он заботится только о том, чтобы клиент раскрыл поведение. Поэтому в наших тестах вместо того, чтобы утверждать, что c.State == CustomerStates.Deleted и c.UpdatedBy == GetCurrentUser () и т. Д., Мы просто утверждаем, что метод delete был вызван в шве клиента с использованием фиктивного значения.

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

Помогает ли это немного прояснить ситуацию?

Грег

4 голосов
/ 23 января 2009

Если вы называете их «объектами модели предметной области», тогда я предполагаю, что вы ссылаетесь на модель доменной модели Фаулера. http://martinfowler.com/eaaCatalog/domainModel.html

Учитывая это предположение, тогда ответом на ваш вопрос является «вся бизнес-логика», поскольку это, по сути, является определением шаблона.

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

Если вы еще этого не сделали, я бы посоветовал вам прочитать PoEAA и решить, где, по вашему мнению, логика предметной области относится к вашей ситуации. Если вы решите выбрать модель предметной области, я бы посоветовал вам прочитать книгу DDD Эвана и узнать о различиях между сущностями, объектами стоимости и услугами.

Надеюсь, это поможет!

2 голосов
/ 23 января 2009

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

1 голос
/ 23 января 2009

Суть в том, как определить логику. Вот несколько примеров:

  1. Я бы не классифицировал функцию getFullName () в сущности Person, которая просто объединяет некоторые строки, как логику.
  2. Вычисление стоимости позиции заказа более вероятно соответствует логике.
  3. Выполнение некоторых операций бронирования, я бы определенно сказал, логично.

Пункт 1 и, возможно, 2 перейдут для меня в сущность. Пункт 3 нет. Поэтому я определяю логику как:

  • любая операция, выполняющая какие-либо действия, связанные с постоянством (чтение / запись)
  • любая операция, в которой участвует любая другая (не связанная напрямую, например, основная деталь) сущность

ИМО, любая из этих операций не принадлежит сущностям.

Теперь, почему / когда я не мог бы также поместить операции типа точки 1 и 2 в сущность? Это довольно редкая ситуация, но я бы не стал этого делать, поскольку данные, хранящиеся в сущности, должны быть каким-то образом интерпретированы, прежде чем они могут быть использованы приложением (например, если в зависимости от текущего пользователя, содержимое поля X имеет другое значение), это означает, что сами данные объекта дают некоторую логику.

0 голосов
/ 23 января 2009

Насколько я понимаю, вся бизнес-логика, связанная с сущностью, должна входить в эту сущность. Это состоит из любой логики, которая определяет поведение или внутреннюю структуру объекта на основе бизнес-правил системы. Это не должно включать логику представления или логику персистентности (очевидное исключение - шаблон проектирования Active Record), но должно включать такие вещи, как проверка данных, взаимосвязи сущностей, конечные автоматы и другие вещи, которые определяют поведение сущности в терминах реальной мир, который он пытается смоделировать.

Я пытаюсь взглянуть на это, пытаясь сделать свои модели максимально возможными. Всегда пытайтесь думать о том, как будет использоваться модель, если она будет перенесена в другую систему, где клиентский код (или код, использующий сущность) может отличаться. Если функциональность не является частью сущности, будет ли она вести себя так же, следуя тем же бизнес-правилам? Если ответ отрицательный, то функциональность должна идти в сущности.

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