AS3:测试可选参数和组合

时间:2011-02-06 01:06:29

标签: actionscript-3 optimization optional-arguments

我正在重新审视一些过滤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 :(得分:0)

我将在这里做一些假设。从您的示例中,我认为您希望基于按键执行任务。无论您是要启用还是禁用某些键,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行有点奇怪。我不知道Flex或常规AS3中的KeyManager,这个自定义代码也是如此?如果是这样,你可以通过类似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。