Implémentation de State Machine dans l’application Android – Yolanda Septiana
Je suis sûr que vous avez tous vu ce type de code:
En fait, cela n’a pas l’air si mauvais, mais à mesure que vos branches se développent, cela ajoutera une charge cognitive chaque fois que vous lirez les lignes. De plus, que se passe-t-il lorsque vous écrivez ceci?
Cela n’a même pas de sens et est en fait un cas non valide, c’est-à-dire que votre application ne gère pas cela, mais il est accessible en écriture et rien ne peut l’invalider.
Un outil qui peut vous aider à maintenir ce type de complexité est une machine à états. Il existe de nombreuses façons d’implémenter une machine à états dans votre code, à commencer par des machines à états personnalisées simples aux machines à états formelles qui acceptent les états et les entrées.
Qu’est-ce qu’une machine d’état?
Si vous avez suivi un cours sur les automates au collège, cela devrait vous être familier. Il s’agit d’un modèle informatique composé d’états et de fonctions de transition. Une fonction de transition lit une entrée et détermine l’état suivant. Un programme ne peut pas être dans deux états à un moment donné.
Commençons par un exemple: récupérer des données à partir d’un point de terminaison. Le programme peut avoir 3 états: chargement, réussite et erreur. Une machine d’état a également un état de départ, qui est ici coïncidence nommé «non démarré», mais vous pouvez le nommer comme vous le souhaitez. Ici, l’état de départ indique que l’API n’est pas encore appelée.
Lorsqu’un utilisateur ouvre un écran, l’écran commence à récupérer les données, de sorte que l’état passe au «chargement». Si l’appel d’API renvoie succès / erreur, l’état passe à SUCCESS
/ERROR
respectivement. Après cela, si l’utilisateur rafraîchit l’écran, l’état revient à LOADING
. Nous pourrions appeler l’annotation « chercher », « erreur », « succès », « rafraîchir » un un événement ou contribution. La fonction de transition reçoit l’état actuel et une entrée et détermine l’état suivant.
Tout programme significatif a toujours des effets secondaires. Ces effets secondaires sont le résultat de la transition de l’état A à B. Par exemple, lorsque l’état passe de NOT_STARTED
à LOADING
via l’événement aller chercher, le programme affiche la barre de progression à l’écran et récupère certaines données du serveur.
Plongeons-nous dans le code. Tout d’abord, nous définissons les états (lors du dessin du diagramme, vous devez également commencer par définir les états). le ERROR
et SUCCESS
les États ont des charges utiles. Nous utilisons également une classe scellée pour nous assurer que les États sont tous au même endroit.
Ensuite, nous construisons la machine d’état. Il a l’état actuel et plusieurs fonctions de transition. Je construis les fonctions de transition comme des fonctions littérales parce que ce n’est qu’une petite machine, donc je suis d’accord avec ça. Vous voudrez peut-être l’implémenter de la bonne manière, cependant. N’oubliez pas qu’une fonction de transition accepte un état et une entrée.
La fonction de transition valide également l’événement. Par exemple, si l’état actuel n’est pas LOADING
, puis l’appel à success()
ne changerait rien. En règle générale, vous voudriez faire quelque chose lorsque l’état actuel passe de A à B, cela s’appelle des effets secondaires. Dans le code ci-dessus, j’ai mis une fonction de rappel onStateChanged
qui sera invoqué après chaque changement d’état.
Enfin, ci-dessous est un exemple d’une demande de réseau dans un écran. Lorsque l’État est LOADING
, les données seront récupérées et une vue de chargement s’affiche. La fonction fetchData
appellera success()
ou error()
sur la base du résultat de l’appel API.
Bibliothèques
Cette bibliothèque de Tinder vaut le détour:
Toute une catégorie de bibliothèques Finite State Machine sur Android-Arsenal: