代码重构--switch的惊恐现身

Posted 蒙恩少年

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了代码重构--switch的惊恐现身相关的知识,希望对你有一定的参考价值。

switch作为条件判断(分支结构)中的一种方式,以至于我们对于它使用的频率处于较高水平的水平线上,为此我们应该使用Extra method来对这类判断条件进行抽取,另外从我自身而言,我发现我以前常常在当中根据不同的值,做不同的操作,而这类操作我是直接写在case里面的!而这里《重构》的作者并没有明确的讲明这样做的好处到底在哪里?我们现在就拿我们前一篇文章来作接下来的讲解。

没有看过前一篇文章的,点击这里带你看哦

现在我们模拟一个场景,作为项目经理的老王,告诉程序员小新说:现在我们的影片类型需要在增加一个叫做VIP,而这个类型租赁价格的计算当然也是不同,那么这个getCharge的分支中就不得不做接下来一步的修改,就是将switch中的条件在多加一条,如下

 1 public double getCharge() {
 2         double result = 0;
 3         switch(getMovie().getPriceCode()) {
 4         case Movie.REGULAR:
 5             result += 2;
 6             if (getDaysRented() > 2)
 7                 result += (getDaysRented() - 2)*1.5;
 8             break;
 9         case Movie.NEW_RELEASE:
10             result += getDaysRented() * 3;
11             break;
12         case Movie.CHILDRENS:
13             result += 15;
14             if (getDaysRented() > 3)
15                 result += (getDaysRented() - 3) * 1.5;
16             break;
17         case Movie.VIP: 
18             result += getDaysRented() * 3 + 10;
19             break;
20         }
21         return result;
22     }
View Code

不知道大家有没有发现什么问题呢?是这样子的哈!小新在编写他的VIP类型的价格换算逻辑的时候,他可能无意间动到了儿童类型的价格换算业务,那么当我们如果做的并非是如此简单的项目的时候,我们应当意识到,每个不同类型的逻辑处理代码在一个分支中不应该体现出来,也就是说,分支这里只是为了决定选择谁作为代表来运行某种运算,但是这个代表是如何进行运算的,它内部的实现是如何进行的我们其实是不需要去知道的,所以我们这里应该使用多态的方式,将每个不同的逻辑封装到对应的类中,并由接口开放出来一个开关,以控制在筛选完成之后对于事件的驱动!

以上是关于代码重构--switch的惊恐现身的主要内容,如果未能解决你的问题,请参考以下文章

策略模式重构switch/case分支代码

如何重构这个 Java 代码片段

第1章 重构,第一个案例:运用多态取代switch

Java重构-策略模式状态模式卫语句

Android 代码重构案例

Android 代码重构案例