Come progettare un'architettura di un sistema come descritto da Uncle Bob? [chiuso]

0

Come per "Architettura del software" spiegata da Uncle Bob, la tua architettura dovrebbe essere in grado di rinviare il più possibile le decisioni relative a framework e DB.

Considera un esempio di un sistema di buste paga da sviluppare in Java. Suppongo che l'applicazione principale sia un file jar autonomo. Il "meccanismo di consegna" sarà sul web, un file di guerra separato. Il DB sarà di nuovo un file jar separato.

La webapp e il progetto DB dovrebbero dipendere dall'applicazione principale.

Sono un po 'confuso qui, come organizzare diversi progetti? La webapp avrà l'applicazione principale come dipendenza. Quindi, per quanto riguarda il progetto DB?

    
posta Yasin 01.09.2017 - 16:21
fonte

2 risposte

2

La tua applicazione principale dovrebbe andare in una libreria (statica) - o possibili librerie multiple, una per le entità, una o più altre per casi d'uso, ecc. Dipende dalle dimensioni della tua applicazione. Per semplicità, presumo che le entità e i casi d'uso siano tutti in una libreria di base.

La libreria principale contiene interfacce per comunicare con il resto del mondo.

Ora puoi avere librerie di infrastrutture aggiuntive:

  • una libreria per l'interfaccia web
  • una libreria per il DB

Entrambe implementano alcune delle interfacce della libreria principale, quindi hanno ovviamente una dipendenza dalla libreria principale (ma non viceversa). Pertanto, è possibile sostituirli in seguito con un'implementazione diversa.

Le classi della libreria di base prevedono l'implementazione delle interfacce. Qui è dove si "inseriscono" le implementazioni effettive dalle proprie librerie di infrastruttura. A tal fine, avrai un progetto separato che lega insieme tutte le tue librerie tramite l'integrazione delle dipendenze e produce l'eseguibile finale che puoi implementare.

In genere, DB e webapp non saranno plug-in letteralmente nel senso che vengono caricati dinamicamente in fase di runtime. Piuttosto, vengono mantenuti separatamente solo fino alla creazione dell'eseguibile finale.

Ovviamente, puoi avere il DB, ecc. come librerie caricate dinamicamente, ma questo ha senso solo se hai qualche motivo per estendere la funzionalità dopo la distribuzione.

Note finali: nulla ti obbliga a mettere le cose in librerie separate, ma lo raccomando. Inoltre, sto ancora aspettando il libro di architettura pulito, ma suppongo che seguirà fondamentalmente questo .

Estendi la mia risposta per indirizzare il tuo commento

Forse posso chiarire con un esempio più specifico:

Se usi un IDE e crei un progetto java, probabilmente ti chiederà se vuoi creare una libreria o un eseguibile. Innanzitutto, crei una libreria, chiamata "core".

In questa libreria implementerai i tuoi controller (ad esempio ReportController , EmployeeManager ), le tue entità (ad esempio Report , Employee , Department , ecc.) e interfacce per cose come l'accesso al database - es %codice%. EmployeeRepository prende un riferimento a EmployeeManager nel suo costruttore che può utilizzare per aggiungere e rimuovere dipendenti. (Vedi iniezione di dipendenza).

Ora potresti creare un nuovo progetto di libreria e chiamarlo "mysqlDB". Puoi fare riferimento alla libreria principale e creare una classe EmployeeRepository che implementa MysqlEmployeeRepository . Separandolo, è possibile sostituirlo in un secondo tempo con un EmployeeRepository senza dover toccare la libreria principale. Questo è il significato del DB come plug-in per l'applicazione.

Tuttavia, in genere (per progetti di dimensioni moderate), non è necessario consentire il collegamento del DB in fase di runtime. Invece, spesso si vuole finire con un singolo eseguibile che è possibile distribuire. Quindi, come passaggio finale, aggiungi un nuovo progetto chiamato "MyPayrollSystem" che fa riferimento alla tua libreria principale, alla tua libreria DB e al resto.

In questo progetto, tutto ciò che fai è

  • crea un'istanza del tuo OracleEmployeeRepository
  • crea un'istanza di MysqlEmployeeRepository e assegna la tua istanza EmployeeManager .
  • fai cose simili per configurare tutte le altre parti del tuo sistema, ad es. l'interfaccia web

Il risultato finale è un eseguibile completo e autonomo, ma i singoli componenti vengono solo messi insieme (collegati) nell'ultima parte della compilation.

Ancora una volta, voglio sottolineare che questo non è l'unico modo per farlo. A volte, si potrebbe desiderare di rinviare il caricamento della libreria corretta ancora di più (vale a dire in fase di esecuzione), quindi è possibile caricare la libreria DB in modo dinamico a seconda di un file di configurazione o dei parametri della riga di comando. Ma questo è un passo che dovresti prendere solo se ne hai davvero bisogno.

    
risposta data 03.09.2017 - 12:05
fonte
1

Come dice lo zio Bob, la tua applicazione dovrebbe essere il gruppo di casi d'uso che la definiscono, così come le regole aziendali che hai.

Indipendentemente dall'organizzazione del tuo progetto, dovresti essere in grado di testare le tue regole aziendali (applicazione) senza alcuna app Web o DB. La persistenza dei dati deve essere un plug-in per la tua applicazione.

Qualsiasi componente aggiuntivo deve essere un plug-in per l'applicazione e in fase di produzione è possibile risolvere tutte le dipendenze nell'inizializzazione (ad esempio utilizzare Dependency Injection per fare in modo che l'applicazione si basi sulle astrazioni e nella parte "principale" dell'applicazione effettiva , risolvi tutte le dipendenze usando un framework DI).

Se riesci a ottenere quanto sopra, l'organizzazione del tuo progetto rifletterà la sua architettura in modo naturale.

    
risposta data 01.09.2017 - 22:21
fonte

Leggi altre domande sui tag