Concentriamo l'attenzione sull'evidente vantaggio in primo luogo: nel primo esempio, i controller sono per lo più indipendenti l'uno dall'altro. PlayerSelectCharacterController
non ha bisogno di conoscere la classe CharacterMoveController
o viceversa. Ciascuna di queste classi può essere sviluppata separatamente, verificata separatamente o, se necessario, collocata in diverse unità di compilazione.
Questo non è possibile nel secondo esempio: PlayerSelectCharacterController
deve sapere su CharacterMoveController
, questa è una dipendenza hardcoded.
Con solo due classi, questo potrebbe non valere la pena di pensarci, ma se il tuo gioco ha 20 o più stati, puoi facilmente ottenere un enorme albero di dipendenza, dove ogni controller dipende da ogni altro controller, forse in qualche modo ciclico .
Cosa può essere meno ovvio: nei giochi, le transizioni di stato spesso non sono così semplici come nell'esempio della tua domanda. Potrebbero esserci regole complesse su come passare da uno stato all'altro. Per un certo tipo di complessità, potrebbe essere desiderabile separare le due preoccupazioni di
- decidere sul nuovo stato e
- cambia effettivamente lo stato.
In realtà mi aspetterei che la logica che ci hai mostrato in characterSelected
si verifichi in qualche luogo al di fuori del PlayerSelectCharacterController
, forse nel parentController
( characterSelected
forse una funzione che restituisce il nuovo stato, ma l'assegnazione a globalData dovrebbe non succede direttamente in PlayerSelectCharacterController
). Ciò eviterebbe anche la necessità di chiamare parentController.stateChanged()
da PlayerSelectCharacterController
, ciò potrebbe essere fatto dal ciclo esterno, che può prevenire alcuni potenziali problemi con la ricorsione e la duplicazione del codice.
Come strategia generale, prova a costruire i singoli controllori come blocchi predefiniti , senza effetti collaterali sui dati globali e senza dipendenze dirette con altri controller dello stesso tipo. Altrimenti rischi di ottenere una "grande palla di fango" non conservabile.