L'indicatore numero uno di moduli malamente accoppiati a mio avviso sono le dipendenze bilaterali. Ad esempio, Module1 one chiama alcune funzioni in Module2 e Module2 chiama alcune funzioni in Module1.
La maggior parte delle interfacce dovrebbe essere unidirezionale. Se il modulo che è stato chiamato deve passare alcune informazioni al modulo chiamante che non viene restituito come parte della chiamata, allora dovrebbe utilizzare una sorta di meccanismo di trasmissione di messaggi o di attivazione di eventi come una coda di messaggi. Idealmente, l'handle per l'interfaccia di passaggio dei messaggi deve essere inoltrato durante alcuni processi di inizializzazione o registrazione. Ciò astrae completamente l'interfaccia in modo tale che il modulo non si preoccupa di chi è l'evento ... quindi è disaccoppiato.
Un'altra indicazione è quando un modulo chiama costantemente un altro modulo per alcuni set di dati specifici. Questo dovrebbe farti mettere in discussione chi dovrebbe effettivamente possedere il set di dati. Perché questo modulo in questione ha sempre bisogno di vedere i dati che appartengono ad un altro modulo?
Un terzo strumento, per così dire, è chiedersi: "Posso estrarre questo modulo e sostituirlo senza richiedere modifiche ad altri moduli.
Questo non è affatto un elenco esaustivo, ma sono le prime tre cose che mi pongo durante la progettazione del software.