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 ICombatantDatae 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 IEntityProviderquella 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.entitynon è usata durante il combattimento e quindi non dovrebbe esistere. Forse hai bisogno di un'altra classe come quellaEntityVsEntityCombatche avvolge la logica di combattimento, contieneEntity <--> Combatantmappature e aggiorna gliEntitystati dopo che il combattimento è finito? Forse qualche informazione in più sulla tua attuale architettura potrebbe aiutare.