In the below example of a Town class, the behavior of moving to/from a town is split up among the Town class and Inhabitant class. The code works. But I am wondering if there are compelling reasons to assign this behavior to only one class, e.g. allow the Town method addpeople
to update the Inhabitant attribute town so it's possible to track each inhabitant's place of residence.
C'è in realtà una buona ragione per non assegnare questo comportamento a una sola classe e mantenerla simile a ciò che si ha - nella programmazione orientata agli oggetti si vuole veramente che ogni oggetto mantenga il controllo sui propri dati. Il tuo codice può facilmente diventare molto complicato e difficile da eseguire il debug se si modificano variabili al di fuori dell'oggetto a cui appartiene la variabile. Questo fa parte del concetto di incapsulamento che è centrale nella programmazione orientata agli oggetti.
Un'altra parte di OOP che è rilevante qui è l'astrazione, cioè l'interazione tra gli oggetti nel tuo codice ha senso ad un livello più alto. Solo osservando questo codice di esempio, I indicherebbe che gli abitanti delle città sono più al centro del tuo programma rispetto alle città stesse. Se l'utente sta interagendo maggiormente con la città, I si aspetta che la città faccia più lavoro ( Town.addpeople
chiama Inhabitant.move
, ad esempio).
Così come stai scrivendo il tuo programma, pensa a quali entità faranno il lavoro. Quando il tuo codice combacia con la tua astrazione intuitiva di ciò che sta accadendo, sarà molto più facile per te tenere traccia di ciò che sta succedendo e non introdurre bug nel tuo codice.
Un altro consiglio che ti darò potrebbe essere utile o meno, a seconda del progetto. Se questo è un programma che stai effettivamente usando, mantenendo e aggiornando, scrivi prima un prototipo "usa e getta" . Come ha detto Joel Cornett nel commento, " Dipende dal caso d'uso ", il che significa che per conoscere il modo migliore per scrivere il codice devi capire la situazione. Parte di questo viene dall'esperienza, ma a meno che tu non stia scrivendo continuamente lo stesso programma più e più volte, ti imbatterai in una situazione che non è del tutto familiare. Scrivere un prototipo è un modo eccellente per fare esperienza con il problema specifico che stai affrontando, perché spesso non sarai in grado di capire perché in un modo o nell'altro funzionerà meglio finché non sarai abbastanza avanti nella scrittura del programma.
Una cosa che impedisce alle persone di creare un buon sistema è che vengano attaccati al loro codice. Quindi, se scegli di scrivere un prototipo, renditi conto che è un espediente - qualcosa che scrivi rapidamente solo allo scopo di ottenere una buona sensazione per il problema. Può anche aiutare se ti rendi conto mentre stai scrivendo che non ha nemmeno bisogno di lavorare, a patto che ti aiuti a capire cosa ci vorrebbe perché funzioni bene. Una volta che hai scritto il tuo prototipo, avrai una sensazione molto migliore di come dovresti aver scritto il tuo codice. Quindi puoi ricominciare e scrivere correttamente molto più velocemente.
In breve, " Dipende dal caso d'uso ", quindi assicurati di aver compreso il caso d'uso e che il codice corrisponda alla tua comprensione.