11

この関数を考えてみましょう。これは真理値表と考えることができます。

public Foo doSomething(bool a, bool b) {

       if ( a &&  b) return doAB();
  else if ( a && !b) return doA();
  else if (!a &&  b) return doB();
  else if (!a && !b) return doNotANotB();

  else throw new Exception("Well done, you defeated boolean logic!");
}

elseコンパイラはその最後の節を主張します。しかし、真理値表の観点からは、それは不可能な状態です。

はい、それは機能します、そしてはい、私はそれと一緒に暮らすことができます。しかし、この種のコードを回避するためのメカニズムがc#にあるのか、それとも明らかな何かを見逃しているのか疑問に思っています。

更新:
ボーナスポイントについて、そして純粋に好奇心から、この種のことを異なる方法で扱う言語はありますか?多分それは言語の問題ではなく、むしろスマートコンパイラの1つです(しかし、エッジケースは想像を絶するほど複雑になると思います)。

4

4 に答える 4

18

真理値表を考慮すると、最後の条件は完全に過剰です。次のように、プログラムのロジックを変更せずにドロップできます。

public MyType doSomething(bool a, bool b) {

      if ( a &&  b) return doAB();
else  if ( a && !b) return doA();
else  if (!a &&  b) return doB();
else/*if (!a && !b)*/ return doNotANotB();
}

これで最終的なキャッチオールができif、コンパイラは満足しています。条件を完全に削除する必要はありません。読みやすくするために、コメントに入れておくことをお勧めします。

于 2012-11-11T12:16:07.933 に答える
7
if(a) return b ? doAB() : doA();
else return b ? doB() : doNotAnotB();

またはそれより短い:

return a ? (b ? doAB() : doA())
         : (b ? doB() : doNotAnotB());
于 2012-11-11T15:32:09.080 に答える
6

f#を試してください。matchディレクティブとの完全な条件一致を検出できる場合は、elseは必要ありません。

http://ganesansenthilvel.blogspot.co.at/2011/12/f-pattern-matching.html?m=1#

> let testAND x y =
match x, y with
| true, true -> true
| true, false -> false
| false, true -> false
| false, false -> true

> testAND true false;;
val it: bool = true

不完全な仕様の場合

> let testAND x y =
match x, y with
| true, true -> true
// Commented | true, false -> false 
| false, true -> false
| false, false -> true
> testAND true false;;

コンパイラは言う

Microsoft.Fsharp.Core.MatchFailureExcption: The match cases were incomplete at:....
Stopped due to error
于 2012-11-11T13:08:54.833 に答える
2
 public MyType doSomething(bool a, bool b)
        {
            switch(a)
            {
                case true:
                    if (b) return doAB();
                    return doA();
                default:
                    if (b) return doB();
                    return doNotANotB();

            }

        }

アップデート:

元のステートメントは実際には次のとおりであることに注意してください。

  public MyType doSomething(bool a, bool b)
        {
            if (a && b) return doAB();
            if (a) return doA();
            if (b) return doB();
            return doNotANotB();
        }

楽しさと簡潔さのために(読みやすさでない場合:p):

static MyType doSomething(bool a, bool b)
        {
            return a && b ? doAB() : a ? doA() : b ? doB() : doNotANotB();
        }
于 2012-11-11T12:37:17.417 に答える