6

私は最近、C#コードで途方もなく長いswitchステートメントとenum宣言を定義する必要があることに気づきました(はい、必要です)が、論理的なサブセクションにそれらを分割するための最良の方法は人々がどのように感じているのか疑問に思います。私の状況では、列挙値とケース(列挙値に基づく)の両方にかなり明確なグループ化がありますが、これをコードに反映する方法が少しわかりません。

私のコードでは、それぞれ10から30の列挙値/ケースのおよそ5つのグループがあることに注意してください。

私が想像できる3つの漠然とした賢明なオプションは次のとおりです。

  1. 宣言内のケース/列挙値のすべての論理グループの周りにブロックを定義#regionします(オプションで空白行で区切ります)。
  2. 各グループに名前を付けてコメントします。各グループ名のコメントの前に空白行を付けます。
  3. 何もしません-スイッチ/列挙型をケース/値の巨大なリストとして残すだけです。

どっちがいい?列挙型とスイッチを別々に扱いますか?(これは私には少し奇妙に思えます。)今、私はこの質問に対する正しい/間違った答えがあるとは言いませんが、それでも私は意見の一般的なコンセンサスが何であるかを聞くことに非常に興味があります。

注1: 50/100以上の値の非常に長い列挙型宣言が発生する可能性があるこの状況は、残念ながら(スイッチでも同様に)避けられません。これは、レクサー(トークン)を作成しようとしているためです。いくつかの理由で最も合理的なアプローチ。

注2:一般的なコード(主にクラスの構造化)でリージョンを使用するかどうかについては、すでにいくつかの重複する質問が存在することを十分に認識していますが、ここでの質問ははるかに具体的であり、まだ対処されていないと思います。

4

6 に答える 6

3

また、Dictionary <[your_enum_type]、Action>(またはActionの代わりにFunc)などを使用することもできます(関数のシグネチャが類似していることを考慮して)。次に、スイッチを使用する代わりに、次の代わりに使用できます。

        switch (item)
        {
            case Enum1: func1(par1, par2)
                break;
            case Enum2: func2(par1, par2)
                break;
        }

あなたは次のようなものを持つことができます:

public class MyClass
{
    Dictionary<int, Action<int, int>> myDictionary;
    //These could have only static methods also
    Group1Object myObject1;
    Group2Object myObject2;

    public MyClass()
    {
        //Again, you wouldn't have to initialize if the functions in them were static
        myObject1 = new Group1Object();
        myObject2 = new Group2Object();
        BuildMyDictionary();
    }

    private Dictionary<int, Action<int, int>> BuildMyDictionary()
    {
        InsertGroup1Functions();
        InsertGroup2Functions();
        //...
    }

    private void InsertGroup2Functions()
    {
        myDictionary.Add(1, group2.AnAction2);
        myDictionary.Add(2, group2.AnotherAction2);
    }

    private void InsertGroup1Functions()
    {
        myDictionary.Add(3, group1.AnAction1);
        myDictionary.Add(4, group1.AnotherAction1);
    }


    public void DoStuff()
    {
        int t = 3; //Get it from wherever
        //instead of switch
        myDictionary[t](arg1, arg2);
    }
}
于 2009-06-26T19:09:08.367 に答える
3

確かに、それらのものを地域化します。それらはおそらくあまり変更されません。変更された場合は、領域を展開し、変更を加え、折りたたんで、ファイルの残りの部分に移動できます。

それらは理由のためにあります、あなたの利益のためにそれらを使用してください。

于 2009-06-26T19:03:01.173 に答える
1

ケース/値の膨大なリストとして残しておきます。

于 2009-06-26T18:56:17.583 に答える
1

ストラテジーデザインパターンを使用して、同じコードブロックを持つケースがいくつかある場合は、スイッチブロックを削除できます。これにより、多くのクラスが作成される可能性がありますが、実際の複雑さを示し、ロジックをより小さなクラスに分割します。

于 2009-06-26T19:00:20.913 に答える
0

列挙型を取り除き、オブジェクトにします。次に、オブジェクトのメソッドを呼び出して、悪夢ではなく、コードを分離して保守しやすくすることができます。

オブジェクトの代わりに列挙型を実際に使用する必要があり、長いswitchステートメントを好む人がいない場合はほとんどありません。

于 2009-06-26T18:56:31.623 に答える
0

これは、リージョンを使用する人々にとって良い近道です。

VSでを押して全画面表示にしようとしたときに、EclipseとVisualStudioを切り替えていました

Ctrl-MM

そして見よ、この地域は閉鎖され拡大した!

于 2009-06-26T19:55:56.900 に答える