Capisco che SOLID dovrebbe realizzarlo e utilizzarlo regolarmente in situazioni in cui la modularità è importante e i suoi obiettivi sono chiaramente utili. Tuttavia, due cose mi impediscono di applicarlo in modo coerente attraverso il mio codebase:
-
Voglio evitare l'astrazione prematura. Nella mia esperienza, disegnare linee di astrazione senza casi d'uso concreti (il tipo che esiste ora o nel futuro prevedibile ) porta a essere disegnate nei posti sbagliati. Quando provo a modificare questo codice, le linee di astrazione si intromettono invece che aiutare. Pertanto, tendo ad errare sul lato di non disegnare alcuna linea di astrazione fino a quando non ho una buona idea di dove sarebbero utili.
-
Trovo difficile giustificare l'aumento della modularità fine a se stessa, se rende il mio codice più dettagliato, più difficile da capire, ecc. e non elimina alcuna duplicazione. Trovo che il codice procedurale semplice o strettamente accoppiato o il codice oggetto di Dio sia a volte più facile da capire rispetto al codice ravioli molto ben fatto perché il flusso è semplice e lineare. È anche molto più facile da scrivere.
D'altra parte, questa mentalità spesso porta a oggetti di Dio. In generale, li rifatto in modo conservativo, aggiungendo chiare linee di astrazione solo quando vedo emergere chiari schemi. Che cosa, se non altro, è sbagliato con gli oggetti di Dio e il codice strettamente accoppiato se non hai chiaramente bisogno di più modularità, non hai una duplicazione significativa e il codice è leggibile?
EDIT: Per quanto riguarda i singoli principi SOLID, intendevo sottolineare che Liskov Sostituzione è IMHO una formalizzazione del buon senso e dovrebbe essere applicata ovunque, poiché le astrazioni non hanno senso se non lo sono. Inoltre, ogni classe dovrebbe avere una singola responsabilità a un certo livello di astrazione, sebbene possa essere un livello molto alto con i dettagli di implementazione stipati in un'unica enorme classe di 2000 linee. Fondamentalmente, le tue astrazioni dovrebbero avere un senso in cui scegli di astrarre. I principi che pongo nei casi in cui la modularità non è chiaramente utile sono la segregazione open-closed, la segregazione dell'interfaccia e in particolare l'inversione di dipendenza, dal momento che si tratta di modularità, non solo di avere astrazioni sensate.