使用Action词典而不是switch语句

我只是在查看我的一些旧代码(有一些空闲时间),我注意到一个相当冗长的switch语句。 由于获得了新知识,我已经以下面的forms重构了它:

private Dictionary createView { get { return new Dictionary() { {"Standard", CreateStudySummaryView}, {"By Group", CreateStudySummaryByGroupView}, {"By Group/Time", CreateViewGroupByHour} }; } } 

你会考虑这个好习惯吗,还是仅仅是一个超级丰富和不必要的案例? 我渴望确保我学到的新技术,仅仅为了它而不是聪明,并且它们实际上为代码增加了好处。

谢谢。

长切换语句是经典的难闻气味,并且始终是重构的目标。

这里执行的“标准”步骤是使用多态替换条件 。 这是Martin Fowler的书Refactoring (11年前出版于1999年)中列出的步骤之一。

现在,处理像对象这样的函数非常容易(例如使用Action),这可能是一个很好的解决方案。

不,我不认为你是聪明的。 如果我想在将来添加另一个选项,我可以很容易地看到需要做什么。

根据您的应用程序,您可以避免始终构造新的字典对象,但将其声明为类成员,在第一次访问时初始化并始终返回相同的实例。 但很难说,它是否真的符合您的需求。 我的意思是这样的

 public class MyClass { Dictionary dict = null; private Dictionary createView { get { if(dict == null) { dict = new Dictionary() { {"Standard", CreateStudySummaryView}, {"By Group", CreateStudySummaryByGroupView}, {"By Group/Time", CreateViewGroupByHour} }; } return dict; } } } 

编辑

概念的角度来看,我用字典TryGetValue替换long swicth/case是一个非常好的解决方案。

希望这可以帮助…

这种方法非常好。

我使用它不仅仅是Action 。 它对filter和选择器也非常有效。 就像是:

 var filters = new Dictionary>() { // ... }; var query = entities.Where(filters["X"]); 

如果代码一旦写入,在很大程度上是静态的,不会有太大的变化,那么我就会遇到一个switch 。 至少在表面上,你的字典方法很适合于更具动态性 – 这是基于更多的要求。

至于使用这种方法用代码替换各地的交换机,我个人不会在大多数情况下这样做。 我的诚实意见是,为了它而只是聪明,但它仍然很容易维护。 正如我所看到的,个人对最佳实践的品味是最重要的因素。

另一方面,正如其他人所说,这可能是长切换语句的可行解决方案。 然后,像战略模式这样的东西也将是支持行为变化的好方法。