Ответ 1
Я согласен с общей идеей этих сообщений. Модель класса ORM является частью уровня доступа к данным в первую очередь (даже если она состоит из так называемых POCOs). Если возникает конфликт интересов между настойчивостью и деловой логикой (или любой другой проблемой), решения всегда должны приниматься в пользу настойчивости.
Однако, как разработчики программного обеспечения, мы всегда должны балансировать между пуризмом и прагматизмом. Можно ли использовать модель сохранения в качестве модели домена, зависит от ряда факторов:
-
Размер/согласованность команды разработчиков. Когда вся команда знает, что свойства могут быть общедоступными только из-за требований ORM, но не должны устанавливаться повсюду, это может быть не очень важно. Если все знают (и подчиняются), что свойство ID не должно использоваться в бизнес-логике, идентификация может быть не большой. Разбросанной, неопытной или недисциплинированной команде может потребоваться более строгая сегрегация кода.
-
Совпадение между проблемами бизнес-логики и проблемами сохранения. Объектно-ориентированный дизайн процветает, когда модель класса придерживается принципов SOLID. Но эти принципы не всегда противоречат проблемам сохранения. Я имею в виду, что, хотя проблемы различны, в конечном итоге их результирующие требования могут быть весьма схожими. Например, обе проблемы могут требовать действительного состояния объекта и правильных ассоциаций.
Однако могут быть случаи использования, когда объекты временно должны находиться в состоянии, которое абсолютно не должно храниться. Это может быть причиной для работы с выделенными классами домена. Другая причина может заключаться в том, что модель сущности просто не может выполнить лучшую сегментацию обязанностей. Например, бизнес-процесс "черный список" может потребовать данных, которые разбросаны по многим объектам объектов, которые должны быть разработаны новыми классами доменов, которые могут инкапсулировать данные и методы, работающие над ними. Другими словами: делать это сущностями будет нарушать принцип Tell Do not Ask.
-
Необходимость расслоения. Например, если уровень доступа к данным предназначен для разных поставщиков баз данных, он может состоять из взаимозаменяемых частей, специфичных для поставщиков (например, для учета тонких различий в типах данных между серверами Oracle и Sql или для использования специфических для поставщика функций). Использование модели персистентности в качестве модели домена, вероятно, привело бы к снижению специфических для поставщика реализаций в бизнес-логике. Это было бы очень плохо. Там уровень доступа к данным должен быть именно этим, слоем.
-
(Очень тривиально) Объем данных. Создание объектов требует времени и ресурсов. Когда в бизнес-случае задействованы "многие" объекты, может быть слишком дорого строить как объекты объекта, так и объекты домена.
И еще, несомненно.
Поэтому я всегда старался быть прагматиком. Если классы сущностей выполняют достойную работу, идите на это. Если несоответствие слишком велико, создайте бизнес-домен для соответствующих частей бизнес-логики. Я бы не рабски придерживался (любого) шаблона дизайна только потому, что это хороший образец. Вопреки тому, что сказано в сообщении, для планирования модели сущности требуется бизнес-модель. Когда вы обнаружите, что создаете мириады бизнес-классов, которые почти идентичны классам сущностей, время переосмыслить то, что вы делаете.