MVI - Kasimashi/Systemes-embarques GitHub Wiki

Architecture MVI (Model - View - Intent)

L’architecture MVI est un modèle de conception utilisé surtout dans les applications réactives (mobile ou web).
Elle vise à rendre l’état de l’application prévisible en adoptant un flux de données unidirectionnel et basé sur des intentions (Intents).

1. Model (État)

Le Model représente l’état de l’application à un moment donné.

Rôle :

  • Contenir toutes les données nécessaires à la View
  • Être immutable (chaque modification produit un nouvel état)
  • Représenter l’état complet de l’interface

Exemple :

  • UserListState avec :
    • isLoading
    • users
    • error

2. View (Vue)

La View affiche l’état du Model et déclenche des intents selon les actions utilisateur.

Rôle :

  • Observer l’état du Model
  • Mettre à jour l’interface en fonction de l’état
  • Envoyer les intentions (actions utilisateur) au Presenter/IntentHandler

Exemple :

  • Bouton “Rafraîchir la liste”
  • Zone d’affichage des utilisateurs ou des erreurs

3. Intent (Intention)

L’Intent capture les actions ou événements utilisateur et les transforme en changements d’état.

Rôle :

  • Recevoir les actions utilisateur
  • Définir ce que l’on veut faire (“charger les utilisateurs”, “supprimer un élément”)
  • Envoyer ces intentions au Reducer ou à la logique qui mettra à jour le Model

Exemple :

  • LoadUsersIntent
  • DeleteUserIntent

4. Flux unidirectionnel

  1. La View déclenche une Intent (action utilisateur)
  2. L’Intent est traitée pour produire un nouvel état du Model
  3. La View observe le Model et se met à jour automatiquement
  4. Cycle répété à chaque interaction utilisateur

Différences clés avec MVC/MVP/MVVM

  • Flux de données unidirectionnel et prévisible
  • Le Model représente l’état complet plutôt que juste les données
  • La View ne modifie jamais directement le Model
  • Adapté aux architectures réactives et frameworks comme RxJava, Redux, Jetpack Compose

Avantages

  • État de l’application toujours prévisible
  • Synchronisation automatique entre état et interface
  • Facile à tester et déboguer
  • Convient aux interfaces complexes et interactives

Exemple concret

Dans une application mobile :

  • Model : UserListState { isLoading, users, error }
  • View : affiche la liste des utilisateurs et le spinner
  • Intent : action “charger la liste des utilisateurs”
  • Flow : Intent → traitement → nouvel état → View mise à jour

En résumé :
MVI organise les applications autour de l’état immuable, des intentions utilisateur, et d’un flux unidirectionnel, garantissant que l’interface reflète toujours l’état actuel de manière prévisible.