重构:对软件内部结构的一种调整,目的是在不改变软件之可察行为前提下,提高其理解性,降低其修改成本。
组织方法:
1抽取方法
创建一个新方法,命名以它做什么来命名,而不是怎么做来命名。Example1示例
2方法内联
如果只是简单的委托,可以将方法内联。
注意点:
被子类继承的方法不能内联。Example2示例
3临时变量内联
如果一个临时变量只被简单的表达式赋值一次,就可以将它内联。
如何判定只被赋值一次?将这个临时变量申明为final。
如果是被赋值为一个方法的返回值。一般情况不用内联,除非妨碍了其他重构方法。
4查询取代临时变量
临时变量保存一个表达式的运算结果,可以抽取成一个独立方法(称之为查询),来代替临时变量。Example4示例
5引入解释性变量。
如果有一个复杂的表达式,可以将该表达式中复杂的部分用一个临时变量来显示。
6分解临时变量
如果某个临时变量被赋值超过一次,而且它不是循环变量也不是表示一个整个方法都要使用的值。可以将它分解成好几个临时变量。Example6示例
7去除对参数的赋值
JAVA中只采用值传递方式,因此对参数赋值会造成困惑。JAVA的方法参数表明被传递进来的东西,可以让代码清晰。Example7示例
8方法对象取代方法
如果某个对象的一个方法很长,拥有很多局部变量。可以新建一个对象,将这个长方法放入新对象,将方法的所有局部变量变成新对象的类变量。并且在这个类中将这个长方法分解成很多小而短的方法。
移动对象特性
10移动方法
如果一个类中一个方法和另外一个类的调用,被调用更频繁,那么把这个方法放入另外那个类中。Example1示例
如果一个类中一个类变量和另外一个类的调用,被调用更频繁,那么把这个类变量放入另外那个类中。Example2示例
12抽取类
一个类做了两个类的工作。新建一个类,将原来类中某些类变量和方法移植到新类来。Example3示例
13内联类
加入一个类中特性太少,可以将它和另外一个类合并。Example4示例
重组织数据
22对象取代数组
如果一个数组中包含不同东西,则转化为对象。Example1示例
26替换魔法数
用一个常量替代有特别含义的数字或者字符串变量。Example2示例
27封装类变量
类变量最好不要设为public类型,设置为private,然后设置setter,getter方法为public
Example3示例
28封装集合类型
集合类型的getter方法不要返回集合对象,这样可以修改集合对象内容而创建者一无所知。所以确认getter方法返回的是不可更改的集合对象(只读),再增加对集合对象添加,删除元素的方法。Example4
简化表达式
34分解表达式
如果有一个复杂的if,else语句,可以将各个条件执行的代码抽取成独立的方法。
Example1示例
35合并表达式
如果有一些if语句返回结果相同,则可以用||和&&将这些if合并成一个if语句。Example2示例
36合并重复条件
如果if和else语句中有相同重复的代码,请将这些代码移出if,else语句。
Example3示例
37去除控制标记
if,else语句中如果某个变量有控制标记,用break或者return替代这个变量
Example4示例
38用检测语句代替嵌套条件
如果If,else语句太多,则代码复杂度会很高,使用检测语句来替代,检测语句要么返回一个实际的值,要么就抛出异常。Example5示例
39用多态代替条件表达式。
Switch case表达式可以使用多态来替代。
将包含switch case语句的方法转变成抽象方法,对于每个case,建立子类方法来实现。Example6示例
简化方法调用
42方法重命名
如果一个方法名字不能清晰表单含义,可以改成另外一个名字。Example1示例
43添加方法参数
往一个方法里添加参数。
必需注意的是,在添加之前想清楚是否真的是需要这个参数。Example2示例
44去除方法参数
把方法里不必要的参数去除掉。Example3示例
45将查询和修改分开
根据单一职责原则,一个方法只能做一件事情,因此方法里既有返回查询数据又有对数据的修改时候,我们要将这个方法分成两个方法。Example4示例
46参数化方法
如果两个方法或者两段代码只有部分代码不同,大部分代码都相同。那么可以将这两个方法或代码统一成一个方法,将不同部分作为统一方法的参数。Example5示例
47用明确方法代替参数
如果某个方法中某个参数的每一个可能值都会有相应的操作。则应该针对每一种操作创建独立的方法来实现。Example6示例
48保持对象完整
如果某一方法的几个参数都是同一个对象中的成员变量,则可以将这个对象作为方法参数传入。
优点:
1. 这个对象中新增某一成员变量也需要作为参数传入这个方法,如果是用把对象作为参数,则不需要更改这个方法的参数。否则你要将这个方法的参数增加一个新的参数。
2. 方法参数最好不要太多,使用这个重构操作就是为了减少方法的参数个数。
Example7示例
处理泛化
57上移类成员变量
如果一个类的两个子类中有相同的成员变量,则可以将这个成员变量上移到他们的父类中去。Example1示例
58上移方法
如果一个类的两个子类中有相同的方法或者返回类型相同,做同一件事情,则可以将这个方法上移到他们的父类中去。Example2示例
60下移方法
如果父类中某个方法只与部分子类有关,则将这一方法下移到子类中去。
61下移类变量
同理,父类中某一成员变量只与部分子类有关,则将这一变量下移到子类中去。
Eclipse重构快捷键一览
Alt+Shift+T 打开重构菜单
Alt+Shift+R 方法,变量重命名
Alt+Shift+V 方法,变量移动
Alt+Shift+I 方法,变量内联
Alt+Shift+M 抽取方法
Alt+Shift+L 抽取局部变量
Alt+Shift+C 改变方法参数
相关推荐
代码重构总结实例
讲述了java代码的重构总结 规范代码,有必要好好学习
通过对代码规范相关的三本书《重构,改善代码的既有设计》、《代码整洁之道》、《阿里巴巴Java开发手册》,抽取了重要成分,对代码优化重构思路的一次总结
第1章 重构,第一个案例 1.1 起点 1.2 重构的第一步 1.3 分解并重组Statemen 1.4 运用多态取代与价格相关的条件逻辑 1.5 结语 第2章 重构原则 2.1 何谓重构 ...第15章 总结 参考书目 要点列表 索引
1. 重构前的一些缺点 1. 频道显示在VideoListActivity实现的,代码结构不够清晰 2. 频道页面需要根据不同频道目前存在矩阵式显示和列表式显示
第1章 重构,第一个案例 1 1.1 起点 1 1.2 重构的第一步 7 1.3 分解并重组statement() 8 1.4 运用多态取代与价格相关的条件逻辑 34 1.5 结语 52 第2章 重构原则 53 ...第15章 总结 409
第1章 重构,第一个案例1 1.1 起点1 1.2 重构的第一步7 1.3 分解并重组statement()8 1.4 运用多态取代与价格相关的条件逻辑34 1.5 结语52 第2章 重构原则53 ...第15章 总结409 参考书目413 要点列表417 索引419
《重构,改善既有代码的设计》,这是一部经典之作,相信很多人都听过或看过,看这本书时会发现,书中讲的都是一些很简单的东西,而且很多东西就是我们平时在做的,只是作者把它们总结了起来。比如说Rename Field,...
《重构-改善既有代码的设计》电子书以及总结的书中源码
附件是在读完《重构 改善既有代码的设计》之后,为代码的坏味道所撰写的总结文档。
重构-改善既有代码的设计 总结的书中源码
第1章 重构,第一个案例1 1.1 起点1 1.2 重构的第一步7 1.3 分解并重组statement()8 1.4 运用多态取代与价格相关的条件逻辑34 1.5 结语52 第2章 重构原则53 ...第15章 总结409 参考书目413 要点列表417 索引419
第1章 重构,第一个案例 1.1 起点 1.2 重构的第一步 1.3 分解并重组Statemen 1.4 运用多态取代与价格相关的条件逻辑 1.5 结语 第2章 重构原则 2.1 何谓重构 ...第15章 总结 参考书目 要点列表 索引
第1章 重构,第一个案例1 1.1 起点1 1.2 重构的第一步7 1.3 分解并重组statement()8 1.4 运用多态取代与价格相关的条件逻辑34 1.5 结语52 第2章 重构原则53 ...第15章 总结409 参考书目413 要点列表417 索引419
重构,一言以蔽之,就是在不改变外部行为的前提下,有条不紊地改善代码。多年前,正是本书原版的出版,使重构终于从编程高手们的小圈子走出,成为众多普通程序员日常开发工作中不可或缺的一部分。本书也因此成为与...
在总结面向对象1∶1双向关联关系几种典型的设计方法的基础上,利用类方法和类变量提出了一种适应1∶1双向关联关系设计变化的代码重构方法。