3

C# で次のロジックをすばやく確認する方法はありますか?

if (a)
{

}
if (b)
{

}
if (c)
{

}
else //none of the above, execute if all above conditions are false
{
  /* do something only if !a && !b && !c  */
}

これはif-elseab、およびcがすべて一度に true になる可能性があるため、そのようにスタックすることはできません。

a、 、b、およびcがすべて false の場合に、 を書き込まずに else ブロックを実行したいif (!a && !b && !c)。これは、if 条件がより複雑になると、コードが非常に煩雑になる可能性があるためです。多くのコードを書き直す必要があります。

これは可能ですか?

4

3 に答える 3

4

まず、いいえelseブロックはすぐif上の句のみを尊重するため、代替が必要になります。

このオプションは特に「クリーン」ではありませんが、次のようにします。

bool noneAreTrue = true;
if(a)
{
    noneAreTrue = false;
}
if(b)
{
    noneAreTrue = false;
}
if(c)
{
    noneAreTrue = false;
}
if(noneAreTrue)
{
    //execute if all above conditions are false
}

また、条件が非常に大きい場合は、Robert C. Martin の著書 Clean Code のルール G28 (Encapsulate Conditionals) をお勧めします。

かなり冗長ですが、場合によっては読みやすくなります。

public void YourMethod()
{
    if(SomeComplexLogic())
    {
    }
    if(SomeMoreLogic())
    {
    }
    if(EvenMoreComplexLogic())
    {
    }
    if(NoComplexLogicApply())
    {
    }
}

private bool SomeComplexLogic(){
    return stuff;
}

private bool EvenMoreComplexLogic(){
    return moreStuff;
}

private bool EvenMoreComplexLogic(){
    return evenMoreStuff;
}

private bool NoComplexLogicApply(){
    return SomeComplexLogic() && EvenMoreComplexLogic() && EvenMoreComplexLogic();
}
于 2013-06-06T02:32:36.340 に答える
1

1 回か 2 回しか呼び出さない複雑な条件をメソッドにカプセル化するのではなく、変数に保持します。これは、他の回答が示唆するように、マーカーブール値を使用するよりも読みやすいです。

わざとらしい例、

bool isBlue = sky.Color == Colors.Blue;
bool containsOxygen = sky.Atoms.Contains("oxygen") && sky.Bonds.Type == Bond.Double;
bool canRain = sky.Abilities.Contains("rain");
if(isBlue)
{
}
if(containsOxygen)
{
}
if(canRain)
{
}
if(!isBlue && !containsOxygen && !canRain)
{
}

これで、そうでなければ複雑な条件である可能性があるものを、読みやすい英語に抽象化しました!

于 2013-06-06T04:03:27.270 に答える