Le classi non sono l'unico meccanismo per creare astrazioni. Pacchetti e spazi dei nomi sono altri. Quindi, quando hai molti concetti molto correlati ma differenziati, mettili nello stesso spazio dei nomi - non aver paura di creare troppe classi.
Una cosa importante di una singola classe è la sua durata di utilizzo. La durata della classe e tutti i suoi campi di istanze dovrebbero essere uguali. Idealmente, ogni campo di istanza è completamente rilevante per l'oggetto durante la sua intera vita. (È necessario un giudizio: possono esserci eccezioni per un oggetto che impiega alcuni metodi per inizializzarsi completamente, o per abbattere completamente).
Possiamo lavorare su questo pensiero di coesione della vita in entrambe le direzioni:
Elenca tutti i possibili concetti e considerali come candidati seri per la loro classe separata. Lavora con esso e, se risulta che due (o più) di quelle classi vengono sempre create (e distrutte / lasciate andare) insieme, suggerisce che potresti unirle insieme - ciò può essere fatto per composizione, ereditarietà, o semplicemente unendoli in un unico concetto (rimuovendo l'altro).
Se vai dall'altra parte, puoi creare solo le classi che ritieni siano concetti indipendenti e dividerle quando trovi che all'interno della classe, i campi dell'istanza raggruppano in modo tale che alcuni dei campi siano irrilevanti durante la vita di alcuni oggetti .
In pratica potremmo trovare entrambi: a volte trovare casi in cui dovremmo dividere e altri dove dovremmo fonderci. Usa la nozione di vita come guida per decidere quando.
Idealmente (IMHO) poniamo poco o nessuno stato in Program
e l'unica logica in main
crea un'istanza di qualcosa di utile e la attiva - basta usare Program
. main
come un ponte tra il non -un punto di ingresso e il sistema degli oggetti; in questo modo il resto del codice è completamente orientato agli oggetti.