3

長いスイッチステートメントはしばしば眉をひそめます。解決策は、ポリモーフィズムを使用することです。しかし、私がオンにしているものがタイプコードではない場合はどうなりますか?私がやりたいのは、switchステートメントを次のようなものに置き換えることです...

public void HandleString(string s = "Hello")
{
 ...
}

public void HandleString(string s = "Goodbye")
{
 ...
}

...
HandleString("Hello"); // results in the first method being called.

これは次のものを置き換えます...

string s = "Hello";

switch(s)
{
   case "Hello":
   ...
   break;
   case "Goodbye":
   ...
   break;
   default;
   break;
}

何か案は?理論的には、「if / switch」ステートメントを完全に廃止して、式の値に基づいて自動的にバインドされるメソッドを呼び出すことができると思います。

4

2 に答える 2

16

多数のオプションがあり、将来さらに多くのオプションが存在する可能性が高い場合、またはシステムを簡単に拡張できるようにする必要がある場合は、いつでも明示的なディスパッチテーブルを使用できます。

Dictionary<string, Action<string>> actions =
    new Dictionary<string, Action<string>>()
    {
        { "Hello", HandleHello },
        { "Goodbye", HandleGoodbye }
    };

private static void HandleHello(string s) { ... }

private static void HandleGoodbye(string s) { ... }

...

actions[s](s);

APIの外部クライアントが特定の文字列に対して独自のハンドラーを登録できるようにすることで、テーブルを拡張する方法を提供することもできます。

于 2009-11-30T23:38:24.280 に答える
1

その種のセマンティクスを実装する言語があります。私がよく知っているのは、Phillips の「Elegant」というコンパイラ ジェネレータ ツールです。

このような言語では、単純な階乗アルゴリズムは次のようになります。

fact (value : Int) : Int
    conditions value < 0
{
    { "Illegal input value\n" } astype Message
    return 0
}

fact (value = 0) : Int
{
    return 0
}

fact (value = 1) : Int
{
    return 1
}

fact (value : Int) : Int
{
    return value * fact(value - 1);
}
于 2009-11-30T23:43:35.470 に答える