重构标准格式
• 名称 (name) 。建造一个重构词汇表,名称是很重要的。• 简短概要 (summary) 。简单介绍此一重构手法的适用情景以及它所做的事情。这部分可以帮助你更快找到你所需要的重构手法。• 动机 (motivation) 介绍“为什么需要这个重构”和“什么情况下不该使用这个重构”• 做法 (mechanics) 简明扼要地一步一步介绍如何进行此一重构• 范例 (examples) 以一个十分简单的例子说明此重构手法如何运作
在什么时候可以对代码进行重构
• 1. 重复代码•• 最简单的就是具有重复的表达式• 两个兄弟子类具有相同的表达式• 这时候就需要将子类之间相同的部分分割出来,然后形成一个独立的函数供调用•• 两个或多个不相关的类• 不相干的类出现相同代码• 在一个类中分出来做成函数,然后供其他类调用,在这个时候就需要调整函数的位置
• 2.switch case• Switch 在很多情况下的确很方便,但是在使用 switch case 的时候不免会出现大量的语句重复,如果要添加新的 case 语句的话,就需要找到所有的 switch 语句对其进行修改,就违反了开闭原则( OCP )• OCP : 一个软件实体,如类,模块和函数应该对扩展开放,对修改关闭• 所以我们可以用多态来处理 switch 语句• 1. 抽象每个 Switch 类型码 ,做成一个抽象类,抽象方法为 case 的执行的函数• 2. 每个 case ,作为一个子类,实现抽象类,并实现其抽象方法,方法就内容就是 case 的内容• 3. 使用使用子类来代替类型码,执行 case 的语句
• 3. 过长的函数• 一个过长的函数经常会让人难以理解这是干什么的,需要不断的去转换上下文去看子程序干了什么。• 所以我们应该积极的分解函数。• 1 )见名知意:只要函数名可以解释其用途,就可以修改他的名字• 2 )注释: 注释可以指出代码的用途和实现手法,在此情况下可以将其转换 为函数,并且在注释的基础上我们还可以给函数命名。• 3 )循环: 通常情况下条件表达式和循环都是可以提炼函数的信号。
提炼函数
• // 修改前• void printOwing ( double amount){
printBanner () ;
//print details
System.out.println ( "name:" + _name) ;
System.out.println ( "amount:" + _amount) ;
}
//修改后
void printOwing(double amount){
printBanner();
printDetailes(amount);
}
void printDetailes(double amount){
System.out.println("name:" + _name);
System.out.println("amount:" + _amount);
}