6

我最近发现自己需要(是的,需要)在 C# 代码中定义荒谬的长switch语句和enum声明,但我想知道人们认为将它们分成逻辑小节的最佳方式是什么。在我的情况下,枚举值和案例(基于枚举值)都有相当清晰的分组,但我有点不确定如何在代码中反映这一点。

请注意,在我的代码中,我大约有 5 组,每组介于 10 到 30 个枚举值/案例之间。

我可以设想的三个模糊合理的选择是:

  1. 在声明中围绕所有逻辑案例/枚举值组定义#region块(可选用空行分隔)。
  2. 用它的名字评论每个组,在每个组名评论之前有一个空行。
  3. 什么都不做——只需将开关/枚举作为一个巨大的案例/值列表。

你喜欢哪个?你会分别对待枚举和开关吗?(这对我来说似乎有点奇怪。)现在,我不会说这个问题有任何正确/错误的答案,尽管我仍然很想听听意见的普遍共识是什么。

注意 1:由于我正在尝试编写一个词法分析器(标记器),因此我可能有一个非常长的 50/100+ 值的枚举声明的这种情况是不可避免的(并且与开关类似),因此这似乎是最合理的方法有几个原因。

注 2:我完全意识到,关于是否在通用代码中使用区域(主要用于结构化类)的问题已经存在几个重复的问题,但我觉得我的问题在这里更具体,尚未得到解决。

4

6 回答 6

3

当然,把这些东西区分开来。它们可能没有太大变化,当它们发生变化时,您可以扩展区域、进行更改、折叠它,然后继续处理文件的其余部分。

它们在那里是有原因的,利用它们来发挥你的优势。

于 2009-06-26T19:03:01.173 回答
3

您还可以拥有 Dictionary<[your_enum_type], Action> (或 Func 而不是 Action)或类似的东西(考虑到您的函数具有类似的签名)。然后你可以代替使用开关,而不是:

        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 回答
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 和 Visual Studio 之间切换

Ctrl-MM

你瞧,这个地区关闭了又扩大了!

于 2009-06-26T19:55:56.900 回答