Как извлечь максимальную пользу из модели анемичной предметной области, если нет другого выбора

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

Существует множество статей, описывающих анемичную модель предметной области как антишаблон, а также несколько статей, в которых она описывается как идеально подходящая для простых систем. Но я не видел примеров получения максимальной отдачи от работы с крупной корпоративной системой с ADM.

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

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

  • как вы ограничиваете зависимости от других служб внутри каждой службы? то есть OrderCancelService нуждается в CustomerAccountService и PaymentService и RefundCalculatorService и RewardsAdjustmentService и т. д. Это приводит к нескольким фиктивным объектам в тестах, что делает тесты слишком привязанными к реализации

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

  • Применяете ли вы принцип «скажи, не спрашивай» для обслуживания объектов? Я вижу много сервисов, которые возвращают значения, которые затем используются вызывающим сервисом для принятия решений в потоке выполнения.


person WorkinHard    schedule 17.05.2017    source источник
comment
Просто чтобы быть уверенным, вы имеете в виду анемичную модель для сложной проблемной области, а не для простой, CRUDish, верно?   -  person guillaume31    schedule 17.05.2017
comment
@ guillaume31 Да, это то, с чем я борюсь. Наличие множества различных рабочих процессов, запускаемых многими различными взаимодействиями с пользователем, каждый из которых принимает решения на основе нескольких свойств в нескольких объектах и ​​каждый из которых также обновляет несколько свойств. Это, по-видимому, приводит к взрыву больших классов службы/утилиты/менеджера. Итак, учитывая, что я не могу перенести логику в сущности, как нам сделать все возможное, чтобы применить принципы SOLID и применить TDD, как подчеркивается в гибкой разработке.   -  person WorkinHard    schedule 17.05.2017
comment
Добро пожаловать в индустрию. На самом деле очень ТРУДНО присоединиться к команде, которая правильно применяет DDD и TDD, или присоединиться к компании, где вы можете что-то изменить. Все, что я могу сказать, это то, что вы должны попытаться разобраться во всем этом самостоятельно во время интервью. Даже в шляпе архитектора это может быть сложно в зависимости от культуры компании, поэтому просто продолжайте искать ее и не сдавайтесь! Посещайте курсы ддд, старайтесь лично участвовать в сообществе и налаживать контакты :)   -  person Sebastian Oliveri    schedule 23.05.2017
comment
Если это индустрия, что делает старшего разработчика старшим? Если это не его способность реализовать чистую гибкую систему. Это просто знание разных технологий?   -  person WorkinHard    schedule 24.05.2017


Ответы (1)


Вы можете рассматривать свою модель постоянства, которую вы теперь считаете анемичной моделью предметной области, как то, что она есть, — модель постоянства для состояния вашей модели предметной области.

Если вы сделаете это, вы, вероятно, сможете создать реальную модель предметной области, состояние которой будет храниться внутри объектов модели постоянства (шаблон состояния). Затем вы можете иметь свою логику внутри этой новой модели предметной области. Читая ваш комментарий выше, я бы сказал, что вы можете преобразовать свои классы «менеджер/сервис» в конечные автоматы, вы можете называть их агрегатами, если они совпадают с границами транзакций, и их состояние в POJO сохраняется Hibernate, как это делается сейчас.

person Alexey Zimarev    schedule 17.05.2017
comment
Я думаю, что будет сложно убедить команду скрыть наши объекты JPA внутри классов Java с теми же именами. Мне интересно, есть ли лучшие практики для этих служб без сохранения состояния, которые, как правило, окружают каждую сущность, т.е. OrderService с такими методами, как отмена, addOrderLines. Разработчикам, которые выступают за то, чтобы логика находилась на уровне службы. Существуют ли какие-либо передовые методы, такие как отсутствие методов получения в этих службах и способы ограничения длинных списков параметров, чтобы можно было сделать модульное тестирование и имитацию более чистыми? - person WorkinHard; 23.05.2017