Dans le monde des IHM, le MVC se décline en pratique récursivement de la manière suivante :
V' = M + V + C
Voire, dans le cas de Swing notamment :
V' = M + (V + C)
Avec ce découpage de Swing et en imaginant une application basique, on pourrait obtenir le résultat suivant :
MonApplication(V) = MonModele(M) + MonFormulaire(V) + MonControlleurFormulaire(C)
MonFormulaire(V) = JComboBox(V) + ...(V) + ...(V)
JComboBox(V) = ComboBoxModel(M) + ComboBoxUI(V+C)
Remarque : personnellement, je crée souvent intégralement mes vues applicatives (ici MonFormulaire) sous NetBeans sans toucher au code (donc sans aucun binding).
Pour détailler le cas d'une JComboBox, quand cette dernière installe son ComponentUI (qu'elle n'instancie d'ailleurs pas, mais dont elle demande simplement une instance appropriée à l'UIManager), elle ignore ce qu'il fait concrètement (elle n'utilise d'ailleurs même pas le fait que c'est un ComboBoxUI). Une JComboBox ignore ainsi que, pour la plupart des Look And Feel, l'instance de ComboBoxUI va lui ajouter un champ de texte, un bouton, un menu surgissant et câbler tout se joli monde. De fait, c'est bien le contrôleur le chef d'orchestre, le JComponent englobant (la JComboBox ici) n'étant qu'une coquille vide pour le MVC (pour ce qui est de la délégation du rendu, c'est autre chose). Néanmoins, comme tout ce petit monde est finalement caché dans la JComboBox, on peut quand même dire que, dans Swing, vue et contrôleur sont fusionnés, mais sans pour autant remettre en cause l'approche MVC.
Sachant cela, on peut dire que la vue ne doit jamais connaître son modèle, que seul le controleur doit pouvoir le faire, quitte à l'embarquer dans la vue pour donner la sensation suivante.
new JComponentX(new Model()); // Le composant Swing "observe" le modèle.
D'un certaine manière, tout se résume à une question de perspective. Là où le distinguo doit cependant s'opérer clairement, c'est lorsqu'il s'agit d'une vue et d'un modèle métier.
UNE VUE NE DOIT JAMAIS ACCEDER DIRECTEMENT A UN MODELE METIER, C'EST A UN CONTROLEUR DE LIER LES DEUX.
Par exemple, une vue géographique a le droit de manipuler apparemment directement un modèle graphique interne dont les objets seraient des formes géoréférencées, mais ne devrait en aucun cas jouer directement avec le modèle de données métier de l'application dont les objets seraient, par exemple, des voitures évoluant sur des routes. Un contrôleur s'impose pour connecter les deux.
Partager