Suggerirei di non fare nessuno dei due.
Cercare di imporre una stratificazione tecnica con una struttura del pacchetto porta a un sacco di problemi nella tua applicazione. Per non parlare del fatto che ci sforziamo così tanto di nascondere tutto dietro un'interfaccia di servizio e la prima cosa che facciamo (principalmente a causa del packaging) è rendere tutto a public class
. Questo diventa doloroso quando c'è una separazione tecnica tra un x.y.z.service
e x.y.z.repository
pacchetto, ora tutto può accedere al repository. Boom va lì l'incapsulamento all'interno del livello di servizio.
Invece dovresti seguire un approccio più funzionale e basato sulla cipolla ( architettura pulita , architettura esagonale ). Ciò è anche in linea con il principio di responsabilità singola (se applicato a un pacchetto) e anche in conformità con i principi di imballaggio
- Le cose che cambiano insieme vengono impacchettate insieme
- Le cose che vengono usate insieme vengono impacchettate insieme
Oliver Gierke ha scritto un bel post sui componenti di packaging insieme in Java. Simon Brown ha scritto una storia più generale sull'argomento.
Vorrei lottare per una struttura di pacchetto di base come la seguente per contenere il nucleo della tua applicazione:
x.y.z.area1
x.y.z.area2
Ora se hai un'interfaccia web aggiungi, ad esempio, un web
subpackage, affinché webservice a ws
o rest
package ne contenga solo. Si collega sostanzialmente al core.
x.y.z.area1.web
x.y.z.area1.ws
x.y.z.area2.rest
Ora potresti considerare di riutilizzare gli oggetti dall'interno del tuo core negli altri livelli, ma IMHO è meglio usare un dominio specifico per quel livello. Come nel caso della mappatura di Object to SQL, c'è (spesso) una discrepanza tra ciò che vogliamo mostrare sullo schermo o usare come XML nel servizio web e come viene implementata la logica aziendale. A seconda della complessità dei domini di business e web che li potrebbe considerare come domini separati problema da risolvere, che hanno bisogno di essere collegati, fondamentalmente 2 differenti contesti limitati .
Per utilizzare un preventivo da una risorsa CQRS
Non è possibile creare una soluzione ottimale per la ricerca, la reportistica e l'elaborazione delle transazioni utilizzando un singolo modello.
Non cercare di mettere tutto in un unico modello (dominio), separare le responsabilità. Probabilmente finirai con più classi (più piccole) ma una separazione più pulita tra i livelli dell'applicazione.
Nota finale
Ricordare che creare un'architettura è decidere i compromessi di una soluzione all'altra. Dipende fortemente dalla complessità del dominio e dovrebbe essere guidato principalmente dai requisiti funzionali dell'applicazione. Tuttavia è influenzato da vincoli non funzionali (prestazioni, sicurezza) e ambientali (linguaggio da usare, piattaforma, esperienza). E l'architettura, come la codifica, non ha mai finito ogni nuovo requisito può (e forse dovrebbe?) Portare a una riprogettazione dell'applicazione.
disconoscimento
Sì, ho anche provato a mettere tutto in un unico modello, e sì, ho anche provato a utilizzare una separazione tecnica nelle mie applicazioni. Tuttavia dopo un paio d'anni di esperienza nella creazione di livelli di applicazione aggrovigliati (all'inizio sembra una buona idea, quindi l'applicazione inizia a crescere ...) Ho pensato che ci doveva essere un altro modo.
link
- Architettura pulita, zio Bob Martin
- Hexagonal Architecture (aka Ports and Adapters), Alistair Cockburn
- Whoops dove è andata la mia architettura, Oliver Gierke
- Principi di OOD, zio Bob Martin
- Errori durante l'applicazione di DDD, Udi Dahan
- Contesti limitati, Martin Fowler
- Stile di codifica architettonicamente evidente, Simon Brown
Libri
- Software orientato agli oggetti in crescita, guidato da test
- Architettura delle applicazioni Java: modelli di modularità con esempi che utilizzano OSGi (serie Robert C. Martin)
- Design guidato dal dominio: affrontare la complessità nel cuore del software
- Architettura software per sviluppatori
- Implementazione del design guidato dal dominio