2011-02-06 1 views
0

Je suis en train de revoir un ancien code qui filtre le XML, mais cela pourrait facilement s'appliquer aux paramètres d'une méthode (comme je l'utilise, c'est essentiellement le cas). C'est un problème que j'ai l'impression de rencontrer et de ne pas connaître un bon moyen de contourner cela.AS3: Test d'arguments et de combinaisons optionnels

Donc, le problème est que j'ai 3 arguments. Ils sont tous facultatifs. Je veux voir ceux qui sont présents et tester si leurs valeurs basées sur celles qui sont présentes (triées en fonction de la probabilité):

var shiftDown : Boolean = false; 
var controlDown : Boolean = false; 

if ("@shift" in x) 
{ 
    shiftDown = Global.stringToBoolean([email protected]()); 
} 
if ("@control" in x) 
{ 
    controlDown = Global.stringToBoolean([email protected]()); 
} 


if ("@code" in x && "@shift" in x && "@control" in x) 
{ 
    if (KeyManager.keyIsDown(KeyManager[ [email protected]().toUpperCase() ]) && (KeyManager.shiftKey == shiftDown) && (KeyManager.controlKey == controlDown)) 
    { 
     ... 
    } 
} 
else if ("@code" in x && "@shift" in x) 
{ 
    if (KeyManager.keyIsDown(KeyManager[ [email protected]().toUpperCase() ]) && (KeyManager.shiftKey == shiftDown)) 
    { 
     ... 
    }  
} 
else if ("@code" in x && "@control" in x) 
{ 
    if (KeyManager.keyIsDown(KeyManager[ [email protected]().toUpperCase() ]) && (KeyManager.controlKey == controlDown)) 
    { 
     ... 
    }  
}  
else if ("@code" in x) 
{ 
    if (KeyManager.keyIsDown(KeyManager[ [email protected]().toUpperCase() ])) 
    { 
     ... 
    } 
} 
else if ("@shift" in x) 
{ 
    if (KeyManager.shiftKey == shiftDown) 
    { 
     ... 
    } 
} 
else if ("@control" in x) 
{ 
    if (KeyManager.controlKey == controlDown) 
    { 
     ... 
    } 
} 

else if ("@control" in x) && ("@shift" in x)) 
{ 
    if ((KeyManager.shiftKey == shiftDown) && (KeyManager.controlKey == controlDown)) 
    { 
     ... 
    } 
} 

Je me sens comme il doit y avoir un moyen plus court pour écrire ce avec tant de répétition dans sa forme actuelle. Quelqu'un peut-il suggérer une façon plus propre et plus efficace d'écrire cela?

Merci pour votre avis.

EDIT: L'ordre d'instruction if était erroné. Changé ça.

Ceci peut être généralisé. J'inclus juste mon code pour plus de clarté. Si la question générale n'est toujours pas claire, j'ai l'impression que c'est:

Quelle est la manière la plus propre/la plus efficace de tester toutes les combinaisons d'arguments exclusivement optionnels?

+0

Peut shiftDown, controlDown variabled être vrai même s'il n'y a pas de shiftDown, controlDown dans le xml? – Patrick

+0

Etes-vous sûr de l'ordre de vos Ifs, car si @code est défini, vous n'atteindrez jamais tous les autres ... – Patrick

+0

shiftDown controlDown ne peut pas être vrai s'il n'est pas dans le XML. Ils par défaut à faux (que j'aurais dû inclure). Re: Commande. Oui, j'ai réalisé ça la nuit dernière en allant dormir! L'ordre avait besoin d'être révisé. – grey

Répondre

0

Je vais faire quelques suppositions ici. De votre exemple, je suppose que vous voulez effectuer des tâches basées sur des pressions sur les touches. Le code XML semble contenir certaines préférences, que vous souhaitiez activer ou désactiver certaines clés. Vous avez deux clés déterminées, shift et contrôle, et une clé générique basée sur le code clé. Si ces hypothèses sont correctes, vous devriez être en mesure de raccourcir les choses en combinant le test de préférence et le test de clé réel sur une ligne.

var shiftIsDown:Boolean = [email protected]() ? KeyManager.keyIsDown(KeyManager [ [email protected]().toUpperCase() ]) : false; 
var controlIsDown:Boolean = [email protected]() ? KeyManager.keyIsDown(KeyManager [ [email protected]().toUpperCase() ]) : false; 
var customIsDown:Boolean = [email protected]() ? KeyManager.keyIsDown(KeyManager [ [email protected]().toUpperCase() ]) : false; 

Je pense que les lignes de KeyManager sont un peu étranges. Je ne suis pas au courant d'un KeyManager en Flex ou AS3 régulière, donc est ce code personnalisé? Si c'est le cas, vous pouvez mettre le code de la clé majuscule correspondant à l'aide de quelque chose comme une méthode customKeyIsDown(), au lieu de faire tout cela ici. Shift et Control sont fixes de toute façon, donc pas besoin d'inverser la valeur du XML, n'est-ce pas? Je pense que cela est déjà un peu plus clair, mais encore une fois, je ne sais pas ce que fait exactement le KeyManager. Après cela, vous avez toujours trois variables, et elles sont toutes facultatives. Si tous doivent être exclusifs, cela vous laisse avec 8 résultats possibles.

if (shiftIsDown && controlIsDown && customIsDown) { 
    // 1 
} else if (shiftIsDown && controlIsDown) { 
    // 2  
} else if (shiftIsDown && customIsDown) { 
    // 3  
} else if (shiftIsDown) { 
    // 4  
} else if (controlIsDown && customIsDown) { 
    // 5  
} else if (controlIsDown) { 
    // 6  
} else if (customIsDown) { 
    // 7 
} else { 
    // 8 
} 

Si ce que vous faites sur la base des clés n'est pas exclusive mais, vous pouvez revenir à tout remplir les trois tâches à base de clés

if (shiftIsDown) { 
    // 1 
} 
if (controlIsDown) { 
    // 2 
} 
if (customIsDown) { 
    // 3 
} 

Est-ce que cette aide? Cheers, EP.

+0

J'ai fait quelque chose comme ça, merci pour la suggestion! – grey