[Offre d'emploi] – Développeur Flex en Angleterre
Développeur Flex (Paris) – Offre d'emploi
- Titre: Développeur Flex
- L'entreprise: Consortia Personnel (http://www.recruitflexdevelopers.co.uk/)
Profil Recherché
- Profil recherché:
- Je recherche actuellement un développeur Flex
- Compétences Techniques Requises:
- ActionScript 3.0
- Flex Builder 3 (+4)
- OOP
- MVC
- Expérience Requise: -
- Formation: -
- Disponibilité: ASAP
Conditions d'embauche
- Lieu : Angleterre
- Rémunération: €45,000 – €60,000
- Contrat: CDD
Pour postuler
- Contact:
- Si vous connaissez des personnes pouvant être intéressé n'hésitez pas à leur transmettre mes coordonnées. J'ai aussi d'autres projet basées a France (Technologies : Adobe, Air, Flash, Flex, Coldfusion) si cela peut vous interesser contact nathan (AT) consortia.co.uk
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 Best Practices – MVC (Model View Controller) par l'exemple
Dans le petit monde de Flex, on entend très souvent parler du modèle MVC alias Model View Controller. Plutôt que de rester dans la théorie, le blog unitedmindset propose de montrer MVC par l'exemple, en voici une traduction. Au départ, on a un code qui est écrit "en vrac" et on va le transformer pour qu'il soit cohérent avec le modèle MVC.
MVC en quelques mots…
D'autres articles en parlent mieux, mais en quelque mots, le modèle MVC est une "best practice" (bonne pratique) permettant de coder plus facilement, de ne pas dupliquer son code et de le rendre facilement réutilisable. MVC est un concept simple pour simplifier le développement. Le concept et de séparer dans son application le model (la donnée), la view (ce que l'on voit) et le controller (les méthodes et les fonctions qui font la liaison entre la vue et le model, et inversement).
Code d'exemple non-MVC (Worst practice)
Voici un exemple de code (Flex 4) qui est mauvais car totalement rigide. Si vous codez de cette manière, prenez bien le temps de lire cet article:
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/halo"
creationComplete="application1_creationCompleteHandler(event)">
<fx:Script>
<![CDATA[
import mx.controls.Alert;
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
import mx.collections.ArrayCollection;
import mx.events.FlexEvent;
[Bindable]
private var searchList:ArrayCollection = new ArrayCollection();
protected function application1_creationCompleteHandler(event:FlexEvent):void
{
runSearch();
}
private function runSearch(event:MouseEvent=null):void
{
httpService.send({searchTerm:searchInput.text});
}
protected function httpService_resultHandler(event:ResultEvent):void
{
searchList = new ArrayCollection( event.result as Array);
}
protected function httpService_faultHandler(event:FaultEvent):void
{
searchList = new ArrayCollection();
Alert.show("fault");
}
]]>
</fx:Script>
<fx:Declarations>
<mx:HTTPService id="httpService"
result="httpService_resultHandler(event)"
fault="httpService_faultHandler(event)"
resultFormat="e4x"
url="http://www.someUrl.com/yourMethod"/>
</fx:Declarations>
<s:layout>
<s:VerticalLayout gap="20" paddingBottom="20" paddingLeft="20" paddingRight="20" paddingTop="20"/>
</s:layout>
<s:HGroup width="100%">
<mx:Label text="Search Term"/>
<s:TextInput width="100%" id="searchInput"/>
<s:Button label="Do It!" click="runSearch(event)"/>
</s:HGroup>
<s:List width="100%" height="100%"/>
</s:Application>
Cet exemple est extrêmement simple et si c'est tout ce que votre application doit faire, alors vous pouvez laisser ce code comme tel. Si votre application est plus complexe (ou va le devenir), vous allez vite comprendre que cette manière de coder va vous poser problème. Vous aurez ainsi du mal à créer des tests unitaires, réutiliser le code ou bien implémenter les designs patterns OO tels que la Factory ou même les interfaces. Notre application MVC finale pourra faire ces choses là.
Comprendre le Model
Les Model sont les données de votre application et sont extrêmement simples. En ActionScript, lorsque vous créez des model, vous allez devoir utiliser des getters et des setters pour vos propriétés. Pourquoi? Parce que le Model contient la donnée et que le Model change, il propage des évènements pour alerter tout écouteur que le model à changé.
Model : Best Practices
Toutes les propriétés de votre model devraient avoir des getters et des setters. Votre classe Model doit aussi hériter de EventDispatcher pour pouvoir envoyer des évènements (Event) quand votre modèle est modifié. Vous verrez comment cela se passe plus loin dans l'exemple. Vous pouvez aussi utiliser des évènements personnalisés pour indiquer les changements à votre application. Dans cet exemple, on va utiliser simplement la classe Event. Il est aussi "Best practice" de vérifier que la propriété a bien changé avant de propager l'évènement et de mettre à jour la valeur. C'est très simple avec des String ou des Number mais c'est plus compliqué avec des objets complexes.
Création du Model (exemple)
Pour notre exemple, le model est extrêmement simple puisque l'on a une seule propriété, mais vous pouvez remarquer la simplicité du Model et la manière par laquelle il sépare et simplifie l'application. En effet, vous pourrez réutiliser ce model dans de multiple controllers.
package com.unitedmindset.models
{
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.events.IEventDispatcher;
[Event(name="searchListChanged",type="flash.events.Event")]
public class SampleModel extends EventDispatcher
{
public static const SEARCH_LIST_CHANGED:String = "searchListChanged";
public function SampleModel(target:IEventDispatcher=null)
{
super(target);
}
private var _searchList:Array;
public function get searchList():Array
{
return _searchList;
}
public function set searchList(v:Array):void
{
_searchList = v;
dispatchEvent(new Event(SEARCH_LIST_CHANGED));
}
}
}
Comprendre le Controller
Un Controller n'est ni plus ni moins qu'une classe qui va contenir des méthodes pour gérer la data, mettre à jour et gérer la vue (View). En séparant votre code et en créant des classes spécifiques, vous pourrez avoir des interfaces, des sous-classes, des tests unitaires sur chaque méthode et enfin utiliser la vue "Outline" d'Eclipse pour aller direct sur une méthode spécifique.
Flex UIComponent – Création d'un objet Collection en MXML et ActionScript
Les composants Flex utilisent le modèle MVC (Model-View-Controller / Modèle-Vue-Controleur), un pattern qui différencie l'affichage de la data par rapport à la data elle-même. Cela se voit bien dans les composants de type Liste. Tous les composants de type Liste utilisent les data models. Dans le langage utilisé par ces composants, les data models sont appelés "data providers" qui sont des objets indépendants que vous pouvez associer avec le composant. Le composant utilise ensuite la donnée de cet objet pour rendre sa Vue.
Les Data Providers implémentent toujours l'interface mx.collections.ICollectionView. Bien que vous puissiez assigner un tableau ou un objet XML à la propriété dataProvider d'un composant, Flex va ensuite le convertir vers un type qui implémente ICollectionView. Cela veut dire que les Array seront convertis en un type mx.collections.ArrayCollection et les objets XML et XMLList seront convertis en mx.collections.XMLListCollection. Il est généralement mieux de pouvoir explicitement englober l'objet dans une collection avant de l'assigner à un data provider. De cette manière, vous êtes sur d'avoir une référence vers la vraie collection du data provider, plutôt que vers l'objet englobé dans cette collection.





