Je suggérerais de ne faire ni l'un ni l'autre.
Essayer d'imposer une superposition technique avec une structure de package entraîne de nombreux enchevêtrements dans votre application. Sans parler du fait que nous nous efforçons de tout cacher derrière une interface de service et la première chose que nous faisons (principalement en raison de l'emballage) est de tout faire a public class
. Cela devient pénible lorsqu'il y a une séparation technique entre un x.y.z.service
et un x.y.z.repository
package, maintenant tout peut accéder au référentiel. Boom là va votre encapsulation à l'intérieur de la couche de service.
Au lieu de cela , vous devez suivre une approche plus fonctionnelle et l' oignon ( l' architecture propre , l' architecture hexagonale ). Ceci est également parfaitement conforme au principe de responsabilité unique (lorsqu'il est appliqué à un emballage) et également conforme aux principes d'emballage.
- Les choses qui changent ensemble sont emballées ensemble
- Les choses qui sont utilisées ensemble sont emballées ensemble
Oliver Gierke a écrit un bel article sur le regroupement des composants en Java. Simon Brown a écrit une histoire plus générale sur le sujet.
Je m'efforcerais d'avoir une structure de package de base comme la suivante pour contenir le cœur de votre application:
x.y.z.area1
x.y.z.area2
Maintenant, si vous avez une interface Web, vous ajoutez, par exemple, un sous- web
package, pour que le service Web ws
ou le rest
package contienne uniquement cela. Il se connecte essentiellement au noyau.
x.y.z.area1.web
x.y.z.area1.ws
x.y.z.area2.rest
Vous pouvez maintenant envisager de réutiliser les objets de l'intérieur de votre noyau dans les autres couches, mais à mon humble avis, il est préférable d'utiliser un domaine spécifique pour cette couche. Comme, tout comme avec le mappage objet à SQL, il y a (souvent) un décalage dans ce que nous voulons afficher à l'écran ou utiliser comme XML dans le service Web et comment la logique métier est implémentée. En fonction de la complexité des domaines commerciaux et Web, vous pouvez les considérer comme des domaines de problèmes distincts à résoudre, qui doivent être connectés, essentiellement 2 contextes bornés différents .
Pour utiliser un devis d'une ressource CQRS
Il n'est pas possible de créer une solution optimale pour la recherche, la génération de rapports et le traitement des transactions à l'aide d'un modèle unique.
N'essayez pas de tout mettre dans un seul modèle (domaine), séparez les responsabilités. Vous vous retrouvez probablement avec plus de classes (plus petites) mais une séparation plus nette entre les couches de votre application.
Note finale
N'oubliez pas que créer une architecture, c'est décider des compromis d'une solution à l'autre. Il dépend fortement de la complexité du domaine et doit principalement être déterminé par les exigences fonctionnelles de votre application. Il est cependant influencé par les contraintes non fonctionnelles (performances, sécurité) et environnementales (langage à utiliser, plateforme, expérience). Et l'architecture, comme le codage, n'est jamais terminée, chaque nouvelle exigence peut (et peut-être devrait?) Conduire à une refonte de l'application.
Avertissement
Oui j'ai aussi essayé de tout mettre dans un seul modèle, et oui j'ai aussi essayé d'utiliser une séparation technique dans mes applications. Cependant, après quelques années d'expérience dans la création de couches d'application enchevêtrées (au début, cela semble une bonne idée, puis l'application commence à se développer ...) J'ai pensé qu'il devait y avoir une autre façon.
Liens
- Architecture propre, oncle Bob Martin
- Architecture hexagonale (alias ports et adaptateurs), Alistair Cockburn
- Oups où est passée mon architecture, Oliver Gierke
- Principes d'OOD, oncle Bob Martin
- Erreurs lors de l'application de DDD, Udi Dahan
- Contextes limités, Martin Fowler
- Style de codage architecturalement évident, Simon Brown
Livres
- Développement d'un logiciel orienté objet, guidé par des tests
- Architecture d'application Java: modèles de modularité avec exemples utilisant OSGi (série Robert C. Martin)
- Conception pilotée par domaine: s'attaquer à la complexité au cœur des logiciels
- Architecture logicielle pour les développeurs
- Implémentation d'une conception pilotée par domaine