S = Principio di responsabilità singola
Quindi mi aspetto di vedere una struttura di cartelle / file ben organizzata e una gerarchia di oggetti. A ogni classe / pezzo di funzionalità dovrebbe essere assegnato il nome che la sua funzionalità è molto ovvia e dovrebbe contenere solo la logica per eseguire tale compito.
Se vedessi enormi classi manager con migliaia di righe di codice, ciò significherebbe che non è stata seguita la singola responsabilità.
O = Principio aperto / chiuso
Questa è fondamentalmente l'idea che nuove funzionalità dovrebbero essere aggiunte attraverso nuove classi che hanno un impatto minimo su / richiedono la modifica delle funzionalità esistenti.
Mi aspetterei di vedere un grande uso dell'ereditarietà degli oggetti, della sotto-digitazione, delle interfacce e delle classi astratte per separare il design di un pezzo di funzionalità dall'attuazione effettiva, consentendo agli altri di venire avanti e implementare altre versioni lungo il lato senza influire sul originale.
L = principio di sostituzione di Liskov
Ciò ha a che fare con la capacità di trattare i sottotipi come il loro tipo genitore. Questo viene fuori dalla scatola in C # se stai implementando una corretta gerarchia di oggetti ereditati.
Mi aspetterei di vedere il codice che tratta gli oggetti comuni come il loro tipo di base e i metodi di chiamata nelle classi base / astratte piuttosto che creare un'istanza e lavorare sui sottotipi stessi.
I = Principio di segregazione dell'interfaccia
Questo è simile a SRP. Fondamentalmente, si definiscono sottoinsiemi di funzionalità più piccoli come interfacce e si lavora con quelli per mantenere il sistema disaccoppiato (ad es. A FileManager
potrebbe avere la singola responsabilità di gestire l'I / O dei file, ma ciò potrebbe implementare un IFileReader
e IFileWriter
che conteneva le definizioni del metodo specifico per la lettura e scrittura di file).
D = Principio di inversione di dipendenza.
Anche in questo caso si tratta di mantenere un sistema disaccoppiato. Forse saresti alla ricerca dell'uso di una libreria .NET Dependency Injection, utilizzata nella soluzione come Unity
o Ninject
o in un sistema ServiceLocator come AutoFacServiceLocator
.