При использовании инструментов ORM, таких как Hibernate, я обнаружил, что выгодно не допускать всей бизнес-логики к моим бизнес-объектам и вместо этого хранить ее на уровне обслуживания. Уровень обслуживания создает POJO бизнес-объекта, манипулирует ими и использует DAO для их сохранения. Но разве Это в каком-то смысле шаг назад от объектно-ориентированной природы Java?
Мой стек включает Spring с Hibernate для DI, транзакций и постоянства. Мои DAO внедряются в мой уровень обслуживания, а не в какие-либо объекты POJO.
Недавно я прочитал документ Мартина Фаулера шаблоны бухгалтерского учета о создании гибких систем учета. Я считаю, что он был написан до повального увлечения Spring / Hibernate / DI / ORM. Он описывает объекты, содержащие бизнес-логику. Эти объекты используют наследование и композицию элегантными способами, которые имеют смысл.
Помещая логику в классы, ее можно разделить на аккуратные блоки, относящиеся только к одному конкретному сценарию. В моем сервисном слое у меня есть множество разных методов, каждый из которых имеет дело со своим сценарием. Но он далек от объектно-ориентированного.
У Мартина Фаулера ' В документе с шаблонами бухгалтерского учета он описывает базовый класс AccountingEvent
. Этот класс может иметь подклассы, такие как UsageEvent
и InstallationEvent
.
UsageEvent
:
UsageEvent
происходит, когда считыватель счетчиков записывает ваше потребление электроэнергии. клиента
PostingRule
указаны в соглашении об обслуживании для этого типа событий и для этого конкретного периода времени. Правила и частота могут меняться со временем, поэтому для любого типа событий существует несколько PostingRule
. UsageEvent
и PostingRule
определяют, какие действия необходимы для выполнения, например создание одного или нескольких объектов AccountingEntry
. AccountingEntry
для выставления счетов за использование с логикой, содержащейся в PostingRule
. Это может быть так же просто, как использование ставки *
, но, вероятно, гораздо сложнее, в зависимости от времени суток, уровней обязательств (крупные предприятия могут получать скидки), домохозяйств с низким доходом и т. Д. AccountingEntry
создаются для выставления счетов за налоги, предоставления кредитов и т. Д. InstallationEvent
:
InstallationEvent
происходит, когда технический специалист включает питание здания. PostingRule
найдены AccountingEntry
s UsageEvent
Дело в том, что существует множество различных типов AccountingEvent
и PostingRule
, каждый из которых точно знает, что делать в конкретной ситуации. Эти объекты легко взаимозаменяемы с помощью интерфейсов. Я могу избавиться от всего, просто введя команду someAccountingEvent.process ()
.
Я не знаю, как лучше всего вернуть эту элегантность, когда мне нужно создавать и сохранять объекты в уровень обслуживания. Я не хочу внедрять свои DAO в свои POJO, что добавило бы к ним дополнительных зависимостей и потенциально сделало бы их гораздо более тяжелыми объектами. } который я могу использовать для фильтрации такого массива: $ arr = array (7, 8, 9, 10, 11, 12, 13); описание данных и фактические данные находятся в одном месте, не так ли. По крайней мере, описание есть в классе, а данные - в объекте. Вы можете думать об объекте как о имеющем описание типа переменных, которые он содержит.
Почему тогда Core Data разделяет класс, который описывает данные, и класс, который содержит данные? Это связано с ошибкой?