Questa è una specie di domanda successiva a questo link , ma volevo postarlo separatamente, perché il suo tipo di argomento diverso.
Sto lavorando a un gioco di carte multiplayer per la piattaforma Android. Ho diviso il progetto in MVC che si adatta abbastanza bene ai bisogni, ma al momento sono bloccato perché non riesco a capire un buon modo per comunicare tra le diverse parti.
Ho tutto configurato e funziona con il controller che è una grande macchina a stati, che viene chiamata più e più volte dal gameloop, e chiama i metodi getter dalla GUI e dalla parte Android / network per ottenere l'input. L'input stesso nella GUI e nella rete è impostato dagli elenchi di input che impostano una variabile locale che ho letto nel metodo getter.
Fin qui tutto bene, funziona. Ma il mio problema è che il controller deve controllare ogni input separatamente, quindi se voglio aggiungere un input devo verificare in quali stati è valido e chiamare il metodo getter da tutti questi stati. Questo non è buono, e lascia che il codice appaia piuttosto brutto, rende le aggiunte scomode e aggiunge ridondanza.
Quindi quello che ho ottenuto dalla domanda che ho menzionato sopra è che qualche tipo di comando o schema di eventi si adatta alle mie esigenze. Quello che voglio fare è creare una coda condivisa e protetta dal codice nel controller e invece di chiamare tutti questi metodi getter, controllo la coda per un nuovo input e procedo. Dall'altro lato, la GUI e la rete non hanno tutti questi getter, ma creano invece un evento o comando e lo inviano al controllore attraverso, ad esempio, osservatore / osservabile.
Ora il mio problema: non riesco a capire un modo, perché questi comandi / eventi si adattino a un'interfaccia comune (che la coda può memorizzare) e continuino a trasportare diversi tipi di dati (clic sui pulsanti, schede riprodotte, ID giocatore da cui proviene il comando, dati di sincronizzazione ecc.).
Se progetto la comunicazione come modello di comando, devo conservare tutte le informazioni necessarie per eseguire il comando quando è stato creato, è impossibile perché la GUI o la rete non hanno alcuna conoscenza di tutte le cose che il controller deve Esegui cose che devono essere fatte quando ad esempio viene giocata una carta.
Ho pensato di portare questa roba nel comando durante l'esecuzione. Ma su tutti i diversi comandi che ho, avrei bisogno di tutte le informazioni che il controller ha, e quindi dare al comando un riferimento al controller che renderebbe tutto ciò che è in esso pubblico, il che è un vero e proprio cattivo design, immagino.
Quindi, potrei provare una specie di modello di evento. Devo trasportare i dati nell'evento. Quindi, come il comando, avrei un'interfaccia, che tutti gli eventi hanno in comune, e può essere archiviata nella coda condivisa. Potrei creare una grande enumerazione con tutti i diversi eventi che sono possibili, salvare una di queste enumerazioni nell'evento reale e costruire un grande caso per gli eventi, per procedere a cose diverse per diversi eventi.
Il problema qui: ho dati diversi per tutti gli eventi. Ma ho bisogno di un'interfaccia comune, per memorizzare gli eventi in una coda. Come ottengo i dati specifici, se posso accedere all'evento solo tramite l'interfaccia?
Anche se questo non sarebbe un problema, sto creando un altro grande caso di switch, che sembra brutto, e quando voglio aggiungere un nuovo evento, devo creare l'evento stesso, il caso, l'enum, e il metodo chiamato con i dati.
Potrei ovviamente controllare l'evento con l'enum e lanciarlo nel suo tipo, quindi posso chiamare metodi specifici del tipo di evento che mi forniscono i dati di cui ho bisogno, ma anche questo sembra un cattivo progetto.