0

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 ステートメントの順序が間違っていました。それを変更しました。

これは一般化できます。わかりやすくするためにコードを含めています。一般的な質問がまだ不明確な場合は、次のような印象を受けます。

オプションの引数のみのすべての組み合わせをテストする最もクリーンで効率的な方法は何ですか?

4

1 に答える 1

0

ここでいくつかの仮定を立てます。あなたの例から、キーの押下に基づいてタスクを実行したいと思います。XML には、特定のキーを有効にするか無効にするかに関係なく、何らかの設定が含まれているようです。シフトとコントロールの 2 つの決定済みキーと、キー コードに基づくワイルドカード キーが 1 つあります。これらの仮定が正しければ、好みのテストと実際のキーのテストを 1 行にまとめることで、物事を短縮できるはずです。

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 が正確に何をするのかわかりません。この後も 3 つの変数があり、それらはすべてオプションです。それらすべてを排他的にする必要がある場合、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
}

ただし、キーに基づいて行っていることが排他的でない場合は、3 つのキーに基づいたタスクの実行に戻ることができます。

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

これは役に立ちますか?乾杯、EP。

于 2011-02-06T11:10:12.303 に答える