Sto facendo un semplice gioco usando il re-frame (e quindi reagendo e reagendo), ma sono bloccato a un certo punto. In
affermano
Not every app has lots of logical states, but many do, and if you are implementing one of them, then formally recognising it and using a technique like state charts will help greatly in getting a clean design and a nice datamodel.
Ora, quello che mi chiedo è se dovrei implementare esplicitamente il mio gioco come macchina di stato, come link o se questo è solo per essere implicito nei gestori e db?
Fammi elaborare.
Nel mio gioco, i seguenti "stati macro" sono possibili (non ancora implementati in questo modo):
- non connesso
- connesso al server, non al gioco (nell'area "scegli il gioco")
- connesso al gioco
- creato gioco
Le transizioni sarebbero quindi
1- > 1 se si preme "connect", ma si verifica un errore di rete o si utilizza un nome utente errato
1- > 2 se premi "connect" e tutto ok
2- > 1 se si preme "connetti al gioco" e errore di rete
2- > 2 se premi "connetti al gioco" e gioco non disponibile
2- > 3 se premi "connect to game" e tutto ok
2- > 1 se si preme "crea gioco" e errore di rete
2- > 2 se si preme "create game", con qualche errore nella creazione del gioco
2- > 4 se si preme "create game", tutto ok
4- > 1 se ottengo qualche errore di rete
4- > 2 se annullo il mio gioco
4- > 3 se qualcuno si unisce al mio gioco
Ora, molto di questo sarà fatto su http, e quindi in modo asincrono. Per assicurarti di non premere "Connetti" due volte ho aggiunto un booleano "connessione al server" (e poi uno per ogni richiesta http), e poi ottengo qualcosa del tipo:
(register-handler :connect-to-server
(fn [db _])
(if (not (:connecting-to-server db))
(do
(POST ... #(dispatch [:connecting-to-server-succeeded ...] #(dispatch [:connecting-to-server-failed] )
(assoc db :connecting-to-server true))
db)))
(register-handler :connecting-to-server-succeeded
...
(-> db (assoc :connecting-to-server false) (assoc :connected-to-server true) ... ))
(register-handler :connecting-to-server-failed
...
(assoc db :connecting-to-server false) ... )
(register-sub :can-press-connect
(fn [db _]
(reaction (not :connecting-to-server)))
In pratica, quando mi collego al server, non si può fare nient'altro.
Questo si trasformerà in una grande quantità di stati, e sembra un sacco di codice boilerplate che ho intenzione di rovinare da qualche parte. Naturalmente, posso astrarre un po 'di distanza, ma credo che sia già una buona idea su come affrontarlo. Quindi le mie domande:
-
Sto reinventando un approccio brutto, vecchio stile sopra al reagente, e dovrei farlo in qualche altro modo?
-
Forse il re-frame è forse l'approccio sbagliato con così tanto network io?
-
Se l'idea è ok, sarebbe utile farlo esplicitamente tramite una macchina a stati per dire automaticamente se un pulsante può essere premuto o meno?
(Un modo migliore, a lungo termine, è probabilmente websocket, ma questa è un'esperienza di apprendimento.)