来改善你的switch语句

本文通过一个具体的代码示例展示了如何使用多态来替代复杂的switch语句,以提高代码的可读性和可维护性。通过对不同数学运算的抽象,实现了一种更加灵活和易于扩展的设计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

善用多态来改善你的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]
基于Spring Boot搭建的一个多功能在线学习系统的实现细节。系统分为管理员和用户两个主要模块。管理员负责视频、文件和文章资料的管理以及系统运营维护;用户则可以进行视频播放、资料下载、参与学习论坛并享受个性化学习服务。文中重点探讨了文件下载的安全性和性能优化(如使用Resource对象避免内存溢出),积分排行榜的高效实现(采用Redis Sorted Set结构),敏感词过滤机制(利用DFA算法构建内存过滤树)以及视频播放的浏览器兼容性解决方案(通过FFmpeg调整MOOV原子位置)。此外,还提到了权限管理方面自定义动态加载器的应用,提高了系统的灵活性和易用性。 适合人群:对Spring Boot有一定了解,希望深入理解其实际应用的技术人员,尤其是从事在线教育平台开发的相关从业者。 使用场景及目标:适用于需要快速搭建稳定高效的在线学习平台的企业或团队。目标在于提供一套完整的解决方案,涵盖从资源管理到用户体验优化等多个方面,帮助开发者好地理解和掌握Spring Boot框架的实际运用技巧。 其他说明:文中不仅提供了具体的代码示例和技术思路,还分享了许多实践经验教训,对于提高项目质量有着重要的指导意义。同时强调了安全性、性能优化等方面的重要性,确保系统能够应对大规模用户的并发访问需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值