Flex 4 – (2) Conception d'une architecture Flex orientée composant
Si vous suivez flex-tutorial, vous avez sûrement vu que je parlais que peu souvent des framworks MVC (Cairngorm, PureMVC, Mate, Parsley pour ne citer que les plus populaires). Cela vient du fait qu'après avoir regardé la plupart des frameworks, aucun ne me paraissait correct.
Les problèmes apportés par les frameworks MVC
Plusieurs raisons (subjectives) à cela:
- Aucun framework n'est "ultra-populaire" et écrase tous les autres. C'était le cas pour Cairngorm au départ car Adobe poussait à utiliser son produit mais le choix est maintenant plus hétérogène. Admettons que l'on apprenne le fonctionnement de Cairngorm et qu'on le maîtrise. Si vous tombez sur un poste où tous les projets utilisent PureMVC, vous pouvez mettre vos compétences au placard.
- La majorité des frameworks MVC pour Flex amènent avec eux, une architecture (dossiers/sources). Si vous décidez que pour une raison X, le framework ne convient plus à votre besoin, vous aurez un gros travail de refactoring à faire qui va se révéler laborieux (encore plus avec les bugs de Flex Builder 3, corrigés pour Flash Builder 4). Quand vous vous engagez sur un framework, vous êtes "couplé" à lui.
- Les frameworks basés sur les annotations (Mate, Parsley, …) ne vous imposent que très peu d'architecture et viennent se greffer sur votre code. Le problème est que de cette manière, beaucoup de choses se passent "under the hood" de manière un peu magique, et cela peut rendre le debugging laborieux.
- A la base, le paradigme MVC a été crée pour avoir des classes qui ne sont pas couplées entre elles et les plus atomiques possible (une des bases de la programmation OO). Pour certains frameworks MVC comme Cairngorm, vous devez sans cesse faire des héritages sur des classes du framework (tous les Event par exemple dérivent de CairngormEvent). D'autres comme Robotlegs vous obligent à enregistrer vos objets (à les "mapper") dans des Singletons. Cairngorm utilise lui aussi des Singletons pour un peu tout (Services, Model, …) ce qui va nuire à la ré-utilisabilité et à la modularité de votre code.
- Aucun des composants Flex disponibles sur le net n'est basé sur les classes d'un framework en particulier. Pour rester neutre, l'écrasante majorité des composants que l'on trouve sur le net ne sont pas écrits en se basant sur un framework. On peut donc se retrouver avec un code hétérogène.
- L'utilisation d'un framework implique que tous les développeurs comprennent les concepts d'utilisation du framework. Cela va venir s'ajouter au temps de développement du projet.
- En plus de "subir" la roadmap d'Adobe sur le SDK Flex, vous devrez parfois attendre la migration de telle ou telle fonctionnalité sur le framework choisi. Comme tous ne sont pas open source, vous pouvez vous retrouver bloqué.
Ces considérations sont générales à tous les framework. Chaque framework ayant ses spécificités, va aussi apporter d'autres points bloquants (trop long de tous les faire). Après il y a sûrement des points positifs à l'utilisation de chacun de ses frameworks mais qui, selon moi, ne pèse pas assez lourd dans la balance. Bien sûr, si vous voulez lancer un petit débat, vous pouvez laisser un commentaire à cet article
.
Adopter une approche différente
Pour le projet sur lequel je travaille actuellement, il me fallait donc trouver une solution cohérente, extensible et ré-utilisable pour l'architecture du projet. Ayant écarté l'utilisation d'un framework en particulier, il fallait donc trouver une solution qui ne m'oblige pas à re-inventer la roue. L'approche que j'ai adopté a été inspirée au départ de cet article:
Flex Best Practices – Models, Views, and Controllers
Le challenge avec l'utilisation du paradigme MVC (Model-View-Controller) est que chacun a un peu son implémentation (plus ou moins passive).
J'ai donc décidé de simplement intégrer les concepts-clé de la POO:
- Couplage faible entre les objets
- Pas de singletons (variables globales)
- Séparation of concerns (cloisonnement des fonctionnalités de chaque objet pour qu'il soit le plus atomique possible)
- Keep It Simple and Stupid & Don't Repeat Yourself
Flex, par nature, est "déjà MVC". Le dataProvider d'une ComboBox, par exemple, est séparé du composant ComboBox, pour ne citer que cet exemple. Je vais donc utiliser des techniques basiques de Flex:
- Data Binding
- Communication par évènement
- Typage fort, héritage, et utilisation des interface
- Définition MXML d'objets
Le plus important ici est peut-être l'aspect "composant" qui va être adopté. Celui-ci permet la réutilisation du code de manière simple.
Mis en application mais pas testé pour 100% des cas d'utilisation
L'architecture que je vais présenter à été mise en place pour une application Flex que je développe pour l'entreprise dans laquelle je travaille, Business Geografic. Le concept est tellement générique qu'il peut à mon avis, être appliqué à la plupart des applications. Quelques points n'ont pour l'instant pas été testés comme la gestion de l'internationalisation (i12n) des composants (langues différentes). Même si cela ne devrait pas poser de problème, je n'ai pas encore tenté une mise en place.
Si vous souhaitez migrer une application déjà développée autour d'un framework ou de votre technique à vous, il vous faudra aussi passer du temps pour découper vos classes si cela n'est pas déjà fait. Le mieux est bien sûr de partir "from scratch" mais ce n'est pas forcement votre cas.
Architecture applicative au niveau projet
Avant de taper dans le gros du code, voici la répartition (un peu simplifiée) des projets. Vous pouvez faire avec plus ou moins de projets/librairies suivant le métier mais cela dépend de votre métier. Dans les prochains exemples, j'utiliserai FT comme préfixe pour les packages et les noms de projets (comme Flex-Tutorial
). Bien sûr vous devrez remplacer les préfixes, namespaces & Co par les noms/initiales de votre entreprise.
Librairies
L'utilisation des librairies Flex est ici primordiale pour la réutilisation de votre code. Imaginez par exemple que vous vouliez faire une implémentation Air et une implémentation Adobe Flex (web) de la même application. Si toutes vos sources sont dans le même projet (Flex Application), vous devriez dupliquer votre code.
Certaines librairies peuvent être re-decoupées en plusieurs librairies selon vos problématiques métier.
- AssetsLibrary: Cette librairie va contenir tous les icônes et ressources (audio, pictos, …) que vous allez embarquer dans votre application (Embed). Elle va contenir les fichiers ressources mais aussi des classes d'accès vers ces ressources. Le but de cette Flex Library est de centraliser tous vos assets mais surtout de les compiler dans un SWC qui va être réutilisé par toutes les applications. Cela va surtout vous permettre de sauver énormément de temps de compilation au niveau projet. En effet, le transcodage des icônes est une opération très longue que vous ne voulez pas faire à chaque compilation. En compilant vos éléments Embedded dans un SWC, la compilation se fait une fois et à chaque fois que vous ajouter des icônes, ce qui ne devrait pas arriver très souvent par rapport au nombre de compilations.
- FlexComponents: Cette librairie va contenir tous les composants Flex que vous avez crée ou téléchargé sur le net qui sont génériques. Dans cette librairie, aucun composant "métier", simplement des petits composants utiles (TextInput avec Prompt, ComboBox améliorée, ColorPicker avancé, …). Ces composants doivent pouvoir être utilisés sans aucune dépendance métier.
- FlexUtils: Librairie contenant simplement des classes utilitaires que vous codé ou téléchargé. Là aussi, aucune composante métier. Par exemple, on pourra y retrouver des ColorUtils, des StringUtils, des implémentation de HashMap, … C'est aussi ici que vous pourrez intégrer un Logger si vous en utilisez un.
- FTFramework: Voilà le projet le plus important puisque c'est lui qui va contenir les bases de votre code métier. C'est ici que vont se trouver tous les "Managers" comme je les appellerai par la suite et leur implémentation de base. C'est aussi ici que vont se trouver tous vos composants métier (contrairement aux composants génériques qui vont se trouver dans la librairie FlexComponents).
Applications
Les projets de type Flex Application (ou Air Application) vont être liés à l'ensemble de ces librairies. C'est dans l'application que l'on va mettre en place les liaisons entre les différents "Managers" présents dans le FTFramework grâce à du DataBinding. C'est aussi dans les projets que l'on va créer les implémentations métier spécifiques par dessus les Managers de base. Ce sera plus clair avec des exemples de code plus tard
.
Articles similaires
- Développement mobile AIR (Approche Flex Tutorial) – Architecture projet
- Flex RSL – Utilisation de RSL standards
- Flash Builder 4 – Refactoring (déplacement, renommage de classes / propriétés)
- Swiz Tutorial Vidéo – Introduction à Swiz en 20 minutes
- Open Source Media Framework (Strobe) et Text Layout Framework sur Open@Adobe






31 mars 2010
A propos des frameworks, on peut également rajouter que leur utilisation au sein de nouveaux projets est quelques fois symptomatique! Il n'y a pas de vraie réflexions ou celles ci se résument à "puisqu'il existe des frameworks alors utilisons-en un!".
Je fais surtout ce constat pour Flex car en Php, Zend ou Symfony apporte beaucoup de structure a ce langage, et Spring beaucoup de puissance à Java.
Et merci Fabien pour cette "prise de température" tres claire
31 mars 2010
Une petite correction:
"D'autres comme Robotlegs vous obligent à enregistrer vos objets (à les "mapper") dans des Singletons"
singleton (petit s) et non Singleton (grand S). C'est un des grand plus qu'apporte Robotlegs avec la notion de Contexte en opposition à pureMVC par exemple.
Il est vrai que les objects peuvent être mappés avec un singleton, mais ce n'est pas obligatoire, on peut en effet mapper sur un objet instancié également.
J'utilise Robotlegs depuis l'an dernier. Couplé à l'API AS3Signals, j'ai jamais programmé aussi rapidement avec des tests unitaires bétons…
31 mars 2010
@tit
.
Tu as raison pour l'orthographe, c'est toujours un peu difficile comme Ajax et AJAX et autres
En parlant de tests unitaires, puisque tu as l'air d'en faire sur de "vraies" applications (pas la démo avec une calculette), je serai très curieux de voir quelles composantes métier tu testes et comment. Soit par GTalk, soit par mail ou dans les commentaires
Fabien
1 avril 2010
+1 pour dans les commentaires pour les test unitaires !
Me tarde de voir la suite des évènements !
1 avril 2010
Je suis vraiment content qu'à leur ou tout est "full MVC" une voix s'élève et dit tout fort ce que je pense tout bas ^^
J'ai adopté depuis mes débuts avec flex une architecture ressemblant fortement à la tienne. Et toutes mes tentatives pour adopter tel ou tel sur-couche MVC ne m'ont jamais satisfaites.
Mais le plus terrible c'est les entreprise qui demande toujours de maitriser 1 voir 2 MVC en plus des compétences Flex…
J'ai même déjà vue une offre d'emplois d'une entreprise cherchant un chef de projet maitrisant cairngorm parsley et pureMVC… J'imagine pas l'horreur dans le service développement si 3 MVC différents sont utilisés
1 avril 2010
Oh mon dieu "Je suis vraiment content qu'à leur" je suis impardonnable mdr
2 avril 2010
L'argument qu'on entend souvent en faveur des frameworks c'est "si un nouveau codeur arrive dans l'équipe, il sera opérationnel très rapidement." Avec votre expérience, vous êtes plutôt d'accord ou pas avec cette affirmation?
Evidemment ça n'enlève rien aux nombreux avantages q'apporte cette méthode
Juste un petit commentaire sur les librairies, le fait de ne pas avoir accès au code directement (pour modifier ou juste regarder se que fait une méthode) c'est un peu énervant parfois
2 avril 2010
@VincentLg
Oui c'est un des principes des frameworks: proposer un cadre de travail, une façon de développer qui sera commune aux développeurs. Maintenant tout depend de ce qu'on en fait. Il ne faut pas oublier qu'un développeur sera plus performant si il maitrise l'API de base avant de se concentrer sur le framework utilisé, ce qui peut-etre déroutant pour un débutant (expérience vécue sur Java)
2 avril 2010
@AIBOrion
Merci!
2 avril 2010
@Vincent
Un nouveau développeur qui maitrise PureMVC mais pas l'ActionScript (un vrai nouveau codeur) va avoir encore plus de mal à comprendre comment se passe tout le process de l'application, AIBOrion a bien raison
Pour l'histoire des librairies, il suffit que tu lies le projet et pas le SWC et un Ctrl+Click sur ta classe te dirigera directement sur la source
Fabien
3 avril 2010
Il me tarde de voir du code, je me suis créé ma propre façon de travailler mais la trouve perfectible
A titre d'exemple, je cherche à ne pas placer de code dans la vue, ainsi, à l'évènement CREATION_COMPLETE, j'instantie un controler en lui passant une référence à la vue (this)
Un des moments où c'est gênant, c'est avec les states car , je ne peux placer d'écouteurs depuis le controler qu'une fois le state affiché
Dès lors je doit poser en premier lieu un écouteur sur l'évènement ENTER_STATE pour ensuite poser un écouteur sur un bouton par exemple
Vivement la suite
3 avril 2010
Je viens de voir que dans le lien que tu donnes, c'est un peu ce qui est fait sauf qu'il place des évènements dans les balises des composants
3 avril 2010
"Cairngorm utilise lui aussi des Singletons pour un peu tout (Services, Model, …) ce qui va nuire à la ré-utilisabilité et à la modularité de votre code."
J'utilise Cairngorm dans ma boite et je l'ai légèrement modifié par régler ce problème. J'ai créé des factories et des interfaces pour les controllers, les models, et les views. Ainsi, j'ai une class avec des variables rootant sur chaqu'une de ces entités. J'interagi donc qu'avec des interfaces le code est complètement découplé. Seul défaut de cette approche; elle est très verbeuse et prend donc beaucoup de temps à développer.
PS: plein de chose intéressante dans les commentaires, je vais googliser tous ça!
5 avril 2010
@Fabien
)
Merci pour ta réponse. (et je vais utiliser dès demain ta réponse pour mes librairies
++
20 avril 2010
Hello,
Cet article m'a donné plein de clef pout l'organisation du code dans mes prochain projets.
Je rajouterais aussi de penser à faire un projet par modules (si c'est un projet avec des modules)
Pour builder le tout depuis l'appli principale, il faut ajouter en tant que source-path les répertoire "src" des projets module et ensuite de les declarer comme module dans les préférences du projet
ps : J'ai hâte de découvrir comment tu va organiser les services / modêles pour te passer de framework MVC
16 mai 2010
Si techniquement le débat reste ouvert, je conçois mal débuter un projet de plusieurs années homme sans avoir (imposer) un minimum de règles.
De mon point de vue un framework n'a pas seulement vocation à résoudre des problèmes techniques. La phylosophie qu'il embarque doit permettre (entre autre chose) de conserver et concentrer le potentiel du savoir faire des ingénieurs sur le fonctionnel...
Un framework est selon moi la garantie d'une certaine efficacité, pérennité.
Bref, je trouve l'équation Framework = MVC un peu légère
Je te rejoins néanmoins sur la difficulté et donc les risques liés au choix du framework. La plus part de ceux que tu sites ont avant tout été conçus sur des motivations techniques (concourt de pattern).
Merci pour le débat.
30 octobre 2010
Bonjour, je cherche la suite de cet excellent article, car il devrait y avoir du code à se mettre sous la dent normalement. Quelqu'un pourrait-il m'orienter s'il l'a déjà vu, car je n'ai pas trouvé ...
Merci.
1 novembre 2010
Salut, malheureusement, il n'y a pas de suite a cet article car le fil rouge n'a jamais vraiment démarré, j'avais beaucoup d'autres choses a raconter en ce moment. Cependant, je vais publier tres bientot des tutoriaux sur le dev mobile qui suivent ce type d'architecture que j'explique. c'est pour très bientot, surement cette semaine
Fabien
2 novembre 2010
Formidable, je reste à l'affût dans ce cas ^^