AS3: тестирование дополнительных аргументов и комбинаций - PullRequest
0 голосов
/ 06 февраля 2011

Я возвращаюсь к некоторому старому коду, который фильтрует XML, но это может легко применяться к параметрам метода (то, как я его использую, по сути, так и есть).Я чувствую, что это проблема, с которой я сталкиваюсь, и не знаю, как с этим справиться.

Итак, проблема в том, что у меня есть 3 аргумента.Они все по желанию.Я хочу увидеть, какие из них присутствуют, и проверить, соответствуют ли их значения на основе того, какие из них присутствуют (отсортированы по вероятности):

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

if ( "@shift" in x )
{
    shiftDown = Global.stringToBoolean( x.@shift.toString() );
}
if ( "@control" in x )
{
    controlDown = Global.stringToBoolean( x.@control.toString() );
}


if ( "@code" in x && "@shift" in x && "@control" in x )
{
    if ( KeyManager.keyIsDown( KeyManager[ x.@code.toXMLString().toUpperCase() ] ) && ( KeyManager.shiftKey == shiftDown ) && ( KeyManager.controlKey == controlDown ) )
    {
        ...
    }
}
else if ( "@code" in x && "@shift" in x )
{
    if ( KeyManager.keyIsDown( KeyManager[ x.@code.toXMLString().toUpperCase() ] ) && ( KeyManager.shiftKey == shiftDown ) )
    {
        ...
    }       
}
else if ( "@code" in x && "@control" in x )
{
    if ( KeyManager.keyIsDown( KeyManager[ x.@code.toXMLString().toUpperCase() ] ) && ( KeyManager.controlKey == controlDown ) )
    {
        ...
    }       
}       
else if ( "@code" in x )
{
    if ( KeyManager.keyIsDown( KeyManager[ x.@code.toString().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 ) )
    {
        ...
    }
}

Мне кажется, что должен быть более короткий способ написать это такмного повторений в его нынешнем виде.Может кто-нибудь предложить более чистый и эффективный способ написать это?

Спасибо за ваши мысли.

РЕДАКТИРОВАТЬ: Порядок утверждения if был неправильным.Изменено это.

Это можно обобщить.Я просто включил свой код для ясности.Если общий вопрос все еще неясен, у меня складывается впечатление, что это:

Какой самый чистый / самый эффективный способ проверить все комбинации исключительно необязательных аргументов?

1 Ответ

0 голосов
/ 06 февраля 2011

Я собираюсь сделать несколько предположений здесь. Из вашего примера, я так понимаю, вы хотите выполнять задачи на основе нажатий клавиш. XML, кажется, содержит какие-то предпочтения, хотите ли вы включить или отключить определенные ключи. У вас есть два определенных ключа, shift и control, и один подстановочный ключ, основанный на коде ключа. Если эти предположения верны, вы сможете сократить время, комбинируя тест предпочтений и фактический ключевой тест в одной строке.

var shiftIsDown:Boolean = x.@shift.length() ? KeyManager.keyIsDown( KeyManager [ x.@shift.toString().toUpperCase() ] ) : false;
var controlIsDown:Boolean = x.@control.length() ? KeyManager.keyIsDown( KeyManager [ x.@control.toString().toUpperCase() ] ) : false;
var customIsDown:Boolean =  x.@code.length() ? KeyManager.keyIsDown( KeyManager [ x.@code.toString().toUpperCase() ] ) : false;

Я думаю, что строки KeyManager немного странные. Я не знаю о KeyManager ни в Flex, ни в обычном AS3, так что это за пользовательский код? Если это так, вы можете поместить туда код ключа верхнего регистра, сопоставив его с помощью метода customKeyIsDown(), вместо того, чтобы делать все это здесь. В любом случае Shift и Control исправлены, поэтому нет необходимости в обратном сопоставлении значения XML, верно?

var shiftIsDown:Boolean = x.@shift.length() ? KeyManager.keyIsDown( KeyManager.SHIFT ) : false;
var controlIsDown:Boolean = x.@control.length() ? KeyManager.keyIsDown( KeyManager.CONTROL ) : false;
var customIsDown:Boolean =  x.@code.length() ? KeyManager.customKeyIsDown( x.@code ) : false;

Я думаю, что это уже немного яснее, но опять же, я не знаю, что именно делает KeyManager. После этого у вас все еще есть три переменные, и все они необязательны. Если все они должны быть эксклюзивными, у вас будет 8 возможных результатов.

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
}

Если то, что вы делаете на основе ключей, не является эксклюзивным, вы можете вернуться к выполнению трех задач на основе ключей

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

Это помогает? Ура, EP.

...