你会用区域内的长期开关/枚举的声明?
-
20-08-2019 - |
题
我最近发现自己需要(是的,需要)来定义的荒谬长 switch
发言和发表的 enum
声明,在C#码,但是我想知道什么样的人觉得是最好的方式来分割他们的成逻辑小节。在我的情况,这两枚举,值和案例(这是基于枚举,值)有相当明确的集团,但我稍不确定如何反映这个代码。
请注意,在我的代码,我已经大约5群体之间10和30枚举,值/情况下的每一个。
三个含糊的明智选择,我们可以设想是:
- 定义
#region
街区周围所有的逻辑群体的情况下/枚举,值内的宣言》(可分隔的空白线)。 - 评论,每个小组有它的名字,有一个空行之前,各组名称的评论。
- 什么都不做任何-只是离开开关/枚举,作为一个巨大的案件清单/数值。
你更喜欢哪?你会享枚举和交换机,分别? (这似乎有点奇怪我。) 现在,我不说,没有任何权利/错误的对这个问题的答案,但我仍是很感兴趣听到什么大consenus的意见。
注1: 这种情况在那里我可能有一个非常长的枚举宣言的50/100+值是不幸的是不可避免的(和同样的关),因为我尝试写一语法分析程序(tokeniser),这会因此似乎最合理的方法有几个原因。
注2: 我充分意识到,几个重复问题上已存在的问题是否使用的地区,在一般的代码(针对结构化的课程,主要的),但是我觉得我的问题是更具体的尚未解决。
解决方案
当然,区域那些事情了。他们可能没有太大变化,而当他们这样做,你可以扩大该区域,进行更改,崩溃它,和转移到其余文件。
他们是有原因,将它们用你的优势。
其他提示
你可以还有一个字典<[your_enum_type],行动>(或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);
}
}
我会把它作为一个巨大的案件清单/数值。
如果在某些情况下,具有同样的代码块,使用该战略设计的模式,可以删除关块。这可能创造很多类给你,但是会显示如何复杂的它真正地是,分裂的逻辑中的小类。
摆脱枚举,使他们成为对象。你能再呼叫的方法在您的目的和保留的代码分离,容易维护,而不是一个噩梦。
有极少数情况下,当你实际上将需要使用一枚举,而不是对象,没有人喜欢长关的发言。
这里有一个很好的捷径的人使用区域。
我之间的切换蚀和Visual Studio当我试图去全屏幕在按VS
Ctrl-M-M
你瞧,该地区封闭和扩大!