2009-10-14 6 views
1

Ainsi, dans actionscript 3, les instances de la classe Object peut être utilisé un tableau comme associatif:Actionscript « objet » étiqueté comme une véritable structure de données pour une meilleure lisibilité

var doNotHaveSexWith:Object = new Object(); 
doNotHaveSexWith['mum'] = new Person(...); 
doNotHaveSexWith['dad'] = new Person(...); 
doNotHaveSexWith['dave'] = new Person(...); 

Dire que j'ai une classe, et l'un de ses membres est un objet en lecture seule qui contient ma collection de personnes.

Je pense que la lisibilité de code prend un coup majeur si je renvoie cet 'objet', comment le programmeur pourrait-il savoir quoi en faire? La seule façon pour quelqu'un de savoir qu'il s'agit d'une collection est de lire le code ou les commentaires ...

Quelle est la meilleure façon de signaler qu'un objet est une collection, plutôt qu'un simple objet?

Options:

  • créer une classe dynamique, simplement extension de l'objet, appelé "tableau associatif" ou quelque chose, juste sorte que le code devient plus lisible ...

  • Utilisation quelque chose comme le AS3 Datastructures Library, bien que ce semble être un peu exagéré.

  • Vous venez d'ajouter le mot Collection à la fin du nom de la variable?

Par exemple:

var hotPeopleCollection:Object = new Object(); 
hotPeopleCollection['me'] = new Person(...); 
hotPeopleCollection['sandrasully'] = new Person(...); 

Que pensez-vous?

Mise à jour: J'ai décidé d'utiliser un dictionnaire d'extension de classe personnalisé. De cette façon, je peux envelopper une fonction d'accès sensible autour de la fonction de recherche: hasOwnProperty et donner un nom significatif à la classe.

J'ai choisi Dictionnaire sur l'objet pour deux raisons:

  1. Dictionnaire logique plus intuitive pour une collection
  2. Dictionnaire apparaît pour effectuer à O (1) pour la recherche. Voir ceci assez informel dictionary vs array vs object performance benchmark

Répondre

2

Utilisez un dictionnaire.

http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/utils/Dictionary.html

Vous pouvez toujours utiliser une chaîne pour votre clé, ou tout autre objet pour cette question.

var dict:Dictionary = new Dictionary(); 
var obj:Object = new Object(); 
var key:Object = new Object(); 
key.toString = function() { return "key" } 

dict[key] = "Letters"; 
obj["key"] = "Letters"; 

dict[key] == "Letters"; // true 
obj["key"] == "Letters"; // true 
obj[key] == "Letters"; // true because key == "key" is true because key.toString == "key" 
dict["key"] == "Letters"; // false because "key" === key is false 
delete dict[key]; //removes the key 

Un grand nombre de développeurs (moi inclus) vous diront: N'utilisez jamais un objet. Vous êtes en train de bander les yeux votre compilateur. Utilisez toujours un type de données intégré ou créez le vôtre. Maintenant, évidemment, vous ne saviez pas sur les dictionnaires dans ce cas, mais en règle générale, si vous pensez que vous voulez utiliser un vieux type de données Object simple, détrompez-vous.

Mise à jour:

Un autre lien que vous trouverez peut-être utile:

http://www.gskinner.com/blog/archives/2006/07/as3_dictionary.html

+0

Super, exactement ce dont j'ai besoin merci. Est-ce que c'est juste moi ou AS3 manque-t-il de structures de données? – timoxley

+0

Oui et non. Flash Player 10 apporte des vecteurs qui sont le seul type de données réel qui me manque. ArrayList est un autre qui arrive bientôt (je suppose que c'est dans flex4) qui sera bien aussi comme une alternative au poids lourd ArrayCollection. Mais pour la plupart, tout ce dont j'ai besoin est spécifique à un domaine, ce qui signifie que je dois l'écrire quand même;) –

+0

Je ne suis pas un de ces développeurs, mais je vois ce que vous voulez dire. D'un autre côté, c'est comme dire "n'utilise pas de tableau" parce que tu ne sais pas ce qu'il y a dedans. Un objet _is_ est un tableau associatif. C'est tellement flexible que tout en hérite. Bien sûr, il ya un coût de performance parfois à cause du bandeau que vous mentionnez. Tout est dans l'utilisation. – Glenn

0

Je serai contraire et le bec de la position dynamique de type détesté. Utilisez simplement un objet. Il est un tableau associatif. Les noms des variables et le contexte devraient le rendre assez clair. Ne faites pas votre code plus compliqué que nécessaire. Si vous pensez que cela devrait être une classe, faites-en une classe. C'est une carte simple, utilisez un objet.

Il n'y a pas de raison d'aller trop loin.

+0

Le problème que j'ai est qu'accepter un objet en tant que paramètre ou renvoyer un objet, ne donne aucune idée intuitive quant à wtf se passe. Ma principale préoccupation est la lisibilité et la compréhension. – timoxley

+0

Vous avez le nom de la fonction et le nom de la variable. Obtenir un "ArrayCollection" ne me dit rien sur l'objet non plus. Tu ne sais toujours pas ce qu'il y a dedans. Les programmeurs fonctionnels pencheront d'un côté et les programmeurs OO pencheront d'une autre manière. Ce sont toutes les préférences. – Glenn

Questions connexes