D'après mon expérience, dans un programme de bureau traditionnel, le contrôleur se retrouve spaghetti dans la vue. La plupart des gens ne prennent pas le temps de factoriser une classe de contrôleurs.
Modèles de conception dans Smalltalk MVC
Le triade de classes Modèle / Vue / Contrôleur (MVC) [KP88] est utilisée pour créer des interfaces utilisateur dans Smalltalk-80. L'examen des modèles de conception dans MVC devrait vous aider à comprendre ce que nous entendons par le terme "modèle".
MVC se compose de trois types d'objets. Le modèle est l'objet d'application, la vue est sa présentation à l'écran et le contrôleur définit la manière dont l'interface utilisateur réagit aux entrées de l'utilisateur. Avant MVC, les conceptions d'interface utilisateur avaient tendance à regrouper ces objets. MVC les dissocie pour augmenter la flexibilité et la réutilisation.
MVC dissocie les vues et les modèles en établissant un protocole de souscription / notification entre eux. Une vue doit garantir que son apparence reflète l'état du modèle. Chaque fois que les données du modèle changent, le modèle notifie les vues qui en dépendent. En réponse, chaque vue obtient l’occasion de se mettre à jour. Cette approche vous permet d'attacher plusieurs vues à un modèle pour fournir différentes présentations. Vous pouvez également créer de nouvelles vues pour un modèle sans le réécrire.
Le diagramme suivant montre un modèle et trois vues. (Nous avons omis les contrôleurs pour des raisons de simplicité.) Le modèle contient des valeurs de données. Les vues définissant un tableur, un histogramme et un graphique à secteurs affichent ces données de différentes manières. Le modèle communique avec ses vues lorsque ses valeurs changent et les vues communiquent avec le modèle pour accéder à ces valeurs.
Pris au pied de la lettre, cet exemple illustre une conception qui dissocie les vues des modèles. Mais la conception s'applique à un problème plus général: découpler des objets de sorte que les modifications apportées à l'un puissent affecter un nombre quelconque d'autres objets sans qu'il soit nécessaire de connaître les détails des autres objets. Cette conception plus générale est décrite par le modèle de conception Observer (page 293).
Une autre caractéristique de MVC est que les vues peuvent être imbriquées. Par exemple, un panneau de commande de boutons peut être implémenté en tant que vue complexe contenant des vues de boutons imbriquées. L'interface utilisateur d'un inspecteur d'objet peut consister en des vues imbriquées pouvant être réutilisées dans un débogueur. MVC prend en charge les vues imbriquées avec la classe CompositeView, une sous-classe de View. Les objets CompositeView agissent exactement comme des objets View. une vue composite peut être utilisée partout où une vue peut être utilisée, mais elle contient et gère également des vues imbriquées.
Encore une fois, nous pourrions considérer cela comme une conception qui nous permet de traiter une vue composite de la même manière que nous traitons l'un de ses composants. Mais la conception est applicable à un problème plus général, qui se produit chaque fois que nous voulons grouper des objets et les traiter comme un objet individuel. Cette conception plus générale est décrite par le modèle de conception Composite (163). Il vous permet de créer une hiérarchie de classes dans laquelle certaines sous-classes définissent des objets primitifs (par exemple, Button) et d'autres classes définissent des objets composites (CompositeView) qui assemblent les primitives en objets plus complexes.
MVC vous permet également de modifier la façon dont une vue répond aux entrées de l'utilisateur sans modifier sa présentation visuelle. Vous voudrez peut-être modifier la façon dont il répond au clavier, par exemple, ou lui demander d'utiliser un menu contextuel au lieu de touches de commande. MVC encapsule le mécanisme de réponse dans un objet Controller. Il existe une hiérarchie de classes de contrôleurs, ce qui facilite la création d'un nouveau contrôleur en tant que variante d'un contrôleur existant.
Une vue utilise une instance d'une sous-classe de contrôleur pour mettre en œuvre une stratégie de réponse particulière; pour mettre en œuvre une stratégie différente, remplacez simplement l'instance par un autre type de contrôleur. Il est même possible de changer le contrôleur d'une vue au moment de l'exécution pour laisser la vue changer la façon dont elle répond aux entrées de l'utilisateur. Par exemple, une vue peut être désactivée pour ne pas accepter les entrées simplement en lui attribuant un contrôleur qui ignore les événements en entrée.
La relation Vue-Contrôleur est un exemple du modèle de conception Stratégie (315). Une stratégie est un objet qui représente un algorithme. C'est utile lorsque vous souhaitez remplacer l'algorithme de manière statique ou dynamique, lorsque vous avez beaucoup de variantes de l'algorithme ou lorsque l'algorithme a des structures de données complexes que vous souhaitez encapsuler.
MVC utilise d'autres modèles de conception, tels que Méthode d'usine (107) pour spécifier la classe de contrôleur par défaut d'une vue et Decorator (175) pour ajouter le défilement à une vue. Mais les principales relations dans MVC sont données par les modèles de conception Observer, Composite et Strategy.