Poiché la tua domanda copre un sacco di motivi, con molte ipotesi, esporrò l'argomento della tua domanda:
Why do we need so many classes in design patterns
Non lo facciamo. Non esiste una regola generalmente accettata che dice che ci devono essere molte classi nei modelli di progettazione.
Esistono due guide fondamentali per decidere dove inserire il codice e come tagliare i compiti in diverse unità di codice:
- Coesione: qualsiasi unità di codice (sia esso un pacchetto, un file, una classe o un metodo) dovrebbe appartenere insieme . Ad esempio, qualsiasi metodo specifico dovrebbe avere un task one e farlo bene. Qualsiasi classe dovrebbe essere responsabile dell'argomento one (qualunque cosa sia). Vogliamo un'elevata coesione.
- Accoppiamento: qualsiasi coppia di codice dovrebbe dipendere il meno possibile l'una dall'altra - in particolare non dovrebbero esserci dipendenze circolari. Vogliamo un accoppiamento basso.
Perché quei due dovrebbero essere importanti?
- Coesione: un metodo che fa un sacco di cose (ad esempio, uno script CGI vecchio stile che fa GUI, logica, accesso DB ecc. tutto in un lungo pasticcio di codice) diventa ingombrante. Al momento della stesura di questo articolo, si è tentati di mettere il tuo treno di pensieri in un metodo lungo. Funziona, è facile da presentare e così, e puoi farcela. I problemi sorgono più tardi: dopo alcuni mesi, potresti dimenticare ciò che hai fatto. Una riga di codice in alto potrebbe essere a poche schermate da una linea in basso; è facile dimenticare tutti i dettagli. Qualsiasi modifica in qualsiasi parte del metodo può rompere qualsiasi quantità di comportamenti della cosa complessa. Sarà abbastanza ingombrante per refactoring o riutilizzare parti del metodo. E così via.
- Accoppiamento: ogni volta che cambi un'unità di codice, puoi rompere potenzialmente tutte le altre unità che dipendono da essa. In linguaggi rigorosi come Java, è possibile ottenere suggerimenti durante la compilazione (ad esempio, sui parametri, sulle eccezioni dichiarate e così via). Ma molti cambiamenti non stanno innescando tale (cioè cambiamenti comportamentali), e altre, più dinamiche, lingue, non hanno tali possibilità. Più alto è l'accoppiamento, più difficile è cambiare qualcosa e potresti fermarti, dove è necessaria una completa riscrittura per raggiungere un obiettivo.
Questi due aspetti sono i "driver" di base per qualsiasi scelta di "dove mettere cosa" in qualsiasi linguaggio di programmazione e qualsiasi paradigma (non solo OO). Non tutti ne sono consapevoli esplicitamente, e ci vuole tempo, spesso anni, per ottenere un sentimento davvero radicato e automatico su come questi software influenzano.
Ovviamente, questi due concetti non ti dicono nulla su cosa effettivamente fare . Alcune persone sbagliano dalla parte di troppo, altre dalla parte di troppo poco. Alcuni linguaggi (guardandoti qui, Java) tendono a favorire molte classi a causa della natura estremamente statica e pedante del linguaggio stesso (questa non è un'istruzione di valore, ma è ciò che è). Ciò diventa particolarmente evidente quando lo si confronta con linguaggi dinamici e più espressivi, ad esempio Ruby.
Un altro aspetto è che alcune persone si iscrivono all'approccio agile del solo codice di scrittura che è necessario adesso , e al refactoring molto più tardi, quando necessario. In questo stile di sviluppo, non creerai un interface
quando hai solo una classe di implementazione. Dovresti semplicemente implementare la classe concreta. Se, in seguito, hai bisogno di una seconda classe, dovresti refactoring.
Alcune persone semplicemente non funzionano in questo modo. Creano interfacce (o, più in generale, classi di base astratte) per qualsiasi cosa possa mai essere usata più in generale; questo porta rapidamente all'esplosione di classe.
Ancora, ci sono argomenti a favore e contro, e non importa quale io o voi preferiate. Nella tua vita di sviluppatore di software, incontrerai tutti gli estremi, dai lunghi metodi di spaghetti, ai progetti di classe illuminati, appena grandi abbastanza, fino a schemi di classi incredibilmente esplosi che sono molto più ingegnosi. Man mano che diventi più esperto, crescerai di più in ruoli "architettonici" e potrai iniziare a influenzarlo nella direzione che desideri. Scoprirai un centro d'oro per te stesso e troverai comunque che molte persone non saranno d'accordo con te, qualunque cosa tu faccia.
Quindi, mantenere una mente aperta è il punto più importante, qui, e questo sarebbe il mio primo consiglio per te, visto che sembri molto doloroso per il problema, a giudicare dal resto della tua domanda ...