Hai capito correttamente che la modularizzazione è la chiave per un software ben mantenuto. Senza un problema specifico dovrò limitarlo a una risposta generale.
Struttura
Ogni modulo ha una funzione. Detto questo, ci sono alcune classi che rappresentano l'interfaccia esterna per il modulo e altre che vengono utilizzate solo internamente. Quelli che servono come interfaccia devono ottenere tutto ciò che richiedono per un'azione tramite parametro. Se i parametri sono tipi non banali, è necessario utilizzare un'interfaccia per il tipo di parametro. In questo modo la classe conosce solo una determinata interfaccia pubblica degli oggetti che riceve ma nulla sulla classe specifica.
Alcuni moduli necessitano di altri moduli. C'è un approccio semplice a questo. Hai strumenti, servizi, materiali e valori (vedi strumenti e materiali ). Gli strumenti possono utilizzare ogni tipo di classe. Un servizio può utilizzare solo altri servizi, materiali e valori. Un materiale può utilizzare solo materiali e valori e infine un valore può utilizzare solo valori.
I valori rappresentano valori immutabili nell'argomento. Nell'area bancaria questa potrebbe essere una somma di denaro. Sebbene la quantità stessa possa essere variabile (puoi avere 100, 200, x dollari), il valore non lo è. Non cambi da 100 a 200. Prendi semplicemente la rappresentazione del valore di 200.
I materiali rappresentano le cose nell'argomento (come un conto bancario).
I servizi vengono utilizzati per cambiare materiali e operare operazioni (ad esempio un servizio di prestito che viene utilizzato per prestare film). Contengono inoltre la logica aziendale per determinare se una determinata operazione è valida.
Gli strumenti sono il punto di interazione con l'utente. Lavorano principalmente su un materiale o servizio. Ci possono essere sotto-strumenti. Gli strumenti sono l'interfaccia per la GUI (sia essa basata sul desktop basata sul web).
Detto questo puoi garantire che ogni modulo contenga un solo tipo di classi e una sola responsabilità.
Iniezione di dipendenza
Ma ora come funziona Dependency Injection senza inquinare altre classi? È consentito utilizzare nuove istruzioni all'interno delle classi di strumenti per creare strumenti secondari. Poiché gli strumenti sono per lo più orientati alla tecnologia, non è molto facile testarlo automaticamente (in quanto richiedono ad altre classi di fare il lavoro pesante). Importante è che ogni dipendenza da un altro modulo (che si tratti di servizi, materiali o valori) viene fornita tramite parametro.
Alla fine hai bisogno di una classe che leghi insieme i moduli, inizializzi i servizi necessari nel software e li assegni alle classi appropriate tramite l'iniezione di parametri (sia nel metodo costruttore che setter).
Gli strumenti tra l'altro ottengono i loro riferimenti agli oggetti necessari (se non tramite parametri) dalla GUI, quindi non c'è molto inoltro di riferimenti attraverso il sistema.