Modèle-vue-contrôleurModèle-vue-contrôleur ou MVC est un motif d'architecture logicielle destiné aux interfaces graphiques, lancé en 1978 et très populaire pour les applications web. Le motif est composé de trois types de modules ayant trois responsabilités différentes : les modèles, les vues et les contrôleurs.
Ce motif est utilisé par de nombreux frameworks pour applications web tels que Ruby on Rails, Grails, ASP.NET MVC, Spring, Struts, Symfony, Apache Tapestry, Laravel, AdonisJS[1], Django ou AngularJS. HistoireLe motif MVC a été créé par Trygve Reenskaug lors de sa visite du Palo Alto Research Center (abr. PARC) en 1978[2]. Le nom original est thing model view editor pattern, puis il a été rapidement renommé model-view-controller pattern[2]. Le patron MVC a été utilisé la première fois pour créer des interfaces graphiques avec le langage de programmation Smalltalk en 1980[2]. DescriptionUne application conforme au motif MVC comporte trois types de modules : les modèles, les vues et les contrôleurs[3].
DépendancesLe modèle est indépendant des autres modules. Il ne se sert ni de la vue ni du contrôleur, il peut cependant leur envoyer des messages[4]. Il y a deux liens entre la vue et le modèle : premièrement la vue lit les données du modèle et deuxièmement reçoit des messages provenant du modèle[4]. Dans la mesure où une vue est associée à un modèle et un modèle est indépendant, un même modèle peut être utilisé par plusieurs vues[4]. Les aspects de la gestion des entrées/sorties de l'interface utilisateur sont techniquement très différents et ont des interdépendances faibles[6]. La gestion des entrées est déléguée au contrôleur alors que la gestion des sorties est à la charge de la vue[6]. La vue est dépendante du modèle. Elle interroge celui-ci pour en afficher une représentation. Le contrôleur dépend de la vue et du modèle : la vue comporte des éléments visuels que l'utilisateur peut actionner[4]. Le contrôleur répond aux actions effectuées sur la vue et modifie les données du modèle[4]. Dans le cas d'un view model, le modèle contient les données que le contrôleur transmet à la vue[3]. Dans le cas d'un domain model il contient toutes les données en rapport avec l'activité, ainsi que la logique des opérations de modification et de validation des données[3]. MVP et MVVMLes motifs model-view-presenter (MVP) et model-view-view model (MVVM) sont semblables au motifs modèle-vue-contrôleur, à quelques différences près[7].
Dans les applications webLe motif MVC a été créé dans le but de mettre en œuvre des interfaces utilisateur[3]. Certains détails sont alignés avec le langage Smalltalk, mais les grandes lignes peuvent s'appliquer à n'importe quel environnement[3]. Le cycle action → mise à jour → affichage induit par ce patron est bien adapté aux applications web[3]. De plus le patron impose la séparation des préoccupations, et les balises HTML sont ainsi confinées aux vues, ce qui améliore la maintenabilité de l'application[3]. C'est le framework pour applications web Ruby on Rails qui a apporté un regain d'intérêt pour ce patron[3]. Ce patron est utilisé par de nombreux frameworks pour applications web tels que Ruby on Rails, Django, ASP.NET MVC, Spring, Struts ou Apache Tapestry[2]. Dans la mise en œuvre classique du patron MVC, la vue attend des modifications du modèle, puis modifie la présentation des éléments visuels correspondants[8]. Cette mise en œuvre est appliquée pour les applications de bureau avec des framework comme Swing[8]. Le protocole HTTP ne permet pas cette mise en œuvre pour les applications web. Pour ces dernières, lors d'une action de l'utilisateur, le contenu de la vue est recalculé puis envoyé au client[8]. Flux de traitementEn résumé, lorsqu'un client envoie une requête à l'application :
AvantagesUn avantage apporté par ce modèle est la clarté de l'architecture qu'il impose. Cela simplifie la tâche du développeur qui tenterait d'effectuer une maintenance ou une amélioration sur le projet. En effet, la modification des traitements ne change en rien la vue. Par exemple on peut passer d'une base de données de type SQL à XML en changeant simplement les traitements d'interaction avec celle-ci, et les vues ne s'en trouvent pas affectées. Le MVC montre ses limites dans le cadre des applications utilisant les technologies du web, bâties à partir de serveurs d'applications[réf. nécessaire]. Des couches supplémentaires sont alors introduites ainsi que les mécanismes d'inversion de contrôle et d'injection de dépendances[9]. Différence avec l'architecture trois niveaux (3-tiers)L'architecture trois niveaux (3-tier) est un modèle en couches, c'est-à-dire que chaque couche communique seulement avec ses couches adjacentes (supérieures et inférieures) et le flux de contrôle traverse le système de haut en bas. Les couches supérieures contrôlent les couches inférieures, c'est-à-dire que les couches supérieures sont toujours sources d'interaction (clients) alors que les couches inférieures ne font que répondre à des requêtes (serveurs). Dans le modèle MVC, il est généralement admis que la vue puisse consulter directement le modèle (lecture) sans passer par le contrôleur. Par contre, elle doit nécessairement passer par le contrôleur pour effectuer une modification (écriture). Ici, le flux de contrôle est inversé par rapport au modèle en couches, le contrôleur peut alors envoyer des requêtes à toutes les vues de manière qu'elles se mettent à jour. Dans l'architecture trois niveaux, si une vue modifie les données, toutes les vues concernées par la modification doivent être mises à jour, d'où l'utilité de l'utilisation du MVC au niveau de la couche de présentation. La couche de présentation permet donc d'établir des règles du type « mettre à jour les vues concernant X si Y ou Z sont modifiés ». Mais ces règles deviennent rapidement trop nombreuses et ingérables si les relations logiques sont trop élevées. Dans ce cas, un simple rafraîchissement des vues à intervalle régulier permet de surmonter aisément ce problème. Il s'agit d'ailleurs de la solution la plus répandue en architecture trois niveaux, l'utilisation du MVC étant moderne et encore marginale. Exemples d’architecture MVCEn ASP.NET
En C++
En JavaScript
En TypeScriptEn ECMAScript
En GroovyEn Java
En Objective-CEn PerlFrameworks orientés Web en Perl :
En PHPFrameworks basés sur l'architecture MVC :
L'utilisation d'un Framework n'est pas une obligation[10]. En PythonEn RubyVoir aussi
Notes et références
|