web-dev-qa-db-fra.com

Java Structure d'application: horizontale vs scission verticale

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?

16
Steve Chambers

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

  1. Les choses qui changent ensemble sont emballées ensemble
  2. Les choses qui sont utilisées ensemble sont emballées ensemble

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.

Liens

  1. Architecture propre, oncle Bob Martin
  2. architecture hexagonale (ports AKA et adaptateurs), Cockburn Alistair
  3. whoops où est arrivé mon architecture, Oliver Gierke
  4. Principes d'Ood, oncle Bob Martin
  5. erreurs lors de l'application de DDD, UDI DAHAN
  6. Contextes bornés, Martin Fowler
  7. style de codage architectural, Simon Brown

Livres

  1. logiciel de croissance orienté objet, guidé par des tests
  2. Architecture d'application Java: motifs de modularité avec des exemples utilisant OSGI (Robert C. Martin Series
  3. conception axée sur le domaine: résolution de la complexité au cœur du logiciel
  4. Architecture logicielle pour les développeurs
  5. mise en œuvre de la conception de domaine axée sur le domaine
31
M. Deinum