Penso che questa potrebbe essere una meta-risposta controversa, e sono un po 'in ritardo per la 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:
You have this specific scenario. Organize your code this way. Here's a smart-looking, but somewhat contrived example.
Il problema è che quando inizi a fare l'ingegneria vera e propria, le cose non sono del tutto trucidanti. Il modello di progettazione che leggi non si adatta perfettamente al problema che stai cercando di risolvere. Per non parlare del fatto che le librerie che stai usando violano totalmente tutto ciò che è stato enunciato nel testo, spiegando questi modelli, ognuno nel suo modo speciale. E come risultato, il codice che scrivi "si sente sbagliato" e tu fai domande come questa.
In aggiunta a questo, vorrei citare Andrei Alexandrescu, quando si parla di ingegneria del software, che afferma:
Software engineering, maybe more than any other engineering discipline, exhibits a rich multiplicity: You can do the same thing in so many correct ways, and there are infinite nuances between right and wrong.
Forse è 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 protagonista di Insomniac, mi urla in testa:
KNOW YOUR DATA
Sta parlando degli input per il tuo programma e delle uscite desiderate. E poi c'è questa gemma di Fred Brooks del Mythical Man Month:
Show me your flowcharts and conceal your tables, and I shall continue to be mystified. Show me your tables, and I won’t usually need your flowcharts; they’ll be obvious.
Quindi, se fossi in te, ragionerei sul mio problema in base al mio tipico caso di input e se otterrà l'output corretto desiderato. E fai domande come questa:
- I dati di output del mio programma sono corretti?
- Viene prodotto in modo efficiente / veloce 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 semplificarlo?
Quando lo fai, la domanda su "quanti livelli di astrazione o schemi di progettazione sono necessari" diventa molto più facile rispondere. Quanti strati di astrazione hai bisogno? Tanti quanti sono necessari per raggiungere questi obiettivi, e non di più. "E i modelli di design? Non ne ho mai usato nessuno!" Bene, se gli obiettivi di cui sopra sono stati raggiunti senza l'applicazione diretta di un modello, allora va bene. Falla funzionare e passa al prossimo problema. Inizia dai tuoi dati, non dal codice.