Avoir un peu de débat sur la structure de projet de départ (à l'aide de Maven/Eclipse) pour un Big Java Application.
Option 1:
entities (i.e. the whole database using Hibernate classes-first)
services (i.e. sets of read/write operations on the entities)
app (perhaps split up more further down the line)
Option 2:
area1-entities
area1-services
area1-app
area2-entities
area2-services
area2-app
...
(where area1, area2 etc. are functional areas of the system)
L'option 2 entraînera clairement une grande affaire plus de projets/modules plus mavenaires et signifie que les classes qui généreraient la base de données sont distribuées parmi plusieurs projets. Quelqu'un pourrait-il conseiller les avantages/les inconvénients de chaque approche?
Je suggérerais de ne faire ni ni.
Essayer d'appliquer une superposition technique avec une structure de paquet conduit à beaucoup d'enchevêtrement dans votre application. Sans parler du fait que nous essayons si fort de tout cacher derrière une interface de service et la première chose que nous faisons (principalement due à l'emballage) consiste à tout faire un public class
. Cela devient douloureux quand il y a une séparation technique entre un x.y.z.service
et x.y.z.repository
Paquet, maintenant tout peut accéder au référentiel. BOOM Il y a votre encapsulation à l'intérieur de la couche de service.
Au lieu de cela, vous devriez suivre une approche plus fonctionnelle et basée sur les oignons ( architecture propre , architecture hexagonale ). Ceci est également gentiment conforme au principe de responsabilité unique (lorsqu'il est appliqué à un paquet) et également conformément aux principes d'emballage
Oliver Gierke a écrit n bon post sur les composants d'emballage ensemble à Java. Simon Brown a écrit une histoire plus ... histoire générale sur le sujet.
Je ferais effercer une structure de forfait de forfait comme ci-dessous de tenir au cœur de votre application:
x.y.z.area1
x.y.z.area2
Maintenant, si vous avez une interface Web que vous ajoutez, par exemple, un web
Sous-package, pour Webservice a ws
ou rest
package pour contenir 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 IMHO est préférable d'utiliser un domaine spécifique pour cette couche. Comme, comme avec l'objet à la cartographie SQL, il y a (souvent) une inadéquation dans ce que nous voulons montrer à l'écran ou utilisez-le sous XML dans le site Web et comment la logique commerciale est mise en œuvre. Selon la complexité des domaines d'entreprise et de Web, vous pouvez les considérer comme des domaines problématiques séparés à résoudre quelles doivent être connectées, fondamentalement 2 différents contextes délimités .
Utiliser une citation d'une ressource CQRS
Il n'est pas possible de créer une solution optimale pour la recherche, les rapports et les transactions de traitement utilisant un modèle unique.
N'essayez pas de tout mettre dans un modèle unique (domaine), séparer les responsabilités. Vous vous retrouvez probablement avec plus de classes (plus petites) mais une séparation plus propre entre les couches de votre application.
Note finale
N'oubliez pas que la création d'une architecture est de décider des compromis d'une solution à l'autre. Cela dépend fortement de la complexité du domaine et devrait principalement être motivé par les exigences fonctionnelles de votre demande. Cependant, il est influencé par les contraintes non fonctionnelles (performances, sécurité) et environnementales (langue à utiliser, plate-forme, expérience). Et l'architecture, comme le codage, n'a jamais fini chaque nouvelle exigence peut (et peut-être devrait-être?) Conduire à une refonte de l'application.
Disclaimer
Oui, j'ai également essayé de tout mettre dans un seul modèle et j'ai également essayé d'utiliser une séparation technique dans mes applications. Cependant, après quelques années d'expérience dans la création de la superposition d'applications enchevêtrée (au début, il semble une bonne idée, l'application commence à se développer ...) J'ai pensé qu'il y ait un autre moyen.