善用多态来改善你的switch语句
下面举的这一个例子,其实和<<重构>>第一章里面的那一个经典实例很像的,<<重构>>一本书绝对是一本好书,非常不错值得推荐的一本书。
举一个例子,是我现在的一个项目里面一位同事写的一小段代码,代码如下,它可以根据不同的操作符进行加减乘除方面的操作,而且这一些操作很有可能发生一些变化。当重构成我的现在每天的面包和水的时候,我看到switch语句,就想能不能把改良一下。虽然改善后,代码量是增加,但从可维护的角度来讲,我个人认为还是值得的,特别在你需要的操作的Switch语句里面很有可能发生需求变化的时候。
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));
}
}
我看到firstData,secondData就想能不能把它们放到一个Range范围的类里面是不是更好呢,于是新建了一个
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;
}
}
然后我们再新建一系列操作方面的类,为每一个操作类新增一个类,也是这一次重构最核心的东西,其代码如下:
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()));
}
}
}
接下来的工作就很简单啦,把以前两段代码全部删除掉,换上如下的代码,虽然这一个时候也有Switch语句,但它只是纯粹地变成了一个取operation的类而已,并没有包含任何的操作。
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;
}
}
}
分享到:
相关推荐
接上个源码 delay()延时函数消耗的时间太长了,其它任务根本没有机会执行,我们该怎么改善?本节教大家利用累计主循环次数的方法... 所有的实战项目都是基于switch语句实现多任务并行处理。 实现功能:让一个LED闪烁。
3. 代码的坏味道:包括神秘命名、重复代码、过长函数、过长参数列表、全局数据、可变数据、发散式变化、霰弹式修改、依恋情结、数据泥团、基本类型偏执、重复的switch、循环语句、冗赘的元素、夸夸其谈通用性、临时...
switch语句是根据给定的条件进行判断,并根据条件的值来执行不同的语句。 §4-4 循环语句 §4-4 循环语句中,主要讲解了C语言中的循环语句,包括while语句和for语句。while语句是指在给定条件成立的情况下,反复...
总结来说,优化JOIN语句不仅仅是选择正确的JOIN算法,如Index Nested-Loop Join (NLJ) 或 Block Nested-Loop Join (BNL),还包括利用数据库内部的优化机制,如MRR,来改善查询性能。理解并合理运用这些优化技术,...
本实验报告主要讲述了选择结构程序设计的实验报告整理,涵盖了C语言表示逻辑量的方法、逻辑运算符和逻辑表达式、if语句和switch语句的使用、多分支选择语句的实现、简单算法的应用等知识点。 一、选择结构程序设计...
标题 "this-is--games.rar" 暗示我们关注...开发者通过调整 case 语句的位置,旨在改善游戏的性能、逻辑清晰度或玩家的游戏体验。对于学习游戏开发的人来说,深入理解这种改动对于提升编程技能和了解游戏逻辑至关重要。
- 当需要比较多个条件时,优先考虑使用if/else或switch语句,它们能够提供更加清晰的逻辑判断。 - 通过使用汇编语言来提高性能时,务必确保代码的可读性和可维护性,且应当在合适的场景下使用,如引导装载程序或在...
这个“107个常用Javascript语句”的资源集包含了JavaScript开发中不可或缺的基础和高级语法元素,对于初学者和经验丰富的开发者来说都是一个宝贵的参考资料。以下是根据标题和描述中提到的JavaScript知识点的详细...
- **`<choose>`、`<when>`、`<otherwise>`**:这三个标签组合在一起类似于Java中的`switch`语句,用来处理多个互斥条件的选择。 **示例**: ```xml AND status = 1 AND status = 2 AND status = ...
4. **大switch语句**(Big switch statements):过长的switch语句往往表示代码需要重新组织。 5. **频繁检查null对象**:这通常意味着对象设计存在问题。 6. **数据泥团**(Data clumps):一组经常一起出现的数据...
易语言是一种专为中国人设计的编程语言,它以简明的中文语法,降低了编程的门槛。...在进行性能优化时,可以结合使用多种循环结构,或者利用易语言提供的高级特性,如循环体内代码并行执行等,来提高程序运行效率。
语句有多种形式,包括简单语句、复合语句、返回语句、if、if-else、if else-if else 语句、for 语句、while 语句、do-while 语句、switch 语句、try-catch 语句等。 8. 空白 空白是 Java 程序的基本组成部分。空行...
7. **设计模式**:虽然在这个简单的示例中并未直接使用设计模式,但可以联想,例如,使用策略模式可能会让代码更加灵活,允许在运行时动态地选择不同的图表行为,而不仅仅是通过一个固定的switch语句来决定。...
3.10 Switch Statements(switch惊悚现身) 82 3.11 Parallel InheritanceHierarchies(平行继承体系) 83 3.12 Lazy Class(冗赘类) 83 3.13 Speculative Generality(夸夸其谈未来性) 83 3.14 ...
处理switch语句时,可以考虑使用多态来替代,以减少代码的复杂度和未来的维护成本。 7. 专业术语的使用 在专业领域,使用英文术语可以帮助开发者更好地与同行交流。文件中提及的术语例如inline(内联)、function...
switch语句通常提示着可以利用多态进行改进。冗赘类和夸夸其谈的未来性是过度设计的标志,应当简化或删除。临时字段和信息链则增加了耦合度,应通过重构来减少依赖关系。 总之,重构是一个持续的过程,需要开发者...