• › Connexion
  • Blog RIA.do.be
  • Blog Web2Entreprise
Section separator

Catégories

  • Annonces
  • Évènements
  • Concepts et Usages
  • Notes Techniques
  • Références
Adobe EMEA Silver Solution Partner Section separator

Abonnement

  • RSS Articles Articles (RSS)
  • RSS Articles Commentaires (RSS)
  • RSS mail Articles (Email)
  • Populaires
  • Récents
  • Commentaires
  • Premiers Retours sur l’Adobe MAX 2009 (vu 13 817 fois)
  • Utiliser le framework Cairngorm pour Flex 2 (1/4) (vu 7 087 fois)
  • Comment forcer les styles des composants Flex/AS3 d’une librairie SWC réutilisable (vu 6 753 fois)
  • Architecture MVC: Cairngorm ou PureMVC ? (vu 4 659 fois)
  • Le problème du ModelLocator Cairngorm (vu 4 306 fois)
Articles récents
  • La confusion Cairngorm3 et des frameworks post MVC
  • Ready2Flex, la Solution pour Votre Déploiement Flex
  • Ouverture des Inscriptions pour le Webinar ConfluenceFx
  • Développeur, Communicant, Designer ou Ergonome ? Changez pour Kap IT
  • Application AIR : Comment Sauvegarder/Charger un Document et lui Associer une Extension ?
Commentaires récents
  • Yannick Lacaute dans La confusion Cairngorm3 et des frameworks post MVC
  • Yannick Lacaute dans La confusion Cairngorm3 et des frameworks post MVC
  • Fadi Mansour dans Détection de l’Événement « Coller » avec Flex Builder 3 et Flash Player 9
  • nico dans Détection de l’Événement « Coller » avec Flex Builder 3 et Flash Player 9
  • Florian dans Application AIR : Comment Sauvegarder/Charger un Document et lui Associer une Extension ?

Auteurs

  • Alexis Kartmann (12)
  • Benoit Kogut-Kubiak (2)
  • Christoher Bograt (1)
  • Cyril Daloz (8)
  • Daniel Pesic (6)
  • Fadi Mansour (3)
  • Florian Fesseler (1)
  • Guillaume Mignard (2)
  • Jean de Laulanié (2)
  • Julien Revel (19)
  • Mahmoud Ramadan (1)
  • Matthieu Jobert (1)
  • Stéphane Guyot (1)
  • Stéphane Koëth (2)
  • Yann Graufogel (2)
Section separator

Tags

Corporate Adobe MAX PureMVC AMF kapinspect livecycle Web 2.0 actionscript builder AIR AS3 RTMP Kap Lab Framework skin MVC Flex JVM BlazeDS compilation RIA LCDS Kap IT Cairngorm fds
Section separator

Archives

  • juin 2010 (1)
  • mars 2010 (1)
  • février 2010 (1)
  • décembre 2009 (2)
  • novembre 2009 (1)
  • octobre 2009 (3)
  • septembre 2009 (1)
  • août 2009 (1)
  • avril 2009 (2)
  • février 2009 (2)
  • janvier 2009 (4)
  • décembre 2008 (4)
  • novembre 2008 (2)
  • octobre 2008 (2)
  • septembre 2008 (2)
  • août 2008 (1)
  • juin 2008 (1)
  • avril 2008 (4)
  • mars 2008 (3)
  • février 2008 (2)
  • janvier 2008 (1)
  • décembre 2007 (3)
  • novembre 2007 (1)
  • septembre 2007 (1)
  • juillet 2007 (1)
  • juin 2007 (1)
  • mai 2007 (4)
  • avril 2007 (8)
  • mars 2007 (2)
  • février 2007 (1)

Marque-pages

  • Adobe Labs
  • AStrois Blog
  • Code moi un mouton
  • Coma Informatique
Section separator

Kap IT

  • Site Web
  • Blog RIA.do.be
  • Blog Web2Entreprise
  • Kap Lab - Composants Flex
  • Kap Lab - Plugins Confluence

Blog RIA.do.be

Veille, Recherche et Développement RIA Flex-AS3-LiveCycle

Le problème du ModelLocator Cairngorm

Par Daniel PesicgravatarFermerAuteur : Daniel Pesic Email : dpesic@kapit.fr
Site : http://www.kapit.fr
A propos : Voir les autres billets de l'auteur (6)
, publié le 3 septembre 2008

L’arrivée cet été du framework MVC Cairngorm dans le giron du site open source Adobe a été accompagnée d’un mouvement sur la toile assez bruyant et critique du framework en lui-même.

Examinons les deux principaux reproches récurrents :

  • Le ModelLocator comme container de variables globales fourre-tout
  • Le couplage fort du binding entre le ModelLocator et la vue

L’objet de ce billet est de pointer du doigt ce qui nous semble poser le plus de souci dans l’implémentation de Cairngorm et d’exposer le chainon manquant. Le périmètre concerne les applications d’entreprises dont les fonctionalités sont destinées à évoluer.

Ce qui pose problème

Les variables globales et le couplage fort sont deux principes honnis du développement logiciel, mais on les retrouve tout de même dans le CairngormStore et dans de nombreux articles et tutoriels.

Les problèmes apparaissent lorsque l’application à développer dépasse un certain seuil de complexité. Celui-ci peut être inhérent aux besoins exprimés ou induit par une conception confuse, l’ajout de fonctionalité devient alors très complexe et les régressions apparaissent.

Les variables globales

A l’usage on s’aperçoit que le ModelLocator est utilisé par les développeurs non adeptes de la POO pour y stocker des variables d’état de l’application, des listes de données, des données ‘courantes’ dans telle ou telle vue, des références aux vues mxml courantes, etc.
Prenons l’exemple minimaliste suivant :

ModelLocator

Notre modèle contient une liste de personnes, une personne que l’on suppose sélectionnée dans un widget de type liste, probablement un formulaire affichant cette personne et une référence à un composant visuel affichant une partie des informations de cette personne (on suppose que les informations relatives aux personnes sont nombreuses et qu’il vaut mieux les segmenter sur plusieurs écrans).
Les tutoriels et articles sur les bonnes pratiques du développement avec Cairngorm montrent quasiment tous l’usage du Bindable dans les données stockées dans le ModelLocator.

Les bindings

L’usage des binding n’est pas un soucis inhérent au framework, bien au contraire, mais plus un problème lié aux tutoriels et à la pente naturelle prise par les développeurs lorsqu’ils ont entre les mains :

  • un container de variables dans lequel on les invite à déposer ce qu’ils veulent
  • la possibilité de rendre [Bindable] n’importe quelle variable ou classe.

On en arrive donc au pire des scénarios auquel un développeur, affecté à l’évolution d’une application, puisse être confronté :

...
[Bindable]
public class MyModelLocator implements ModelLocator
...

Tout va bien direz-vous, on a moins de code à écrire ! Cet argument est recevable et même souhaitable pour un prototype ou une maquette, mais pour une application d’entreprise destinée à évoluer, cela revient non seulement à plomber les performances dès que l’on commence à avoir des jeux de données conséquents mais aussi à installer une bombe à retardement pour la maintenance…
Que faire si on a plusieurs listes de ‘Person’, basées sur des filtres différents ? Faut-il ajouter des ArrayCollection ?

Exemple à faire dresser les cheveux (toujours dans le ModelLocator) :

...
public var friendsList;
public var ignoreList;
...

Autre possibilité : que se passe-t-il si notre application autorise l’affichage de plusieurs formulaires Person en même temps dans une vue à fenêtres multiples ?
Solution possible : remplacer selectedPerson¨par un tableau indexable par clé alphanumérique sur l’identifiant de Person ?
Où code-t-on la gestion de ce tableau ? Si l’on passe un des ‘friend’ en ‘ignore’, qui gère la maintenance des deux listes ? Le binding notifie les vues mais qui assure l’intégrité des données en mémoire ?
Tout devient d’un coup beaucoup plus compliqué et on finit inévitablement par avoir du spaghetti.

spaghetti.jpg

Le découplage par envoi de messages entre le modèle et la vue

L’objectif est de passer du couplage fort par références à un couplage faible par envoi de messages (notification ou évènements) :

BindingToMessage

A priori, cela revient à reproduire manuellement le mécanisme du Binding, à la différence près que les vues n’auront plus aucune références directes sur le ‘modèle’. En pratique, elles recevront des messages (des évènements) contenant les données qu’elle consommeront. Les conséquences immédiates à garder en tête sont les suivantes :

  • les vues peuvent conserver les données reçues dans les messages dans des variables locales. Elles pourront les trier, les filtrer, et les manipuler localement sans avoir a priori d’impact sur le reste de l’application.
  • les données envoyées par le modèle dans les messages sont littéralement déléguées ou données à la vue. Le modèle n’a plus aucun contrôle sur ce que les vues feront de ces données. Ce point n’a généralement aucune conséquence dans une petite application mais devient critique dans une équipe de 20 développeurs.

La première mesure est de déplacer les multiples instances référençant l’entité Person (friendsList, ignoreList, selectedPerson, etc.) dans une classe dédiée : PersonProxy. Le ModelLocator ne contiendrait plus qu’un et un seul attribut relatif aux personnes :

public var personProxy:PersonProxy;

-
> Lorsqu’on a affaire à un modèle de donnée modélisé et stocké dans une base de données relationnelle, l’usage est de coder une classe par Entité sauf cas particuliers.

La deuxième mesure est de supprimer des vues tous les appels au ModelLocator. Comment les vues font-elles alors pour récupérer leurs données ?
Réponse : elle ne ‘font’ plus, quelqu’un les leur fournira. Elles deviennent passives.

Cette tâche est la plus délicate à appréhender car elle inverse la dépendance et la technique de construction des interfaces.
On commence par déclarer dans la vue les données dont on va avoir besoin. Ainsi une liste de ‘friends’ est déclarée dans la vue, son statut passe de globale à locale :

[Bindable] public var  friendList:ArrayCollection;

C’est cette liste Bindable qu’on fournit à la dataGrid :

<mx:DataGrid id="friendsDataGrid" dataProvider="{friendsList}" />

Au final, tout ce qui est derrière les proxies, du côté du modèle, n’est plus déclaré [Bindable]. Ne sont déclarés [Bindable] que les variables de données locales aux vues.

A ce stade, il est nécessaire de faire le grand saut. Celui-ci consiste à passer directement à un système d’envoi d’évènement contenant les données. La vue s’enregistre auprès d’un dispatcher d’évènements pour recevoir les données lorsqu’elles changent :
someDispatcher.addEventListener(Constants.FRIENDS_CHANGED, onFriendsChanged);
…
Le *hic* c’est que Cairngorm ne fournit pas de dispatcher pour ce besoin. On est obligé d’en coder un ou de réutiliser le CairngormEventDispatcher. Un examen rapide du code source de Cairngorm nous montre qu’il est parfaitementg possible de l’utiliser pour cet usage mais rien ne nous dit qu’un orientation future du framework n’introduira pas de régression dans nos applications.

Pour information, l’approche par message décrite ci-dessus est celle retenue par PureMVC.

Mais attention : il est parfaitement possible de transformer le PersonProxy en pseudo ModelLocator et de directement faire appel à celui-ci depuis les vues, sans jamais envoyer un seul message entre le ‘Model’ et la ‘Vue’. On obtiendrait au final un ModelProxy !

Plus que l’adoption de tel ou tel framework, c’est la technique d’implémentation et les principes sous-jacents qu’il est nécessaire de maîtriser.

Conclusion

On peut simplifier la situation en associant rapidité de développement à couplage fort, et à l’inverse maintenabilité à couplage faible. Le modèle actuellement proposé par Cairngorm ne satisfait ni l’un ni l’autre. Qu’en sera-t-il de la version 3.0 ? A moins de briser le couplage entre le modèle et la vue, ce framework restera d’après nous au milieu du gué et finira tôt ou tard par être emporté.

Pour des petites applications ‘jetables’, aucun framework MVC n’est nécessaire, il alourdirait considérablement la taille du code compilé, le temps de chargement dans le browser et multiplierait le temps de développement. Il y a tout ce qu’il faut dans Flex pour les réaliser dans un temps record. Dès que l’on a affaire à des données modélisées et à une application orientée gestion, la question de la maintenabilité du code se pose.
On peut parfaitement démarrer une première itération sur Flex sans framework MVC afin de démontrer par exemple une faisabilité technique, ou encore pour valider la compréhension du besoin. Passer en mode ‘projet’ nécessite autre chose que du Binding généralisé en variable globale.

Articles relatifs

  • La confusion Cairngorm3 et des frameworks post MVC (2)
  • Architecture MVC: Cairngorm ou PureMVC ? (10)
  • Le framework PureMVC pour Adobe Flex et ActionScript 3 disponible en version 2.03 (0)
  • Utiliser le framework Cairngorm pour Flex 2(3/4) (1)
  • Utiliser le framework Cairngorm pour Flex 2 (4/4) : Remarques et Add-On (6)
Catégories: Notes Techniques
Tags: Cairngorm, Flex, Framework, Kap IT, MVC, PureMVC, RIA

5 commentaires sur “Le problème du ModelLocator Cairngorm”

  1. Xavier Agnetti dit :
    9 septembre 2008 à 11:02

    Bonjour Daniel,

    Je t’invite a lire la série de postes sur les différents pattern de vue écrite par Paul Williams (http://weblogs.macromedia.com/paulw/archives/2007/10/presentation_pa_3.html#more)

    Avec ce pattern, tes vues deviendront aussi passives, appellera le model de présentation pour la logique visuelle, et permettra aussi la testabilité de ce code (gros point faible de PureMVC: comment tester facilement le code d’un mediator ? sans bien sur instancier la vue elle-même…)

    Cela dit, je suis complètement d’accord avec ta phrase “Plus que l’adoption de tel ou tel framework, c’est la technique d’implémentation et les principes sous-jacents qu’il est nécessaire de maîtriser.”

    Pour avoir utiliser les deux frameworks, il est absolument nécessaire d’appliquer les pratiques fondamentaux de l’OO, pour éviter le code spaghetti (vrai pour PureMVC et Cairngorm)

    Cordialement,

  2. dpesic dit :
    9 septembre 2008 à 11:34

    Xavier,

    pour pouvoir tester les médiateurs indépendamment des mxml, une technique consiste à faire implémenter aux mxml une interface qui sera passée et utilisée par les médiateurs. Lors des tests unitaires, on remplace les mxml par des objets spécialisés implémentant la même interface.
    Cette technique nécessite d’écrire encore plus de code, ce qui finira peut-être par faire fuire les quelques développeurs adeptes de la frappe au clavier (en principe il devrait nous rester les bigots de l’objet).

  3. Olivier Denier dit :
    10 octobre 2008 à 9:15

    Bonjour Daniel,

    Etant novice en Cairngorm, j’ai lu avec grand intérêt ce billet.
    Merci pour cet éclairage.

    Olivier@Ex-Kahiloa

  4. Romain dit :
    28 octobre 2008 à 10:43

    Bonjour,

    Merci beaucoup pour cet article très intéressant. Il explique bien les problèmes posé par l’utilisation de Cairngorm.

  5. Romain dit :
    30 octobre 2008 à 11:13

    Personnellement je viens d’abandonner le Framework Cairngorm car je voulais me libérer du problème cité dans votre article, à savoir le couplage entre la vue et les model, mais je n’y suis pas parvenu suite à des problème de “[Bindable]“. En effet les variable ne sont pas “bindée” correctement entre le model et la vue. La mise à jour ne se fait pas, malgré de nombreux efforts et tests de solutions suggérée.

    Je suis donc entrain de mettre en place PureMVC dans mon projet. Ca à l’air très bien fait et parfaitement adapté à mes besoins.

Laisser une réponse

Cliquer ici pour annuler la réponse.

Article précédent
Article suivant
 
Haut de page

Copyright © 2009 Kap IT - Blog RIA - Blog Web2Entreprise - Kap Lab

Motorisé par Wordpress - Thème avec YAML par Kap IT