`
lighter
  • 浏览: 499687 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

来改善你的switch语句

阅读更多
善用多态来改善你的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;
		}
	}
}




分享到:
评论
2 楼 wenjixiao 2009-08-04  
我只想知道怎样优雅的去掉switch,现在,switch还在。
现在这种微小的改善没啥意思。
1 楼 CherryRemind 2008-01-08  
修改好像就是封装了下operation, 隐藏了operation的细节

相关推荐

    ADD-LED-NUM.rar_switch延时

    接上个源码 delay()延时函数消耗的时间太长了,其它任务根本没有机会执行,我们该怎么改善?本节教大家利用累计主循环次数的方法... 所有的实战项目都是基于switch语句实现多任务并行处理。 实现功能:让一个LED闪烁。

    重构改善既有代码的设计第2版.pdf

    3. 代码的坏味道:包括神秘命名、重复代码、过长函数、过长参数列表、全局数据、可变数据、发散式变化、霰弹式修改、依恋情结、数据泥团、基本类型偏执、重复的switch、循环语句、冗赘的元素、夸夸其谈通用性、临时...

    天津财经大学耿小庆C语言课件第4章-流程控制.ppt

    switch语句是根据给定的条件进行判断,并根据条件的值来执行不同的语句。 §4-4 循环语句 §4-4 循环语句中,主要讲解了C语言中的循环语句,包括while语句和for语句。while语句是指在给定条件成立的情况下,反复...

    35.join语句怎么优化?1

    总结来说,优化JOIN语句不仅仅是选择正确的JOIN算法,如Index Nested-Loop Join (NLJ) 或 Block Nested-Loop Join (BNL),还包括利用数据库内部的优化机制,如MRR,来改善查询性能。理解并合理运用这些优化技术,...

    选择结构程序设计实验报告整理.pdf

    本实验报告主要讲述了选择结构程序设计的实验报告整理,涵盖了C语言表示逻辑量的方法、逻辑运算符和逻辑表达式、if语句和switch语句的使用、多分支选择语句的实现、简单算法的应用等知识点。 一、选择结构程序设计...

    this-is--games.rar_games

    标题 "this-is--games.rar" 暗示我们关注...开发者通过调整 case 语句的位置,旨在改善游戏的性能、逻辑清晰度或玩家的游戏体验。对于学习游戏开发的人来说,深入理解这种改动对于提升编程技能和了解游戏逻辑至关重要。

    关于硬件工程师的10个C语言技巧

    - 当需要比较多个条件时,优先考虑使用if/else或switch语句,它们能够提供更加清晰的逻辑判断。 - 通过使用汇编语言来提高性能时,务必确保代码的可读性和可维护性,且应当在合适的场景下使用,如引导装载程序或在...

    107个常用Javascript语句

    这个“107个常用Javascript语句”的资源集包含了JavaScript开发中不可或缺的基础和高级语法元素,对于初学者和经验丰富的开发者来说都是一个宝贵的参考资料。以下是根据标题和描述中提到的JavaScript知识点的详细...

    MyBatis动态SQL是一种强大的特性,它允许我们在SQL语句中根据条件动态地添加或删除某些部分,从而实现更加灵活和高效的数据

    - **`&lt;choose&gt;`、`&lt;when&gt;`、`&lt;otherwise&gt;`**:这三个标签组合在一起类似于Java中的`switch`语句,用来处理多个互斥条件的选择。 **示例**: ```xml AND status = 1 AND status = 2 AND status = ...

    重构改善既有代码的设计-Refactoring:Improving the Design of Existing Code

    4. **大switch语句**(Big switch statements):过长的switch语句往往表示代码需要重新组织。 5. **频繁检查null对象**:这通常意味着对象设计存在问题。 6. **数据泥团**(Data clumps):一组经常一起出现的数据...

    易语言源码循环语句的用法之速度比较.7z

    易语言是一种专为中国人设计的编程语言,它以简明的中文语法,降低了编程的门槛。...在进行性能优化时,可以结合使用多种循环结构,或者利用易语言提供的高级特性,如循环体内代码并行执行等,来提高程序运行效率。

    Java语言编码规范

    语句有多种形式,包括简单语句、复合语句、返回语句、if、if-else、if else-if else 语句、for 语句、while 语句、do-while 语句、switch 语句、try-catch 语句等。 8. 空白 空白是 Java 程序的基本组成部分。空行...

    软件开发与项目管理-1期 KC02_模块四_模块案例_C#代码优化实例.doc

    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 ...

    PHP 杂谈《重构-改善既有代码的设计》之一 重新组织你的函数

    处理switch语句时,可以考虑使用多态来替代,以减少代码的复杂度和未来的维护成本。 7. 专业术语的使用 在专业领域,使用英文术语可以帮助开发者更好地与同行交流。文件中提及的术语例如inline(内联)、function...

    重构,改善既有代码 培训课件

    switch语句通常提示着可以利用多态进行改进。冗赘类和夸夸其谈的未来性是过度设计的标志,应当简化或删除。临时字段和信息链则增加了耦合度,应通过重构来减少依赖关系。 总之,重构是一个持续的过程,需要开发者...

Global site tag (gtag.js) - Google Analytics