Каким количеством логика должна быть в Ваших объектах модели предметной области

Чтобы дополнить ответ Джеспера , то, что происходит здесь (и недокументировано!), состоит в том, что Files.lines() создает CharsetDecoder , чья политика заключается в отказе от неверных последовательностей байтов; то есть его CodingErrorAction установлен в REPORT.

Это отличается от того, что происходит почти для всех других реализаций Reader, предоставляемых JDK, стандартная политика которых к REPLACE. Эта политика приведет к тому, что все неизменяемые последовательности байтов испускают символ замены (U + FFFD) .

15
задан Ryan Guill 23 January 2009 в 18:40
поделиться

5 ответов

Матовый,

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

Теперь процессуальный кодекс не имеет никакого места в модели предметной области. Если Вы хотите использовать более процедурный стиль, который прекрасен, но используйте его с чем-то как Модуль Таблицы или Активный Рекордный шаблон. Это не отсутствие OO, которое я считаю настолько разрушительным в руководстве, но использовании модели предметной области с процедурной логикой.

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

Теперь для возвращения к тому, что "поведение", я хотел бы сфокусировать на вопросе от Объектно-ориентированного в противоположность "Доменному Управляемому Дизайну" точку зрения. Объект будет обычно инкапсулировать некоторое состояние и будет обычно выставлять некоторые поведения.

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

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

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

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

Инкапсулируют состояние о клиенте и выставляют поведения.

Как таковой мы видим, что были бы более обеспеченным наличием Клиента. Удалите () метод. (да это - плохой пример, который я знаю...)

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

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

это помогает разъяснить вещи немного?

Greg

17
ответ дан 1 December 2019 в 03:05
поделиться

Если Вы назовете их Вашими "объектами модели предметной области то", затем я предположу, что Вы обращаетесь к шаблону Модели предметной области Fowler. http://martinfowler.com/eaaCatalog/domainModel.html

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

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

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

Hope, которая помогает!

4
ответ дан 1 December 2019 в 03:05
поделиться

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

2
ответ дан 1 December 2019 в 03:05
поделиться

Основной момент - то, как каждый определяет логику. Дать некоторые примеры:

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

Точка 1 и возможно 2 пошла бы для меня в объект. Укажите 3 нет. Таким образом, я определяю логику как:

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

IMO, любая из этих операций не принадлежит в объекты.

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

1
ответ дан 1 December 2019 в 03:05
поделиться

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

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

0
ответ дан 1 December 2019 в 03:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: