<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>DEJA-VUE.NET &#187; Application Architecture</title>
	<atom:link href="http://www.deja-vue.net/blog/category/application-architecture/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.deja-vue.net/blog</link>
	<description>Michael Barbero - Application Architect (Web/ Desktop/ Mobile), Adobe Flash/ AIR Expert, ActionScript, Java, Haxe, JavaScript...</description>
	<lastBuildDate>Sat, 24 Sep 2011 06:43:41 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1</generator>
		<item>
		<title>Workshops – Méthodologie de développement IoC made in Pixlib, de LowRA à PalmER</title>
		<link>http://www.deja-vue.net/blog/2010/03/17/workshops-methodologie-de-developpement-ioc-made-in-pixlib-de-lowra-a-palmer/</link>
		<comments>http://www.deja-vue.net/blog/2010/03/17/workshops-methodologie-de-developpement-ioc-made-in-pixlib-de-lowra-a-palmer/#comments</comments>
		<pubDate>Wed, 17 Mar 2010 13:28:29 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Application Architecture]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[FDT]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[IoC]]></category>
		<category><![CDATA[LowRA]]></category>
		<category><![CDATA[Palmer]]></category>
		<category><![CDATA[Pixlib]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[workflow]]></category>
		<category><![CDATA[Workshop]]></category>

		<guid isPermaLink="false">http://www.deja-vue.net/blog/?p=325</guid>
		<description><![CDATA[<p>Posted in <a href="http://www.deja-vue.net/blog/category/application-architecture/" title="Application Architecture">Application Architecture</a><a href="http://www.deja-vue.net/blog/category/as3/" title="AS3">AS3</a><a href="http://www.deja-vue.net/blog/category/design-patterns/" title="Design Patterns">Design Patterns</a><a href="http://www.deja-vue.net/blog/category/fdt/" title="FDT">FDT</a><a href="http://www.deja-vue.net/blog/category/framework/" title="Framework">Framework</a><a href="http://www.deja-vue.net/blog/category/ioc/" title="IoC">IoC</a><a href="http://www.deja-vue.net/blog/category/lowra/" title="LowRA">LowRA</a><a href="http://www.deja-vue.net/blog/category/palmer/" title="Palmer">Palmer</a><a href="http://www.deja-vue.net/blog/category/pixlib/" title="Pixlib">Pixlib</a></p>Je vous annonce une série de Workshop (de programme identique) consacrée à la méthodologie du développement IoC made in pixlib *. Les sessions auront lieu les Samedis 1, 8, 15 et 29 du mois de Mai. Ces sessions de travail sont destinées aux développeurs AS3 débutants ou déjà familiarisés avec LowRA ou PalmER souhaitant maitriser [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Je vous annonce une série de Workshop (de programme identique) consacrée à la méthodologie du développement IoC made in pixlib *. Les sessions auront lieu les Samedis 1, 8, 15 et 29 du mois de Mai.</p>
<p style="text-align: justify;">Ces sessions de travail sont destinées aux développeurs AS3 débutants ou déjà familiarisés avec <a href="http://code.google.com/p/lowra/">LowRA</a> ou <a href="http://code.google.com/p/palmer/">PalmER</a> souhaitant maitriser le développement IoC.</p>
<p style="text-align: justify;">Ce workshop se veut agnostique quant aux branches existantes (<a href="http://code.google.com/p/lowra/">LowRA</a> AS3/FP9 et <a href="http://code.google.com/p/palmer/">Palmer</a> AS3/FP10). J’insiste bien sur ce point, le workshop ne portera pas sur l’étude de telle ou telle partie concrète de l’API. Il s&#8217;agira de vivre la construction d’une application Pixlib et d&#8217;assimiler la technique du développement IoC.</p>
<p><span id="more-325"></span>Les thèmes abordés seront les suivants:</p>
<blockquote><p>- système événementiel et architecture MVC/ IoC<br />
- structure d&#8217;une application IoC et communication entre les plugins<br />
- création et déploiement de plugins (tâches Ant et compilations MXMLC)<br />
- point de montage IoC avec le(s) context.xml (structure et principes de configuration)</p></blockquote>
<p style="padding-left: 180px; text-align: justify;">
<p style="text-align: justify;">A l’issue de cette journée vous aurez appris à systématiser la création de projets pixlib et serez à même de développer une application IoC. Vous aurez acquis la méthodologie et les techniques qui vous permettront de vous engager dans des créations évolutives et des développements collaboratifs.</p>
<blockquote><p>Tarif/personne: 400€ HT<br />
Horaires : 10h30 -13H00, 14h-18h00 (horaires permettant un aller-retour dans la journée)<br />
Date : 1, 8, 15 et 29 du mois de Mai<br />
Lieu : Nantes<br />
Nombre de participants : 2>5<br />
Niveau requis: pratique de l&#8217;AS3, expérience en POO/ MVC</p></blockquote>
<p>Si vous êtes intéressé, merci de retourner ce <a href="http://www.deja-vue.net/blog_uploads/doc/formulaire_workshop_LP.doc">formulaire d&#8217;inscription</a> rempli.</p>
<p>* pixlib est le domaine qui rassemblera prochainement les différentes branches du Framework</p>
]]></content:encoded>
			<wfw:commentRss>http://www.deja-vue.net/blog/2010/03/17/workshops-methodologie-de-developpement-ioc-made-in-pixlib-de-lowra-a-palmer/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>ActionStep (plugin View) / Pixlib (MVC FrontController + Remoting) SUSHI Service</title>
		<link>http://www.deja-vue.net/blog/2006/05/25/actionstep-plugin-view-pixlib-mvc-frontcontroller-remoting-sushi-service/</link>
		<comments>http://www.deja-vue.net/blog/2006/05/25/actionstep-plugin-view-pixlib-mvc-frontcontroller-remoting-sushi-service/#comments</comments>
		<pubDate>Thu, 25 May 2006 10:06:58 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[ActionStep]]></category>
		<category><![CDATA[Application Architecture]]></category>
		<category><![CDATA[AS2]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[Pixlib]]></category>

		<guid isPermaLink="false">http://www.deja-vue.net/blog/2006/05/25/actionstep-plugin-view-pixlib-mvc-frontcontroller-remoting-sushi-service/</guid>
		<description><![CDATA[<p>Posted in <a href="http://www.deja-vue.net/blog/category/actionstep/" title="ActionStep">ActionStep</a><a href="http://www.deja-vue.net/blog/category/application-architecture/" title="Application Architecture">Application Architecture</a><a href="http://www.deja-vue.net/blog/category/as2/" title="AS2">AS2</a><a href="http://www.deja-vue.net/blog/category/mvc/" title="MVC">MVC</a><a href="http://www.deja-vue.net/blog/category/pixlib/" title="Pixlib">Pixlib</a></p>Le chef est de retour ^^. Au menu Sushis et MVC &#8220;on steroids&#8221;. Montez votre application en MVC. Une fois que le MVC a bien pris, truffez-le d&#8217;un FrontController. Parsemez avec quelques MovieClipHelpers. Arrosez finalement le tout avec, selon le choix et l&#8217;humeur, un ModelLocator et/ou un ServiceLocator&#8230; Pixlib Remoting SUSHI service ? J&#8217;en entends [...]]]></description>
			<content:encoded><![CDATA[<p>Le chef est de retour ^^. Au menu Sushis et MVC &#8220;on steroids&#8221;.</p>
<p>Montez votre application en MVC. Une fois que le MVC a bien pris, truffez-le d&#8217;un FrontController. Parsemez avec quelques MovieClipHelpers. Arrosez finalement le tout avec, selon le choix et l&#8217;humeur, un ModelLocator et/ou un ServiceLocator&#8230;</p>
<p>Pixlib Remoting SUSHI service ? J&#8217;en entends déjà certains dire: il fait dans le recyclage intensif le gars&#8230;</p>
<p><span id="more-8"></span></p>
<p>Dans cet article je vais vous introduire à un joyau de <a href="http://osflash.org/pixlib">Pixlib</a> (il y en tellement&#8230;c&#8217;est une vraie caverne d&#8217;Ali Baba !).<br />
SUSHI service repose sur une recette applicative incroyablement puissante et polyvalente basée sur le pattern MVC. &#8220;Recette&#8221; car ce sont bien des ingrédients qui sont mis à notre disposition. Selon ces ingrédients et l&#8217;inspiration on pourra, par exemple, faire gonfler notre MVC traditionnel en MVC à multiples Models (ModelLocator) ou bien comme c&#8217;est ici le cas, faire lever le tout en &#8220;Super MVC&#8221; (FrontController et ServiceLocator).</p>
<div style="text-align: center;">

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
			id="fm_Loader_636178814"
			class="flashmovie"
			width="390"
			height="270">
	<param name="movie" value="http://www.deja-vue.net/test/pixlib/sushiservice/Loader.swf" />
	<param name="flashvars" value="appUrl=http://www.deja-vue.net/test/pixlib/sushiservice/Application.swf&amp;soPath=ASPizzaService&amp;versionUrl=version.txt" />
	<param name="base" value="http://www.deja-vue.net/test/pixlib/sushiservice/" />
	<!--[if !IE]>-->
	<object	type="application/x-shockwave-flash"
			data="http://www.deja-vue.net/test/pixlib/sushiservice/Loader.swf"
			name="fm_Loader_636178814"
			width="390"
			height="270">
		<param name="flashvars" value="appUrl=http://www.deja-vue.net/test/pixlib/sushiservice/Application.swf&amp;soPath=ASPizzaService&amp;versionUrl=version.txt" />
		<param name="base" value="http://www.deja-vue.net/test/pixlib/sushiservice/" />
	<!--<![endif]-->
		
<p><a href="http://adobe.com/go/getflashplayer"><img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" /></a></p>

	<!--[if !IE]>-->
	</object>
	<!--<![endif]-->
</object></div>
<a class="downloadlink" href="http://www.deja-vue.net/blog/wp-content/plugins/download-monitor/download.php?id=3" title=" downloaded 375 times" >sushiService.zip (375)</a>
<p>- <strong>L&#8217; User Interface</strong></p>
<p>C&#8217;est toujours du <a href="http://osflash.org/actionstep">ActionStep</a> (j&#8217; aurai bien voulu tester <a href="http://www.aswing.org/display/AsWing/Home">ASWing</a> but no time):<br />
Cette fois-ci, les &#8220;forms&#8221; ou &#8220;states&#8221; sont regroupés dans un module swf autonome chargé au runtime dans l&#8217;application principale. Adopter ce design a supposé une nouvelle stratégie d&#8217;instantiation.</p>
<p>- <strong>&#8220;Un système totalement générique&#8221;</strong></p>
<p>L&#8217;addition du FrontController, du MovieClipHelpers et d&#8217;un ModelLocator (classe core.Model) au pattern MVC confère à notre application un degré de modularité exemplaire. L&#8217;essentiel de cet article sera consacré à la description de ce &#8220;Super MVC&#8221;. J&#8217; évoquerai les points qui, d&#8217;un point de vue personnel, m&#8217;ont semblé les plus pertinents.</p>
<p>- <strong>Le service Remoting</strong></p>
<p>Il repose sur la version alpha du package remoting Pixlib. Il est déployé avec souplesse depuis un Singleton ServiceLocator.</p>
<p>Note:<br />
le terme &#8220;state&#8221; à été employé pour désigner les différentes views contenues dans views.swf. Il n&#8217;est donc pas à prendre ici dans son sens premier &#8220;d&#8217;état&#8221; de l&#8217;application (généralement stocké dans un SharedObject, ValueObject, instance de Memento ou autre solution)</p>
<p>Commençons en images afin de prendre rapidemment des repères:</p>
<p>La structure du projet</p>
<p><img id="image21" src="http://www.deja-vue.net/blog/wp-content/uploads/2006/05/sushi_flp.gif" alt="Sushi service flp" /></p>
<p>Diagramme (maison) de la relation FrontController, MovieClipHelper, ServiceLocator &amp; ModelLocator</p>
<p><img id="image23" src="http://www.deja-vue.net/blog/wp-content/uploads/2006/05/sushi%20diagram.gif" alt="Sushi Diagram" /></p>
<p>L&#8217;user Interface en standalone</p>
<p>Désolidariser de la structure de leur précédent hôte (ARP), les différents &#8220;states&#8221; de l&#8217;application (order, viewOrders et navigation) sont de nouveau de banales sous-classes de MovieClip dépourvues de toute fonctionnalité d&#8217; eventdispatching.</p>
<p>Ce nouveau profil de &#8220;plugin&#8221; a supposé changer la façon d&#8217;instancier le container des différents &#8220;states&#8221; de l&#8217;interface. Importée au runtime dans un MovieClip (via GraphicLib), l&#8217;UI doit déjà être instanciée sans dépendance de _root si nous souhaitons pouvoir le connecter à chaud tel un plugin.</p>
<p>L&#8217;astuce ? packager les classes et procéder à  l&#8217; instantiation avec SWFMILL.</p>
<p>La première étape donc: compiler la view<br />
[as]<br />
/**<br />
* @mtasc -version 8 -swf &#8220;classes.swf&#8221; -header 390:270:60:FCFCFC -trust<br />
*/</p>
<p>// Imports&#8230;</p>
<p>class org.actionstep.view.sushi.Application extends MovieClip<br />
{<br />
	// MovieClip linkage<br />
	static var id = (id=&#8221;__Packages.org.actionstep.view.sushi.Application&#8221;)+(Object.registerClass(id,Application)?&#8221;":&#8221;");</p>
<p>	private var navigation : MovieClip;<br />
	private var order : MovieClip;<br />
	private var viewOrders : MovieClip;<br />
	private var dataPreloader : MovieClip;</p>
<p>	function onLoad()<br />
	{<br />
		// ActionStep theming<br />
		org.actionstep.ASTheme.setCurrent(new<br />
		org.actionstep.themes.plastic.ASPlasticTheme());</p>
<p>		// Set the initial display state of the application<br />
		setInitialDisplayState();</p>
<p>		// Views Instantiation (no FLA here)<br />
		navigation = attachMovie(Navigation.id,&#8221;navigation&#8221;, 1);<br />
		viewOrders = attachMovie(ViewOrders.id,&#8221;viewOrders&#8221;, 2);<br />
		order = attachMovie(Order.id,&#8221;order&#8221;, 3);<br />
	}<br />
	// &#8230;<br />
}<br />
[/as]</p>
<p>La deuxième étape: instancier avec SWFMILL</p>
<p>[xml]</p>
<p><?xml version="1.0" encoding="iso-8859-1"?><br />
<movie version="8" width="390" height="270" framerate="60"><br />
    <background color="#ffffff"/><br />
    <frame></p>
<library>
            <clip id="Application" class="org.actionstep.view.sushi.Application" import="classes/classes.swf" />
        </library>
<place id="Application" name="app" x="0" y="0" depth="1" />
    </frame><br />
</movie></p>
<p>[/xml]</p>
<p>L&#8217;initialisation MVC</p>
<p>L&#8217;application principale (Application.as) est lancée de façon conventionnelle avec main().<br />
Le Model est d&#8217;abord instancié. Notre unique vue, une sous-classe MovieClipHelper, s&#8217;abonne à l&#8217; écoute du Model. Le controller, un Singleton et sous-classe de FrontController est finalement initialisé. Le controller est le ciment de l&#8217;application. C&#8217;est lui qui va associer évènements typés et instances de commandes.</p>
<p>[as]<br />
private function _init() : Void<br />
{<br />
	var model : Model = new SUSHIExpert();<br />
	model.addListener( new SUSHIListUI() );<br />
	Controller.getInstance().init();<br />
}<br />
[/as]</p>
<p><strong>I. LES VIEWS</strong></p>
<p>Chargement de la View standalone</p>
<p>GraphicLib et Libstack, du chargement et multichargement intelligent.<br />
Au travers de ces 2 implementations concrètes d&#8217;AbstractLib, nos assets sont chargés et stockés avec un identifiant de type String. En l&#8217;occurence, ces identifiants sont prédéfinis sous formes de constantes accessibles en static depuis sushi.uis.UIList. Ceci permet une meilleure traçabilité du couplage entre les assets et leurs &#8216;accesseurs&#8217;.</p>
<p>[as]<br />
var gl : GraphicLib = new GraphicLib( this, 20 );<br />
gl.setName( UIList.SUSHI_List );<br />
gl.addEventListener( GraphicLib.onLoadInitEVENT, this, _init );<br />
gl.load( &#8220;deploy/views.swf&#8221; );<br />
[/as]</p>
<p>ou</p>
<p>[as]<br />
var libs = new LibStack();<br />
libs.enqueue(new GraphicLib(this, 20, false), UIList.SUSHI_List, &#8220;deploy/views.swf&#8221;);<br />
libs.addEventListener( LibStack.onLoadCompleteEVENT, this, _init );<br />
libs.execute();<br />
[/as]</p>
<p>Les éléments sont ensuite accessibles globalement de plusieurs façons:</p>
<p>- <strong>Depuis le Singleton GraphicLibLocator</strong>:</p>
<p>[as]<br />
var myView:MovieClip = GraphicLibLocator.getInstance().getGraphicLib( UIList.SUSHI_List ).getView();<br />
[/as]</p>
<p>- <strong>Depuis une sous-classe MovieClipHelper</strong>:</p>
<p>[as]<br />
// SUSHIListUI.as</p>
<p>class sushi.uis.SUSHIListUI<br />
	extends MovieClipHelper<br />
{<br />
	public function SUSHIListUI ()<br />
	{<br />
		super( UIList.SUSHI_List );<br />
	}<br />
}<br />
[/as]</p>
<p>- <strong>Depuis une sous-classe ViewHelper</strong><br />
[as]<br />
import com.bourre.data.libs.GraphicLib;<br />
import com.bourre.visual.ViewHelper;<br />
import sushi.uis.UIList;</p>
<p>class sushi.uis.SUSHIListUI<br />
	extends ViewHelper<br />
{<br />
	public function SUSHIListUI ( gl : GraphicLib )<br />
	{<br />
		super( gl.getView(), UIList.SUSHI_List );</p>
<p>		view.app.showDataPreloader();<br />
		gl.show();<br />
	}<br />
}<br />
[/as]</p>
<p>C&#8217;est vraiment très pratique d&#8217;avoir un accès global sur les views:<br />
Par exemple, si je souhaite déclencher une action sur une view depuis une Command:</p>
<p>Avec GraphicLibLocator:<br />
[as]<br />
import com.bourre.data.libs.GraphicLibLocator<br />
import sushi.uis.UIList;</p>
<p>class sushi.commands.PlaceOrder<br />
	implements Command<br />
{<br />
	public function execute( e : IEvent ) : Void<br />
	{<br />
		var myView:MovieClip = GraphicLibLocator.getInstance().getGraphicLib( UIList.SUSHI_List ).getView();<br />
		myView.app.orderProcessed();<br />
	}<br />
}<br />
[/as]<br />
avec MovieClipHelper<br />
[as]<br />
import com.bourre.visual.MovieClipHelper<br />
import sushi.uis.UIList;</p>
<p>class sushi.commands.PlaceOrder<br />
	implements Command<br />
{<br />
	public function execute( e : IEvent ) : Void<br />
	{<br />
		var myView = MovieClipHelper.getMovieClipHelper(UIList.SUSHI_List);<br />
		myView.view.app.showDataPreloader();<br />
		myView.traceTest(); // calling a method on SUSHIListUI<br />
	}<br />
}<br />
[/as]</p>
<p>Ici, en ce qui nous concerne, Sushi service n&#8217;a qu&#8217;une seule View de type MovieClipHelper</p>
<p>Sur une instance de MovieClipHelper on va, typiquement:</p>
<p>- définir le comportement des objets (TextField, MovieClips, v2 components&#8230;) présents dans la View au moyen de leurs noms d&#8217;instances.</p>
<p>Dans le cas de Sushi service, l&#8217;UI ActionStep n&#8217;est pas qu&#8217;une coque vide.</p>
<p>La view externe possède déjà des méthodes:</p>
<p>hideDataPreloader();<br />
showDataPreloader();<br />
orderFormSelect();<br />
viewOrdersFormSelect();</p>
<p>Ensuite, dans chaque &#8220;state&#8221; ( Navigation, Order, ViewOrders ), les event handlers des boutons sont déjà  définis, ex.:</p>
<p>[as]<br />
// NSButton<br />
placeOrderButton = (new NSButton()).initWithFrame(new NSRect(300, 205, 80, 22));<br />
placeOrderButton.setStringValue(&#8220;Place order&#8221;);<br />
placeOrderButton.setTarget(this);<br />
placeOrderButton.setAction(&#8220;placeOrder&#8221;);<br />
view.addSubview(placeOrderButton);<br />
[/as]</p>
<p>C&#8217;est pas grave du tout ^^. On va piloter et arranger le scope depuis notre sous-classe MovieClipHelper <img src='http://www.deja-vue.net/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>[as]<br />
class sushi.uis.SUSHIListUI<br />
	extends MovieClipHelper<br />
{<br />
	private function _initBehaviors() : Void<br />
	{<br />
		_pbCancelOrder.setTarget(this);<br />
		_pbCancelOrder.setAction(&#8220;cancelOrder&#8221;);</p>
<p>		_dSelectViewOrders = new Delegate(view.app, view.app.viewOrdersFormSelect);<br />
		_dShowPreloader = new Delegate(view.app, view.app.showDataPreloader);<br />
	}</p>
<p>	private function _gotoViewOrders() : Void<br />
	{<br />
		_dSelectViewOrders.execute();<br />
		_dShowPreloader.execute();<br />
	}</p>
<p>	private function cancelOrder() : Void<br />
	{<br />
		_dShowPreloader.execute();<br />
		_fireEvent(new BasicEvent(EventList.cancelOrderEVENT, view.app.viewOrders.getOrder() ));<br />
	}<br />
}<br />
[/as]</p>
<p>Une &#8220;architecture de legos&#8221; où nous avons un contrôle total sur chaque pièce autonome pluggée.</p>
<p>Reprenons un peu le fil.<br />
Sur une instance de MovieClipHelper, on va aussi:</p>
<p>- définir les callbacks du ou des Models.<br />
- diffuser (avec notre EventBroadcaster global) des messages de type BasicEvent ou customs (sous-classe BasicEvent) vers les commandes correspondantes.</p>
<p><strong>N&#8217;hésitez pas à étendre BasicEvent afin de créer vos propres event objects. C&#8217;est une autre pierre angulaire de Pixlib</strong>.</p>
<p>Jetez un oeil à la méthode placeOrder(). Vous verrez qu&#8217;elle broadcaste un événement de type OrderEvent.<br />
[as]<br />
private function placeOrder() : Void<br />
{<br />
	_gotoViewOrders();<br />
	_fireEvent(new OrderEvent(EventList.placeOrderEVENT, view.app.order.orderName, view.app.order.orderTicket));<br />
}<br />
[/as]</p>
<p>Attention, la comparaison est malheureuse, mais c&#8217;est juste pour faire capter rapidement l&#8217;idée à ceux qui sont d&#8217;un background ARP:<br />
Voyez OrderEvent comme un Value Object (VO) passant les informations à la commande.<br />
Voilà , vous pouvez vous lacher et crier hérésie haut et fort ^^.</p>
<p><strong>II. Le FrontController</strong></p>
<p>C&#8217;est dans sushi.commands.Controller (sous-classe de FrontController) que sont associés et stockés Events et Commands. A la différence du ControllerTemplate d&#8217;ARP, le FrontController n&#8217;impose aucune référence directe sur les views. Less coupling!</p>
<p>FrontController:<br />
[as]<br />
public function init() : Void<br />
{<br />
	push ( EventList.placeOrderEVENT, new PlaceOrder() );<br />
	push ( EventList.getOrdersEVENT, new GetOrders() );<br />
	push ( EventList.cancelOrderEVENT, new CancelOrder() );<br />
}<br />
[/as]</p>
<p>ControllerTemplate:<br />
[as]</p>
<p>private function addEventListeners ()<br />
{<br />
	app.orderForm.addEventListener ( &#8220;orderPizza&#8221;, this );<br />
	app.viewOrdersForm.addEventListener ( &#8220;getOrderList&#8221;, this );<br />
	app.viewOrdersForm.addEventListener ( &#8220;cancelOrder&#8221;, this );<br />
}</p>
<p>private function addCommands ()<br />
{<br />
	addCommand ( &#8220;orderPizzaCommand&#8221;, OrderPizzaCommand );<br />
	addCommand ( &#8220;getOrderListCommand&#8221;, GetOrderListCommand );<br />
	addCommand ( &#8220;cancelOrderCommand&#8221;, CancelOrderCommand );<br />
}<br />
[/as]</p>
<p><strong>III. ServiceLocator et Commands</strong></p>
<p>Dans le Singleton ServiceLocator nous définissons et stockons un ou plusieurs services remoting (selon nos besoins). Le nom d&#8217;alias de chaque service est défini en static.</p>
<p>- <em>La définition du service remoting</em>:</p>
<p>[as]<br />
// sushi.service.ServiceLocator<br />
public static var SUSHISERVICE:String = &#8220;dejavue_net.sushi.sushiService&#8221;;</p>
<p>public function init( remotingURL : String ) : Void<br />
{<br />
	gatewayURL = &#8220;http://www.deja-vue.net/amfphp/gateway.php&#8221;;<br />
	push( ServiceLocator.SUSHISERVICE, ServiceLocator.SUSHISERVICE );<br />
}<br />
[/as]</p>
<p>- <em>Configuration type d&#8217;une commande</em>:</p>
<p>1. Localisation du service remoting et appel et de la remote method</p>
<p>Attention, à l&#8217;heure où cet article est écrit, le package remoting est toujours en version alpha et non disponible depuis le svn. Je ne m&#8217; étendrai donc pas sur l&#8217;implémentation du responder ni sur l&#8217;API.</p>
<p>[as]<br />
// class sushi.commands.PlaceOrder</p>
<p>public function PlaceOrder()<br />
{<br />
	_service = ServiceLocator.getInstance().getService( ServiceLocator.SUSHISERVICE );<br />
}</p>
<p>public function execute( e : OrderEvent ) : Void<br />
{<br />
	_service.order( new ServiceResponder(this), e.getName(), e.getTicket() );<br />
}</p>
<p>public function onResult( e : BasicResultEvent ) : Void<br />
{</p>
<p>}</p>
<p>public function onFault(e : BasicFaultEvent) : Void<br />
{</p>
<p>}<br />
[/as]</p>
<p>2. Tous les chemins mènent à Rome:</p>
<p>Là , c&#8217;est GRANDIOSE. Depuis une commande (pas seulement d&#8217;ailleurs) nous pouvons:</p>
<p>- appeler la view de notre choix (rappelez-vous de GraphicLibLocator, MovieClipHelper et ViewHelper).<br />
- broadcaster un event typé et déclencher une nouvelle commande.<br />
[as]<br />
EventBroadcaster.getInstance().broadcastEvent( new BasicEvent(EventList.getOrdersEVENT) );<br />
[/as]<br />
- appeler le model de notre choix.<br />
[as]<br />
SUSHIExpert(Model.getModel( ModelList.SUSHI_EXPERT )).onUpdate( e.getResult() );<br />
[/as]</p>
<p>Epoustouflant d&#8217;avoir autant de contrôle  <img src='http://www.deja-vue.net/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Le mot de la fin (il est temps! ^^):</p>
<p>Il y a 2 jours, j&#8217; étais parti bille en tête avec l&#8217;idée de faire un papier sur le package MVC de Pixlib. En même temps, je me disais que c&#8217; était un peu léger comme sujet. C&#8217;est en approfondissant les packages events et visual que j&#8217;en suis arrivé au FrontController + MovieClipHelper et à approfondir. Pixlib n&#8217;avait pas fini de m&#8217; étonner&#8230;<br />
Je reste bluffé. Je ne m&#8217;attendais vraiment pas ça. Devinez avec quoi je vais boulonner mon prochain projet <img src='http://www.deja-vue.net/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .</p>
<p>Chapeau bas à Francis.</p>
<p>Liens de Référence:</p>
<p>-MVC et FrontController<br />
<a href="http://www.tweenpix.net/blog/index.php?2004/09/22/460-whiteboard-10">http://www.tweenpix.net/blog/index.php?2004/09/22/460-whiteboard-10</a><br />
<a href="http://osflash.org/pipermail/pixlib_osflash.org/2006-March/000257.html">Discussion about models in mvc and front controller patterns on Pixlib list </a></p>
<p>GraphicLib, LibStack et MovieClipHelper<br />
<a href="http://www.get-url.net/blog/?47--pixlib-libstack-ou-le-multi-chargement">http://www.get-url.net/blog/?47&#8211;pixlib-libstack-ou-le-multi-chargement</a><br />
<a href="http://www.get-url.net/blog/?48--pixlib-graphiclib-et-moviecliphelper-vs-movieclip-parti">http://www.get-url.net/blog/?48&#8211;pixlib-graphiclib-et-moviecliphelper-vs-movieclip-parti</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.deja-vue.net/blog/2006/05/25/actionstep-plugin-view-pixlib-mvc-frontcontroller-remoting-sushi-service/feed/</wfw:commentRss>
		<slash:comments>26</slash:comments>
		</item>
		<item>
		<title>Open Source Flash Pizza for everyone ! follow-up &#8211; Shared Fonts</title>
		<link>http://www.deja-vue.net/blog/2006/05/16/open-source-flash-pizza-for-everyone-follow-up-shared-fonts/</link>
		<comments>http://www.deja-vue.net/blog/2006/05/16/open-source-flash-pizza-for-everyone-follow-up-shared-fonts/#comments</comments>
		<pubDate>Tue, 16 May 2006 19:58:55 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Application Architecture]]></category>
		<category><![CDATA[AS2]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[Pixlib]]></category>

		<guid isPermaLink="false">http://www.deja-vue.net/blog/2006/05/16/open-source-flash-pizza-for-everyone-follow-up-shared-fonts/</guid>
		<description><![CDATA[<p>Posted in <a href="http://www.deja-vue.net/blog/category/application-architecture/" title="Application Architecture">Application Architecture</a><a href="http://www.deja-vue.net/blog/category/as2/" title="AS2">AS2</a><a href="http://www.deja-vue.net/blog/category/mvc/" title="MVC">MVC</a><a href="http://www.deja-vue.net/blog/category/pixlib/" title="Pixlib">Pixlib</a></p>[lang_fr] On m&#8217;a demandé des précisions sur la technique des &#8220;polices partagées&#8221; utilisée dans OSFlash Pizza. En voici le secret&#8230; [/lang_fr] [lang_es] Me han pedido que precise sobre la técnica de las &#8220;fuentes compartidas&#8221; utilizada en OSFlash Pizza. He aquí el secreto&#8230; [/lang_es] Structure de georgia.xml [xml]                 [...]]]></description>
			<content:encoded><![CDATA[<p>[lang_fr]<br />
On m&#8217;a demandé des précisions sur la technique des &#8220;polices partagées&#8221; utilisée dans <a href="http://www.deja-vue.net/blog/2006/05/15/open-source-flash-pizza-for-everyone/">OSFlash Pizza</a>. En voici le secret&#8230;<br />
[/lang_fr]</p>
<p>[lang_es]<br />
Me han pedido que precise sobre la técnica de las &#8220;fuentes compartidas&#8221; utilizada en <a href="http://www.deja-vue.net/blog/2006/05/15/open-source-flash-pizza-for-everyone/">OSFlash Pizza</a>. He aquí el secreto&#8230;<br />
[/lang_es]<br />
<span id="more-7"></span></p>
<p>Structure de georgia.xml</p>
<p>[xml]<br />
<?xml version="1.0" encoding="iso-8859-1" ?><br />
<movie width="1" height="1" framerate="12"><br />
    <frame><br />
       
<library>
            <font import="src/ttf/georgia.ttf"/><br />
        </library>
        <import url="http://www.deja-vue.net/test/shared/swf/fonts/Georgia Gras.swf"></import><br />
    </frame><br />
</movie><br />
[/xml] </p>
<p>On compile avec la ligne de commande suivante:</p>
<p>[xml]<br />
swfmill simple &#8220;src/georgia.xml&#8221; &#8220;deploy/Georgia Gras.swf&#8221;<br />
[/xml]</p>
<p>Voilà !</p>
<p>Ensuite, libre à vous de choisir la façon de charger la police.</p>
<p>Dans le cas d&#8217; OSFlash Pizza j&#8217; ai choisi la voie du MovieClipLoader. Très pratique mais que je déconseille pour la production. Sa gestion des timeout est inéxistante et l&#8217; utilisation de la méthode onLoadError conduit à des catastrophes.</p>
<p>Sur mes projets j&#8217; utilise la classe LibStack de Pixlib. Si vous ne savez toujours pas ce qu&#8217;est Pixlib, rendez-vous <a href="http://osflash.org/pixlib">ici</a>. Attention, dernière fois que je répète !.</p>
<p><strong>UPDATE:</strong></p>
<p>NOM DE LA FONTE ET RISQUE DE CONFUSION.</p>
<p>Attention à utiliser le &#8220;vrai&#8221; nom de la fonte au moment du format coté Flash.</p>
<p>La fonte Georgia Gras illustre parfaitement ce cas. En effet, bien qu&#8217;il s&#8217;agisse d&#8217;une variante de Georgia, son nom réel est pourtant &#8220;Georgia&#8221;.<br />
Ou trouver cette référence ? Dans le fichier TTF lui-même, après indication de la signature numérique.</p>
<p>Un bemol</p>
<p>Je n&#8217;ai pas encore pu cerner la raison exacte, mais il semblerait qu &#8216;un délai soit parfois nécessaire afin d&#8217;assurer la disponibilité de la fonte dans la librairie.</p>
<p>Pour OSFlash pizza, l&#8217;instantiation de l&#8217;application a été retardée avec un setTimeout:</p>
<p>[as]<br />
public function Main(target)<br />
{<br />
	target.__proto__ = this.__proto__;<br />
	target.__constructor__ = Main;<br />
	this = target;</p>
<p>	XrayLoader.loadConnector(&#8220;main_xray_v1.3.4.swf&#8221;, _level1);</p>
<p>	setTimeout(this, &#8220;init&#8221;, 500);<br />
}</p>
<p>private function init()<br />
{<br />
	var pizza = Application( attachMovie(Application.id, &#8220;pizzaService&#8221;, 1) );<br />
}<br />
[/as]</p>
<p>Je remercie <a href="http://www.v-i-a.net/blog/ ">erixtekila </a>qui m&#8217; a indiqué comment simplifier (de moitié!) la configuration xml. En fin de compte si vous lisez son <a href="http://www.v-i-a.net/blog/archives/000043.html">article</a> qui traite le même sujet, on s&#8217;aperçoit que les techniques sont bel et bien identiques. A une nuance près, celle exposée ci tient en un seul xml.</p>
<p>Liens d&#8217; intérêt sur Libstack<br />
<a href="http://www.get-url.net/blog/?47--pixlib-libstack-ou-le-multi-chargement">http://www.get-url.net/blog/?47&#8211;pixlib-libstack-ou-le-multi-chargement</a><br />
<a href="http://www.rosyflower.net/dotclear/index.php?2005/12/22/17-preloader-pixlib-">http://www.rosyflower.net/dotclear/index.php?2005/12/22/17-preloader-pixlib-</a></p>
<p>[lang_es]<br />
Estructura de georgia.xml<br />
[xml]<br />
<?xml version="1.0" encoding="iso-8859-1" ?><br />
<movie width="1" height="1" framerate="12"><br />
    <frame><br />
       
<library>
            <font import="src/ttf/georgia.ttf"/><br />
        </library>
        <import url="http://www.deja-vue.net/test/shared/swf/fonts/Georgia Gras.swf"></import><br />
    </frame><br />
</movie><br />
[/xml] </p>
<p>Compilamos con la siguiente línea de comandos:</p>
<p>[xml]<br />
swfmill simple &#8220;src/georgia.xml&#8221; &#8220;deploy/Georgia Gras.swf&#8221;<br />
[/xml]</p>
<p>VoilÃ !</p>
<p>Luego, sois libres de escoger la forma de cargar la fuente.</p>
<p>En el caso de OSFlash Pizza, he escogido el MovieClipLoader. Muy práctico, pero que  desaconsejo para la producción. Su gestión de los timeout es inexistente y el uso del método onLoadError conduce a catástrofes.</p>
<p>En mis proyectos, uso la clase LibStack de Pixlib. Si ne sabáis aún lo que es Pixlib, id <a href="http://osflash.org/pixlib">aquí</a>. Atención, es la última vez que repito <img src='http://www.deja-vue.net/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .</p>
<p><strong>ACTUALIZACIÓN:</strong></p>
<p>NOMBRE DE LA FUENTE Y RIESGO DE CONFUSIÓN.</p>
<p>Cuidado con utilizar el &#8220;verdadero&#8221; nombre de la fuente en el momento de dar formato en Flash.</p>
<p>La fuente Georgia Gras ilustra perfectamente este caso. En efecto, a pesar de que se trata de una variante de Georgia, su nombre real es sin embargo &#8220;Georgia&#8221;.<br />
¿Dónde encontrar esa referencia? En el fichero TTF mismo, trás la indicación de la firma digital.</p>
<p>Un bemol</p>
<p>Aún no he podido encontrar la razón exacta pero parece que un intervalo es a veces necesario para asegurar la disponibilidad de la fuente en la librería.</p>
<p>Para OSFlash pizza, la instanciación de la aplicación ha sido retardada con un setTimeout:</p>
<p>[as]<br />
public function Main(target)<br />
{<br />
	target.__proto__ = this.__proto__;<br />
	target.__constructor__ = Main;<br />
	this = target;</p>
<p>	XrayLoader.loadConnector(&#8220;main_xray_v1.3.4.swf&#8221;, _level1);</p>
<p>	setTimeout(this, &#8220;init&#8221;, 500);<br />
}</p>
<p>private function init()<br />
{<br />
	var pizza = Application( attachMovie(Application.id, &#8220;pizzaService&#8221;, 1) );<br />
}<br />
[/as]</p>
<p>Doy las gracias a <a href="http://www.v-i-a.net/blog/ ">erixtekila </a>que me indicó cómo simplificar (a la mitad!) la configuracíon xml. A fin de cuentas, si leáis su <a href="http://www.v-i-a.net/blog/archives/000043.html">artículo</a> que trata del mismo tema, os daráis cuenta de que las técnicas son perfectamente identicas. Salvo alguna excepción, la de este artículo cabe en un solo xml.</p>
<p>Vínculos de interés en Libstack<br />
<a href="http://www.get-url.net/blog/?47--pixlib-libstack-ou-le-multi-chargement">http://www.get-url.net/blog/?47&#8211;pixlib-libstack-ou-le-multi-chargement</a><br />
<a href="http://www.rosyflower.net/dotclear/index.php?2005/12/22/17-preloader-pixlib-">http://www.rosyflower.net/dotclear/index.php?2005/12/22/17-preloader-pixlib-</a><br />
[/lang_es] </p>
]]></content:encoded>
			<wfw:commentRss>http://www.deja-vue.net/blog/2006/05/16/open-source-flash-pizza-for-everyone-follow-up-shared-fonts/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
	</channel>
</rss>

