09-12-2018, 10:42 PM
(08-12-2018, 03:26 AM)Meraxes a écrit : Quand vous parlez de "machine à état", vous parlez bien "d'automate fini" ou ça a un sens plus large/différent pour vous ?
En fait, je n'ai pas bien compris dans quel cas tu voudrais faire "planter la machine" côté serveur ? Car si l'action n'est pas valide depuis l'état courant de la machine, on peut juste considérer qu'il n'y a pas de transition entre état, non ? (Ou bien ajouter une transition de l'état vers lui même)
Après on peut très bien ajouter des états d'erreurs dans un automate pour gérer certaines actions abusives ; les deux façons de faire me semblent possibles.
Les states machines d'Erlang/OTP (et Elixir, du coup) plantent quand elles reçoivent un message inattendu. Elles sont immédiatement relancées par leur superviseur. Ça fait partie de la philosophie du truc (peu de code défensif, just let it crash).
(09-12-2018, 10:01 PM)Argorate a écrit : pour moi il faut dissocier la machine à état et le client qui interagit avec le serveur.
Le client ne doit pas pouvoir changer la machine à état directement, il doit passer par un truc intermédiaire (middleware) qui reçoit les events, et c'est lui qui gère s'il va ou non changer l'état de la state-machine, quand et comment et le cas échéant ne rien faire et retourner une erreur, mais c'est pas à la machine à état de gérer.
En master on faisait des state machine et le principe était de toujours faire comme si c'était forcément ok, c'est pas le bon endroit pour gérer les erreurs. La machine à état ne doit QUE appliquer le code de son état.
La question est justement de savoir où faire les essais. Dans mon exemple, il y a un navigateur, un serveur WebSocket et un serveur de jeu. Ce sont donc les appels au serveur WebSocket qui font office de middleware.
J'ai implémenté le jeu du "6 qui prend" (tu connais ? :p). Quand le serveur WebSocket reçoit un message de type : dans la partie 42, le joueur Matrix joue la carte 104. Est-ce que c'est à ce serveur WebSocket de s'assurer que les règles sont respectées ? Que le joueur Matrix en fait bien partie ? Que c'est bien le moment de choisir une carte ? Qu'il possède bien la carte 104 en main ? Ou bien transmet-il le message à la machine a état qui elle va s'assurer de ça ?
Les deux solutions sont possibles et présentent chacune des avantages et des inconvénients.