Я верю, что структурирую свои проекты, как это делают многие.У вас есть уровень данных (DAO), уровень обслуживания (службы) и уровень представления (Spring MVC, Wicket, ...).
Обычно служба начинает быть довольно простой и «короткой».Однако постепенно служба должна поддерживать все больше и больше вариантов использования, пока через некоторое время она не станет одним огромным классом с множеством строк и методов, и ее будет трудно читать и поддерживать.В это время вы можете либо решить придерживаться этого, либо начать рефакторинг, что является громоздкой и «опасной» работой, которая может занять много работы.
Я ищу решение для предотвращения необходимости какого-либо рефакторинга в будущем.
Одним из подходов может быть разделение ваших услуг на несколько подуслуг и превращение вашей первоначальной услуги в фасад службы.Так, например, вместо большого UserService у вас может быть UserServiceFacade, который делегирует вызовы PasswordService, RegistrationService, ....
Я думаю, это неплохое решение, но я не слишком восторженно к этому отношусьпотому что:
- сложно заранее определить, на какие подслуги разделить работу;если вы ошиблись, вам все равно может понадобиться рефакторинг в обратном направлении или у вас может быть служба только с одним методом, например
- повторное использование бизнес-логики может быть более сложным, если, например, PasswordService и RegistrationService требуется общая функциональность
Другим решением может быть использование бизнес-объектов, которые (в моем понимании) также можно увидеть как вспомогательные сервисы, но затем по одному для каждого конкретного UseCase, так что у вас могут быть BO, такие как CreateUserBO, CheckPasswordBO, DeleteUserBO, ....
Я немного более восторженно отношусь к этому подходу, потому что, по моему мнению, он предлагает довольно много преимуществ:
- Сам BO очень читабелен и требует только от своего контракта;все остальное можно делегировать другим BO, один BO будет коротким и к точке
- Простота повторного использования функциональности
- Легче изменить / переключить реализацию определенного UseCase: просто ввестидругая реализация с Spring
- Проще протестировать: нужно тестировать только для конкретного UseCase, делегировать другим BO можно смоделировать
- Сотрудничество: меньше конфликтов, если несколько разработчиков работают над разными BO, тогда, когда они работаютна том же сервисе
Однако я также вижу некоторые возможные недостатки:
- немного дополнительной работы (по крайней мере, в плане сортировки)
- Многоебольше классов, которые могут снизить читабельность вашего проекта?
- еще один уровень абстракции: требуется дополнительный шаг, чтобы найти фактическую реализацию UseCase
Вопрос или, скорее, вопросы (извините) являются:
- Являются ли Business Objects идеальным решением для этой проблемы?
- Согласны ли вы с преимуществомs / недостатки BO, которые я перечислю выше и / или вы видите других?
- Существуют ли другие (хорошие) решения для предотвращения мега-услуг, разрушающих ваш день?