Capisco che SOLID dovrebbe realizzare 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 su tutta la mia base di codice:
Voglio evitare l'astrazione prematura. Nella mia esperienza, disegnare linee di astrazione senza casi d'uso concreti (il tipo che esiste ora o in un futuro prevedibile ) porta a disegnarli in posti sbagliati. Quando provo a modificare tale codice, le linee di astrazione si frappongono piuttosto che aiutare. Pertanto, tendo a sbagliare sul lato di non tracciare alcuna linea di astrazione fino a quando non ho una buona idea di dove sarebbero utili.
Trovo difficile giustificare la crescente modularità per se stessa se rende il mio codice più dettagliato, più difficile da capire, ecc. E non elimina alcuna duplicazione. Trovo che il codice oggetto procedurale semplice o strettamente accoppiato o 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à porta spesso agli oggetti di Dio. In genere li refactoring in modo conservativo, aggiungendo chiare linee di astrazione solo quando vedo emergere schemi chiari. Cosa c'è di sbagliato negli oggetti di Dio e nel codice strettamente accoppiato se non hai chiaramente bisogno di più modularità, non hai duplicazioni significative e il codice è leggibile?
EDIT: Per quanto riguarda i singoli principi SOLID, intendevo sottolineare che la sostituzione di Liskov è IMHO una formalizzazione del senso comune e dovrebbe essere applicata ovunque, poiché le astrazioni non hanno senso se non lo è. 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 tutti in un'enorme classe di 2.000 righe. Fondamentalmente, le tue astrazioni dovrebbero avere senso dove scegli di astrarre. I principi che metto in dubbio nei casi in cui la modularità non è chiaramente utile sono la chiusura aperta, la segregazione delle interfacce e soprattutto l'inversione delle dipendenze, poiché si tratta di modularità, non solo avere astrazioni ha senso.