Ci sto pensando da giorni e non sono ancora sicuro di cosa fare. Sto cercando di riformattare un sistema di combattimento in PHP (... mi dispiace.) Ecco cosa esiste finora:
- Esistono due (finora) tipi di entità che possono partecipare al combattimento. Chiamiamoli giocatori e NPC. I loro dati sono già scritti abbastanza bene.
- Quando sono coinvolti in un combattimento, queste entità sono avvolte da un altro oggetto nel DB chiamato a
Combatant
, che fornisce loro informazioni sul combattimento particolare. Possono essere coinvolti in più combattimenti contemporaneamente. - Sto cercando di scrivere il motore logico per il combattimento facendo iniettare i combattenti al suo interno.
- Voglio essere in grado di deridere tutto per i test.
Per separare logica e dati, voglio avere due interfacce / classi base, una essendo ICombatantData
e l'altra ICombatantLogic
. I due implementatori di dati saranno uno per gli oggetti reali archiviati nel database e l'altro per i miei oggetti finti.
Ora sto incontrando incertezze nel progettare il lato logico delle cose. Posso avere un implementatore per ciascuno dei giocatori e degli NPC, ma poi ho un problema. Un combattente deve essere in grado di restituire l'entità che avvolge. Questo metodo getter dovrebbe essere parte della logica o dei dati? Sento fortemente che dovrebbe essere nei dati, perché la parte logica viene utilizzata per eseguire il combattimento e non sarà disponibile se qualcuno sta solo cercando informazioni su un combattimento imminente. Ma le classi di dati separano solo il mock dal DB, non il player dall'NPC. Se provo ad avere due classi secondarie dell'implementatore di dati DB, una per ciascun tipo di entità, come posso progettarla mantenendo le mock nel loop? Ho bisogno di una terza interfaccia come IEntityProvider
quella che inserisco nelle classi di dati?
Inoltre, con alcune delle idee che ho preso in considerazione, mi sento come se dovessi mettere in atto dei controlli per assicurarmi di non abbinare le cose, come fare la logica per un NPC che avvolge accidentalmente i dati per un giocatore. Ha senso? È una situazione che sarebbe possibile anche se l'architettura fosse corretta o il giusto design lo proibirebbe completamente, quindi non ho bisogno di controllarlo?
Se qualcuno potesse aiutarmi a impaginare un diagramma di classe o qualcosa del genere, mi aiuterebbe molto. Grazie.
modificare
Utile anche da notare, la classe di dati finti non ha davvero bisogno del Entity
, dal momento che specificherò direttamente tutti i parametri come le statistiche di combattimento. Quindi forse ciò influirà sul design corretto.
Combatant.entity
non è usata durante il combattimento e quindi non dovrebbe esistere. Forse hai bisogno di un'altra classe come quellaEntityVsEntityCombat
che avvolge la logica di combattimento, contieneEntity <--> Combatant
mappature e aggiorna gliEntity
stati dopo che il combattimento è finito? Forse qualche informazione in più sulla tua attuale architettura potrebbe aiutare.