来改善你的switch语句

善用多态来改善你的switch语句

下面举的这一个例子,其实和<<重构>>第一章里面的那一个经典实例很像的,<<重构>>一本书绝对是一本好书,非常不错值得推荐的一本书。

举一个例子,是我现在的一个项目里面一位同事写的一小段代码,代码如下,它可以根据不同的操作符进行加减乘除方面的操作,而且这一些操作很有可能发生一些变化。当重构成我的现在每天的面包和水的时候,我看到switch语句,就想能不能把改良一下。虽然改善后,代码量是增加,但从可维护的角度来讲,我个人认为还是值得的,特别在你需要的操作的Switch语句里面很有可能发生需求变化的时候。

[code]private void cacuData(DataRange dataRange, char oper) {
double firstData = Double.parseDouble(dataRange.getFirstData());
double secondData = Double.parseDouble(dataRange.getSecondData());
switch (oper) {
case '+':
dataStack.push("" + (firstData + secondData));
break;
case '-':
dataStack.push("" + (firstData - secondData));
break;
case '*':
dataStack.push("" + (firstData * secondData));
break;
case '/':
divisionProcess(firstData, secondData);
break;
}
}

/** 处理除数方法; */
private void divisionProcess(double firstData, double secondData) {
if (Math.abs(secondData) < Math.pow(10, -5)) {
dataStack.push("-1");
} else {
dataStack.push("" + (firstData / secondData));
}
}[/code]

我看到firstData,secondData就想能不能把它们放到一个Range范围的类里面是不是更好呢,于是新建了一个
[code] public class DoubleDataRange{
private final double firstData;

private final double secondData;

public DoubleDataRange(double firstData, double secondData) {
this.firstData = firstData;
this.secondData = secondData;
}

public double getFirstData() {
return firstData;
}

public double getSecondData() {
return secondData;
}
}[/code]

然后我们再新建一系列操作方面的类,为每一个操作类新增一个类,也是这一次重构最核心的东西,其代码如下:
[code]abstract class Operation{
abstract void cacuData(DoubleDataRange dataRange,SSheetStack dataStack);
}

class PlusOperation extends Operation {
void cacuData(DoubleDataRange range, SSheetStack dataStack) {
dataStack.push("" + (range.getFirstData() + range.getSecondData()));
}
}

class SubtractOperation extends Operation {
void cacuData(DoubleDataRange range, SSheetStack dataStack) {
dataStack.push("" + (range.getFirstData() - range.getSecondData()));
}
}

class MultiplyOperation extends Operation {
void cacuData(DoubleDataRange range, SSheetStack dataStack) {
dataStack.push("" + (range.getFirstData() * range.getSecondData()));
}
}

class DivisionOperation extends Operation {
void cacuData(DoubleDataRange range, SSheetStack dataStack) {
if (Math.abs(range.getSecondData()) < Math.pow(10, -5)) {
dataStack.push("-1");
} else {
dataStack.push("" + (range.getFirstData() / range.getSecondData()));
}
}
}[/code]

接下来的工作就很简单啦,把以前两段代码全部删除掉,换上如下的代码,虽然这一个时候也有Switch语句,但它只是纯粹地变成了一个取operation的类而已,并没有包含任何的操作。
[code]private void cacuData(DataRange dataRange, char oper) {
setOperation(oper);
double firstData = Double.parseDouble(dataRange.getFirstData());
double secondData = Double.parseDouble(dataRange.getSecondData());
operation.cacuData(new DoubleDataRange(firstData,secondData), dataStack);
}

private Operation operation;

private void setOperation(char oper){
switch (oper) {
case '+':
operation = new PlusOperation();
break;
case '-':
operation = new SubtractOperation();
break;
case '*':
operation = new MultiplyOperation();
break;
case '/':
operation = new DivisionOperation();
break;
}
}
}
[/code]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值