À la fin de ce chapitre, vous serez capable de :
Une application mobile n'est pas un simple enchaînement d'écrans et de boutons.
C’est un ensemble de composants interconnectés, chacun avec un rôle :
L’architecture définit comment ces composants s’organisent et communiquent.
Une bonne architecture permet de construire une application :
🎯 But : concevoir des apps structurées, performantes et faciles à faire évoluer.
Une application météo comporte :
👉 On retrouve déjà les 3 rôles : afficher, décider, représenter les données.
Avant de parler de MVC ou MVVM, retenez qu’une application est presque toujours organisée en 3 grandes couches :
Interface (UI)
→ ce que l’utilisateur voit et manipule (écrans, boutons, formulaires).
Logique / État
→ ce qui décide quoi faire quand l’utilisateur agit (règles métier, état de l’app).
Données
→ où sont stockées les informations (API, base de données, localStorage, fichiers…).
Imaginons une petite app de liste de tâches en Ionic-Vue.
| Couche | Rôle | Exemple dans TaskIonic |
|---|---|---|
| Interface (UI) | Afficher les infos, gérer les clics |
TasksPage.vue, TaskItem.vue
|
| Logique / État | Gérer l’état et la logique métier |
useTasksStore.ts (Pinia) |
| Données | Lire / écrire les données |
tasksApi.ts, Task.ts
|
Quand vous ne savez pas où mettre un morceau de code, demandez-vous :
Est-ce que ça affiche quelque chose ou réagit à un clic ?
→ Interface (UI)
Est-ce que ça décide quoi faire (validation, règles métier, calcul) ?
→ Logique / État
Est-ce que ça lit / écrit des données “persistantes” (API, storage, BDD) ?
→ Données
💡 MVC, MVVM, Clean = différentes façons d’organiser ces 3 couches.
Les architectures (MVC, MVVM, Clean…) définissent comment organiser :
Objectifs communs :
Ces architectures ne sont pas propres à Android :
Questions récurrentes :
Dans notre app Ionic-Vue “TaskIonic” :
Task.ts, tasksApi.ts TasksPage.vue, TaskItem.vue useTasksStore.ts (Pinia, logique + état)🧩 Idée clé :
ce qui affiche ≠ ce qui décide ≠ ce qui stocke.
MVC = un des modèles les plus anciens et les plus répandus.
| Élément | Rôle |
|---|---|
| Model | Données + logique métier |
| View | Affichage (ce que voit l’utilisateur) |
| Controller | Lien entre View et Model |
Dans une app météo :
Avantages :
Limite :
On le retrouve (explicitement ou non) dans :
MVVM = évolution de MVC pour mieux gérer l’état et la réactivité.
| Élément | Rôle |
|---|---|
| Model | Données + logique métier |
| View | Interface graphique |
| ViewModel | Gère l’état de la vue + réagit aux interactions |
La ViewModel observe le Model :
dès qu’une donnée change, la View se met à jour (data binding).
Dans une app de notes :
Avantages :
Limites :
La Clean Architecture (Uncle Bob) sépare fortement les couches :
| Couche | Contenu |
|---|---|
| Présentation (UI) | Écrans, widgets, interactions utilisateur |
| Domaine | Logique métier pure, cas d’usage |
| Données | Accès API, BDD, fichiers, cache |
Exemple e-commerce :
Avantages :
Limites :
Avec Ionic + Vue + Pinia, on utilise une architecture proche de :
| Dossier / fichier | Couche | Rôle principal |
|---|---|---|
views/ (*.vue) |
Interface (UI) | Écrans, navigation, mise en forme |
components/ (*.vue) |
Interface (UI) | Blocs réutilisables (card, liste, bouton…) |
stores/ (Pinia) |
Logique / État | État global, règles métier, actions |
models/ (*.ts) |
Modèle / Domaine | Types, interfaces, petites fonctions métier |
services/ (*Api.ts) |
Données | Accès aux APIs, localStorage, SQLite, etc. |
Exemple TaskIonic :
TasksPage.vue) tasksStore.addTask(title) tasksApi.saveTasks(...) UI → Store (logique + état) → Service (données) → Storage / API
UI (Vue / Ionic – TasksPage.vue)
→ récupère les clics, affiche la liste
Store Pinia – useTasksStore
→ gère l’état + la logique métier (“que faire quand…”)
Service – tasksApi
→ lit / écrit les données (localStorage, API, etc.)
🎯 Vue ne sait pas “où” les données sont stockées → découplage.
Composants Vue/Ionic :
Stores Pinia :
Services :
Une application doit gérer des données qui changent dans le temps :
Ces informations constituent l’état de l’application.
Gestion d’état = maintenir et synchroniser ces données entre les différentes parties de l’app.
Exemple : panier e-commerce
💡 Toutes ces vues lisent le même état partagé.
| Environnement | Outil de gestion d’état | Particularité |
|---|---|---|
| Vue / Ionic | Pinia, Vuex | Données réactives centralisées |
| React Native | Redux, Zustand | Flux unidirectionnel, prédictible |
| Flutter | Provider, Riverpod, Bloc | Widgets qui observent l’état |
| Android | LiveData, ViewModel | Persistance d’état entre les écrans |
Dans Vue + Pinia :
isLoggedIn est stockée dans un store central 🎯 Une bonne gestion d’état = app fluide, cohérente, plus facile à déboguer.
Une application bien structurée repose sur une communication claire entre les couches.
Flux typique :
Scénario “Actualiser la météo” :
Responsabilité unique
→ chaque module fait une seule chose (Single Responsibility)
Réutilisabilité
→ une logique métier peut servir à plusieurs vues
Évolutivité
→ on peut changer une source de données (API, BDD…)
sans toucher aux écrans
💡 Résultat : plus facile à faire évoluer, plus simple à travailler en équipe.
UI ↔ Logique / État ↔ Données
Chacun son rôle, chacun sa responsabilité.
Observez une application simple (ex : app météo ou todo list).
➡️ Identifiez les 3 grandes couches : Données, Logique, Interface
➡️ Classez les fichiers / fonctions selon MVC ou MVVM
➡️ Expliquez la responsabilité de chaque partie :
- où se trouve la logique métier ?
- où sont stockées les données ?
Concevez une mini-app :
➡️ Décrivez ce qui constitue l’état de votre app
➡️ Expliquez comment cet état évolue (ajout, suppression, reset…)
➡️ Indiquez où et comment vous le stockeriez :
- Pinia / Redux / Provider…
- ou simple variable réactive
On vous donne un code “tout dans un fichier”.
➡️ Réorganisez-le selon MVC ou MVVM
➡️ Identifiez :
- ce qui relève du Model
- ce qui relève de la View
- ce qui relève du Controller / ViewModel
🎯 Objectif : expérimenter la refactorisation vers une architecture claire.
Android Jetpack – Architecture Guide
https://developer.android.com/jetpack/guide
Apple Developer – MVC & MVVM Patterns
https://developer.apple.com/library/archive/documentation/General/Conceptual/DevPedia-CocoaCore/MVC.html
Flutter – State Management
https://docs.flutter.dev/data-and-backend/state-mgmt
Vue.js – State Management (Pinia)
https://pinia.vuejs.org
Clean Architecture – Robert C. Martin (“Uncle Bob”)
https://blog.cleancoder.com/