代码重构总结

标签: 代码重构 | 发表时间:2013-11-10 16:49 | 作者:fanjf
出处:http://www.iteye.com

重构:对软件内部结构的一种调整,目的是在不改变软件之可察行为前提下,提高其理解性,降低其修改成本。

组织方法:

1抽取方法

创建一个新方法,命名以它做什么来命名,而不是怎么做来命名。 Example1示例

2方法内联

如果只是简单的委托,可以将方法内联。

注意点:

被子类继承的方法不能内联。Example2示例

3临时变量内联

如果一个临时变量只被简单的表达式赋值一次,就可以将它内联。

如何判定只被赋值一次?将这个临时变量申明为final。

如果是被赋值为一个方法的返回值。一般情况不用内联,除非妨碍了其他重构方法。

Example3示例

4查询取代临时变量

临时变量保存一个表达式的运算结果,可以抽取成一个独立方法(称之为查询),来代替临时变量。 Example4示例

5引入解释性变量。

如果有一个复杂的表达式,可以将该表达式中复杂的部分用一个临时变量来显示。

Example5示例

6分解临时变量

如果某个临时变量被赋值超过一次,而且它不是循环变量也不是表示一个整个方法都要使用的值。可以将它分解成好几个临时变量。 Example6示例

7去除对参数的赋值

JAVA中只采用值传递方式,因此对参数赋值会造成困惑。JAVA的方法参数表明被传递进来的东西,可以让代码清晰。 Example7示例

8方法对象取代方法

如果某个对象的一个方法很长,拥有很多局部变量。可以新建一个对象,将这个长方法放入新对象,将方法的所有局部变量变成新对象的类变量。并且在这个类中将这个长方法分解成很多小而短的方法。

Example8示例

移动对象特性

10移动方法

如果一个类中一个方法和另外一个类的调用,被调用更频繁,那么把这个方法放入另外那个类中。 Example1示例

11移动 类变量

如果一个类中一个类变量和另外一个类的调用,被调用更频繁,那么把这个类变量放入另外那个类中。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    改变方法参数

 



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [代码重构] 推荐:

代码重构

- - ITeye博客
随着程序的演化,我们有必要重新思考早先的决策,并重写部分代码. 代码需要演化;它不是静态的事物. 重写、重做和重新架构代码合起来,称为重构.    当你遇到绊脚石  ---  代码不在合适,你注意到有两样东西其实应该合并或是其他任何对你来说是"错误"的东西  -------- . 如果代码具备以下特征,你都应该考虑重构代码:.

代码重构总结

- - 开源软件 - ITeye博客
重构:对软件内部结构的一种调整,目的是在不改变软件之可察行为前提下,提高其理解性,降低其修改成本. 创建一个新方法,命名以它做什么来命名,而不是怎么做来命名. 如果只是简单的委托,可以将方法内联. 被子类继承的方法不能内联. 如果一个临时变量只被简单的表达式赋值一次,就可以将它内联. 将这个临时变量申明为final.

代码重构方向原则指导

- - 外刊IT评论
提示:如果您在阅读器里点击订阅本站的文章链接时发现有一个中转页,这说明你的订阅地址有误,本站的订阅地址(RSS)是:. http://www.aqee.net/feed/,请及时纠正. 重构是一种对软件进行修改的行为,但它并不改变软件的功能特征,而是通过让软件程序更清晰,更简洁和更条理来改进软件的质量.

代码重构:HTML与语义化

- - 标点符
在前端开发过程中,很多人谈到“模块化”,很少人特别关注“语义化”,简单的说大多数人更关注功能的实现,而忽视了实现的细节. 所谓HTML语义化,就是尽可能的理解要表达的内容,选择适合的HTML标签,将内容转换成浏览器认识的语言,通过浏览器传达信息给用户. 目前很多的前端书籍取名就叫精通DIV+CSS,让人感觉DIV可以搞定一切,但是DIV标签仅代表一个块状标记,HTML的每个标签都有它特定的意义,而语义化就是让我们在适当的位置用适当的标签,以更好的让人和机器(机器可理解为浏览器可理解为搜索引擎)都一目了然.

降低代码重构的风险

- - InfoQ cn
重构是每一个开发人员都要面对的功课,Martin Fowler将其定义为“在不改变软件外部行为的前提下,对其内部结构进行改变,使之更容易理解并便于修改”. 技术专家Paul在 博客中讨论了重构的风险,并提出了降低风险的措施. 重构代码是危险的,代码的变化会导致测试的压力很大. 除非有必要的理由,否则不要轻易重构.