【发布时间】:2011-10-20 06:57:47
【问题描述】:
如果我们应该尝试避免 switch/case 语句以及如何为枚举执行此操作,以及如何建议如何,请考虑以下示例,我正在寻找充分的理由: (请注意,此开关/案例可能分散在整个代码库中)
switch (theEnum)
{
case MyEnum.Enum1:
// dosomething
case MyEnum.Enum2:
// do something
case MyEnum.Enum3:
// do something
default:
throw new Exception("Unsupported enumeration: " + theEnum.ToString());
}
对比
public Dictionary<MyEnum, StrategyBase> BuildMapper()
{
var mapper = new Dictionary<MyEnum, StrategyBase>();
mapper[MyEnum.Enum1] = new Strategy1();
mapper[MyEnum.Enum2] = new Strategy2();
mapper[MyEnum.Enum3] = new Strategy3();
return mapper;
}
BuildMapper()[MyEnum.Enum1].DoSomething();
选项 2 更加面向对象,但我想知道其他人如何看待这种方法,以及是否有充分和令人信服的理由让我们努力这样做。
例如,有人可能会争辩说 switch/else 等原则会违反 open-close。
【问题讨论】:
-
如果您专注于 Cyclometric 复杂性并且方法总是需要可扩展,那么 OO 方法会更好。
-
需要注意的是,交换机的执行速度要快得多。遍历列表也将比使用字典更快,除非您的字典中有大约 10 个或更多项。
标签: c# design-patterns