2009-06-16 6 views
1

Si j'ai un tas d'objets anciens, quelle est la meilleure façon de les mapper à un groupe de classes?Mappage d'objets ActionScript à des classes?

Par exemple, si j'utilise un HTTPService pour tirer dans certains JSON, désérialiser puis, je vais avoir un tas d'objets qui ressemblent à:

{ type: "person", 
    id: 42, 
    name: "David" } 

Et je veux les transformer en cas de une classe Personne:

class Person { 
    id:int; 
    name:String; 
} 

Existe-t-il une manière standard et générale de procéder?

(également à considérer: que diriez-vous d'une manière classique de traiter les relations entre les objets Par exemple, si la personne avait un champ « conjoint » supplémentaire:

{ type: "person", spouse: 61, ... } // Where 61 is the ID of the spouse 

)

Merci, David

+0

utilisez-vous AMF pour recevoir vos données? – Josh

+0

Non ... Ce serait plus facile si j'utilisais AMF, mais d'autres choses (en particulier, le code côté serveur) deviendraient beaucoup plus complexes. –

Répondre

3

Il n'existe pas de méthode standard, mais vous pouvez l'utiliser de deux manières différentes.

Version 1: Méthode de Constructor

public class Person { 
public function Person(raw:Object=null) { 
    if (raw != null) { 
    for (var key:String in raw) { 
    try { 
    this[key] = raw[key]; 
    } catch (e:Error) {} 
    } 
    ... 

Ce genre d'erreur est sujette. Si une propriété nommée key n'existe pas, l'affectation échouera et si le type ne correspond pas ou ne peut pas être forcé, il échouera également.

Version 2: flash.utils.describeType()

beaucoup plus sophistiqué, vous donne plus de contrôle. Vous devez d'abord créer une instance de Person et appeler describeType(). Mais attention lorsque vous utilisez des getters et des setters à la place des variables publiques. Vous ne pouvez pas y accéder avec typeDesc.variable, à la place vous devez utiliser typeDesc.accessor et vérifier si son attribut d'accès n'est pas writeonly.

En ce qui concerne votre clé de type. Pour charger une classe dynamique que vous pouvez faire:

var clazz:Class = flash.utils.getDefinitionByName(raw.type+""); 
var person:Person = Person(new clazz()); 

Bien sûr raw.type peut contenir Personne ou com.package.Person aussi longtemps que votre classe existe cible et est en cours d'élaboration avec le projet ou dynamique chargé avec SWC.

Jetez un oeil à:

http://livedocs.adobe.com/flex/3/langref/flash/utils/package.html#getDefinitionByName() et http://livedocs.adobe.com/flex/3/langref/flash/utils/package.html#describeType()

Hope this helps :)

+0

Oui, c'est le cas - merci beaucoup. –

1

Pour garder les choses propres et moins sujette aux erreurs, j'utiliser des objets séparés pour accomplir ces deux tâches .Par exemple, pour gérer la conversion, vous pourriez avoir l'objet suivant:

public class PersonFactory 
{ 
    function buildFromGenerics(objects:Array):Array 
    { 
     var a:Array = []; 
     var l:int = objects.length; 

     for (var i:int = 0; i < l; i++) 
     { 
      var o:Object = objects[i]; 
      var p:Person = new Person(); 
      p.id = o['id']; 
      p.name = o['name']; 
      a[i] = p 
     } 

     return a; 
    } 
} 

mouvement toute la logique de cette étape dans un objet séparé vous permet d'isoler cette fonctionnalité, ce qui est vraiment indépendante de l'objet Personne réelle, il n'y a donc pas de buissness dedans.

Pour la deuxième situation j'utiliser un objet distinct qui vous retient tous les objets en personne, et fournit une interface pour les récupérer, comme l'a démontré ici:

public class PersonCollection 
{ 
    private var _people:Array; 

    public function setPeople(people:Array):void 
    { 
     _people = people; 
    } 

    public function getPersonByID(id:int):Person 
    { 
     var l:int = _people.length; 

     for (var i:int = 0; i < l; i++) 
     { 
      var p:Person = _people[i]; 

      if (p.id == id) 
      { 
       return p; 
      } 
     } 

     return null; 
    } 
} 

Cette séparation permet de garder votre code propre , et fournit également un moyen facile de travailler avec et de le gérer. J'espère que cela pourra aider.

+0

Cela aide - merci. –

Questions connexes