Я бы предложил не делать ни того, ни другого.
Попытка навязать технический уровень со структурой пакета приводит к значительному запутыванию в вашем приложении. Не говоря уже о том, что мы так стараемся скрыть все за интерфейсом сервиса, и первое, что мы делаем (в основном из-за упаковки), это делаем все public class
. Это становится болезненным, когда есть техническое разделение между a x.y.z.service
и x.y.z.repository
пакетом, теперь все могут получить доступ к хранилищу. Boom, там идет ваша инкапсуляция внутри уровня обслуживания.
Вместо этого вы должны следовать более функциональному и луковому подходу ( чистая архитектура , шестиугольная архитектура ). Это также хорошо согласуется с принципом единой ответственности (применительно к упаковке), а также в соответствии с принципами упаковки
- Вещи, которые меняются вместе, упакованы вместе
- Вещи, которые используются вместе, упакованы вместе
Оливер Гирке написал замечательную статью об объединении компонентов в Java. Саймон Браун написал более общую историю на эту тему.
Я бы стремился к структуре базового пакета, подобного следующему, чтобы сохранить ядро вашего приложения:
x.y.z.area1
x.y.z.area2
Теперь, если у вас есть веб-интерфейс, вы добавляете, например, web
подпакет, для веб- сервиса a ws
или rest
пакета, в котором хранится только это. Это в основном подключается к ядру.
x.y.z.area1.web
x.y.z.area1.ws
x.y.z.area2.rest
Теперь вы можете рассмотреть возможность повторного использования объектов из вашего ядра в других слоях, но имхо лучше использовать определенный домен для этого слоя. Так же, как и при сопоставлении объекта с SQL, (часто) имеется несоответствие в том, что мы хотим показать на экране или использовать в качестве XML в веб-сервисе, и в том, как реализована бизнес-логика. В зависимости от сложности бизнеса и веб-доменов вы можете рассматривать их как отдельные проблемные домены, для решения которых необходимо подключиться, в основном это два разных ограниченных контекста .
Чтобы использовать цитату из ресурса CQRS
Невозможно создать оптимальное решение для поиска, составления отчетов и обработки транзакций с использованием единой модели.
Не пытайтесь поместить все в единую (доменную) модель, разделите обязанности. Вы, вероятно, получите больше (меньших) классов, но более чистое разделение между уровнями вашего приложения.
Финальная нота
Помните, что создание архитектуры - это выбор компромисса одного решения другому. Это сильно зависит от сложности домена и должно в основном зависеть от функциональных требований вашего приложения. Однако на это влияют нефункциональные (производительность, безопасность) и ограничения среды (язык, платформа, опыт). А архитектура, как и кодирование, никогда не заканчивается, каждое новое требование может (и может быть должно?) Привести к изменению дизайна приложения.
отказ
Да, я также пытался поместить все в одну модель, и да, я также пытался использовать техническое разделение в своих приложениях. Однако после нескольких лет опыта в создании запутанных слоев приложений (сначала это кажется хорошей идеей, затем приложение начинает расти ...), я подумал, что должен быть другой путь.
связи
- Чистая архитектура, дядя Боб Мартин
- Шестиугольная Архитектура (иначе Порты и Адаптеры), Алистер Кокберн
- К сожалению, где моя архитектура пошла, Оливер Gierke
- Принципы ООД, дядя Боб Мартин
- Ошибки при применении DDD, Udi Dahan
- Ограниченные контексты, Мартин Фаулер
- Архитектурно очевидный стиль кодирования, Саймон Браун
книги
- Растущее объектно-ориентированное программное обеспечение, ориентированное на тесты
- Архитектура приложения Java: шаблоны модульности с примерами с использованием OSGi (серия Роберта С. Мартина)
- Проектирование на основе доменов: борьба со сложностями в основе программного обеспечения
- Архитектура программного обеспечения для разработчиков
- Реализация доменного дизайна