Penso che questa potrebbe essere una meta-risposta controversa, e sono un po 'in ritardo alla festa, ma penso che sia molto importante menzionarlo qui, perché penso di sapere da dove vieni.
Il problema con il modo in cui vengono utilizzati i modelli di progettazione è che quando vengono insegnati, presentano un caso come questo:
Hai questo scenario specifico. Organizza il tuo codice in questo modo. Ecco un esempio intelligente, ma in qualche modo inventato.
Il problema è che quando inizi a fare vera ingegneria, le cose non sono così semplici. Il modello di progettazione che leggi non si adatta perfettamente al problema che stai cercando di risolvere. Per non parlare del fatto che le biblioteche che stai usando violano totalmente tutto ciò che è indicato nel testo spiegando questi schemi, ognuno nel suo modo speciale. Di conseguenza, il codice che scrivi "sembra sbagliato" e fai domande come questa.
Inoltre, vorrei citare Andrei Alexandrescu, quando si parla di ingegneria del software, che afferma:
L'ingegneria del software, forse più di qualsiasi altra disciplina ingegneristica, mostra una ricca molteplicità: puoi fare la stessa cosa in tanti modi corretti e ci sono infinite sfumature tra giusto e sbagliato.
Forse questo è un po 'esagerato, ma penso che questo spieghi perfettamente un ulteriore motivo per cui potresti sentirti meno sicuro del tuo codice.
È in momenti come questo che la voce profetica di Mike Acton, motore di gioco di Insomniac, mi urla nella testa:
CONOSCI I TUOI DATI
Sta parlando degli input per il tuo programma e degli output desiderati. E poi c'è questa gemma di Fred Brooks del Mythical Man Month:
Mostrami i tuoi diagrammi di flusso e nascondi i tuoi tavoli, e io continuerò a essere sconcertato. Mostrami i tuoi tavoli e di solito non avrò bisogno dei tuoi diagrammi di flusso; saranno ovvi.
Quindi, se fossi in te, ragionerei sul mio problema in base al mio tipico caso di input e se raggiungesse l'output corretto desiderato. E fai domande come questa:
- I dati di output del mio programma sono corretti?
- Viene prodotto in modo efficiente / rapido per il mio caso di input più comune?
- Il mio codice è abbastanza facile da ragionare a livello locale, sia per me che per i miei compagni di squadra? In caso contrario, posso renderlo più semplice?
Quando lo fai, la domanda su "quanti strati di astrazione o modelli di progettazione sono necessari" diventa molto più facile rispondere. Di quanti strati di astrazione hai bisogno? Quante necessarie per raggiungere questi obiettivi, e non di più. "Che dire dei modelli di design? Non ne ho usato nessuno!" Bene, se gli obiettivi di cui sopra sono stati raggiunti senza l'applicazione diretta di un modello, allora va bene. Fallo funzionare e passa al problema successivo. Inizia dai tuoi dati, non dal codice.