Gestire packages multipli per components

Immagini

Immagine 1

C’è una relazione tra gli MXML Components e quelli sviluppati con Actionscript. In fase di compilazione si Un’applicazione Flex può avere ed utilizzare molti componenti. Flex da la possibilità di importare progetti esterni in fase di creazione di un nuovo progetto o accedendo al menu Project > Properties. Dallo stesso pannello è anche possibile importare Library di componenti compilati in formato SWC. Tutto questo per ottimizzare lo sviluppo di applicazioni riusando i componenti precedentemente sviluppati.
In questo scenario la scelta della struttura dei package è delicata e di fondamentale importanza per cercare di non creare conflitti e di rendere il codice più pulito possibile, e quindi più facile da leggere.
In questa soluzione vedremo come applicare dei metodi e seguire delle best practise per non incappare in questa tipologia di errore.

Nelle applicazioni "reali" potreste vedere i componenti custom all'interno del package che utilizza come convenzione per i nomi la domain name structure (e.g., xmlns:custom=”com.adobe.quickstarts.customcomponents.*”). Questa convenzione elimina i conflitti sul namespace tra componenti chiamati allo stesso modo ma con differenti venditori. Ad esempio due librerie di componenti possono avere ognuna all'interno un Map component che utilizzate nella vostra applicazione. Se uno è nel pacchetto com.vendorA e l'altro in quello com.vendorB, non andranno in conflitto.

Per invocare e referenziare un componente all’interno del main application il primo step da compiere è quello di dichiarare un custom namespace che punta al package che contiene le dichiarazioni dei componenti.
Il namespace viene impostato con la proprietà xmlns seguita dal suffisso. Per i file MXML si definisce il suffisso “mx”, che indica la collection di tag MXML legali che potete utilizzare nella vostra applicazione:

<mx:Application xmlns:mx=”http://www.adobe.com/2006/mxml”>

il valore dato al namespace, http://www.adobe.com/2006/mxml, è un Uniform Resource Identifier (URI) che associa il prefisso mx con un file in flex-config.xml.
Quando dobbiamo invece creare un custon name space puntiamo ad un package che rappresenta la folder che contiene le dichiarazioni dei componenti:

<mx:Application xmlns:mx=”http://www.adobe.com/2006/mxml”
xmlns:myPref=”myFolder.*” >

Ma nel caso in cui il nostro progetto utilizzasse differenti package contenenti differenti components, potremmo ottenere il seguente risultato:

xmlns:mx="”http://www.adobe.com/2006/mxml”">xmlns:myPref=”myFolder.*” xmlns:myPrefA =”myFolderA.*” xmlns:myPrefZ =”myFolderZ.comp.*” >

Invece che rendere il codice difficile da leggere e da gestire, Flex permette di definire i namespace anche in line, dichiarandoli cioè all’interno del tag che invoca il componete. Vediamo questa procedura nell’esempio.

Come realizzarlo
Quando si invoca un componente solitamente si definisce il custon namespace nel tag Application usando l’attributo xmlns. Ma nel caso in cui lo sviluppatore debba utilizzare più name space per puntare a parti differenti del vostro software (in package diversi), piuttosto che inserire le dichiarazione in un unico tag (l’Application tag) è possibile dichiararli in line sul componente invocato.

1. Download il Flex Ajax Bridge da http://download.macromedia.com/pub/labs/flex/2/FABridge_B3_05-08.zip
Il Flex-Ajax Bridge (FABridge) è una piccola libreria di codice che potete inserire in una applicazione Adobe Flex, in un Flex component, o anche in un file SWF vuoto da esporre nello scripting del browser.

2. Unzip il file e copia la cartella “src” nell' ActionScript <code>classpath</code> della tua applicazione Flex

3. Seleziona il progetto nella vista Navigation, clicka con il tasto destro del mouse e scegli Properties. Seleziona Flex Build Path dove puoi aggiungere la "bridge” class path section come mostrato dalla figura 1

4. Create un nuovo documento MXML Application dal File > New > MXML application e assegnategli  il nome Chapter_2_Sol_4.mxml. Questo sarà il nostro main application file che invocherà il componente

5. Invochiamo il componente creato nella Solution 2.1 andando prima a dichiarare un custom namespace all’interno del tag  Application:

<mx:Application xmlns:mx=”http://www.adobe.com/2006/mxml”
 layout=”absolute”
    xmlns:comp = “*”>
   
    <comp:Chapter_2_Sol_1 />
</mx:Application>
6. Adesso andiamo ad aggiungere il componente per usare la Flex-Ajax Bridge (FABridge) class e all’interno dello stesso tag andremo a creare il custom namespace: <?xml version=”1.0” encoding=”utf-8”?>
<mx:Application xmlns:mx=”http://www.adobe.com/2006/mxml”
 layout=”absolute”
    xmlns:comp = “*”>
   
    <comp:Chapter_2_Sol_1 />
 
 <fab:FABridge xmlns:fab=”bridge.*” />
 
</mx:Application>

Con questo metodo possiamo rendere il codice più leggibile e facilmente manutenibile, facendo riferimento ad una singola chiamata di una classe Actionscript, usando un attributo xmlns direttamente nella dichiarazione del tag.