Scegliere tra una libreria e un file eseguibile è relativamente semplice: ha senso eseguire il codice che si desidera inserire in un eseguibile come programma autonomo? In caso contrario, dovrebbe probabilmente essere una libreria. In generale, preferirei un sottile livello eseguibile su tutte le librerie necessarie, dal momento che è più facile riutilizzare quelle back-end e non sono legate a un particolare programma.
A parte decidere come dividere il codice tra le librerie, potresti trovare l'articolo sulla granularità di Uncle Bob Martin utile.
In esso parla della struttura OO e definisce diversi principi che possono aiutarti a impacchettare il tuo codice in modo appropriato. Questi sono anche trattati in modo più dettagliato nel suo libro, Principi, modelli e pratiche agili in C # .
Riassumerò i seguenti principi:
Reuse / Release Equivalence Principle (REP)
The granule of reuse is the granule of release. Only components that are released through a tracking system can be effectively reused. This granule is the package.
Zio Bob definisce il riutilizzo come in grado di collegare staticamente o dinamicamente la libreria riutilizzata nel suo programma e di non dover mai guardare il suo codice sorgente. Quando viene rilasciata una nuova versione della libreria, può semplicemente integrarla nel suo sistema.
Trattando le librerie in questo modo si guida solo mantenendo le cose correlate insieme nello stesso pacchetto. Altrimenti, i consumatori della biblioteca potrebbero dover eseguire l'aggiornamento a una nuova versione senza motivo o ritardare alcune versioni precedenti.
Common Reuse Principle (CRP)
The classes in a package are reused together. If you reuse one of the classes in a package, you reuse them all.
Questo principio supporta quello sopra. Se hai classi nello stesso pacchetto che non sono correlate tra loro, potresti costringere gli utenti della tua biblioteca a effettuare l'upgrade inutilmente.
Common Closure Principle (CCP)
The classes in a package should be closed against the same kinds of changes. A change that affects a package affects all the classes in that package.
Questo principio parla della manutenibilità. L'idea qui è di raggruppare le classi in base a come potrebbero aver bisogno di cambiare. In questo modo le tue modifiche possono essere localizzate in una parte dell'applicazione e non diffuse dappertutto.
Il principio delle dipendenze acicliche (ACP)
The dependency structure between packages must be a Directed Acyclic Graph (DAG). That is, there must be no cycles in the dependency structure.
L'annullamento delle dipendenze cicliche consente a ogni pacchetto di essere sviluppato indipendentemente e "rilasciato" al resto dell'azienda quando sono pronti nuovi cambiamenti. In questo modo non ti ritroverai con due squadre in stallo, in attesa l'una dell'altra per finire il lavoro.