代码改变世界

重构 - 重组方法

2016-03-07 23:32  yoogo  阅读(388)  评论(0编辑  收藏  举报

抽方法 (Extract Method)

问题

一坨代码理不清

分组,然后把一组代码移动到新的方法中

重构的必要性

行数越多,越难懂

收益

易懂,方法名代替了注释

减少重复

隔离的代码,更少出错


内联方法 (Inline Method )

问题

方法体比方法本身更直观

直接用方法体替换方法

重构的必要性

方法仅仅是一个委托

重构过程使得一个方法越来越短小,失去了存在的必要性。

收益

 


抽变量(Extract variable)

问题

某个表达式不好懂或者需要注释

把表达式的值赋值给一个变量,变量的名字解释表达式

重构的必要性

增加了代码的可读性,当然复杂性也提高了,注意权衡。

收益


内联临时变量 (Inline Temp)

问题

 一个临时变量只被用到一次,且对其赋值的表达式也足够易懂 。 

 

重构的必要性

 

收益


替换临时变量为查询(Replace Temp with query)

问题

 用一个临时变量保存表达式的结果供后续使用。但在多个方法中都重复这个代码。 

 把表达式抽成一个方法。替换所有使用变量的地方。换句话说,还是抽方法。

重构的必要性

 抽一个变量和抽一个方法都有为表达式注释的功能。显然抽方法可以被多个方法调用,减少了重复代码。 

收益

不适用:

如果临时变量为了 cache 一个复杂计算的结果,那变为查询或 inline 临时变量显然不是好主意。 


切割临时变量(split temporary variable)

问题

 一个临时变量用以保存若干个表达式的中间值;

 使用不同的变量保存不同的值。 

重构的必要性

这样的代码会阻碍你对代码做出改变。

收益

一个元素只做一件事,可以大大提高可维护性。

 


删除对参数的赋值 (Remove assianments to parameters)

问题

 给方法的参数赋值,和把一个变量多次赋值一样,是代码改变的阻力

 使用本地变量代替参数

重构的必要性

 

收益


替换方法为对象( replace method with method object)

问题

 方法有大量彼此相关的本地变量,是的抽方法变得困难或者难堪-因为参数列表会变得很长!

 新建一个类来提供这个方法,这样可以把临时变量转化成字段,这样就可以容易的把方法分割成多个。

重构的必要性

 通过添加一个额外的类分治问题,并且为进一步抽方法提供了可能性。 

收益

这个问题分治也可以通过工具类,但工具类仍然无法分治这些堆在一起的参数。而显然,引入方法对象则更明智。

 

缺点:

像抽方法,抽变量一样,带来了复杂性,所以要权衡。

 


替换算法 (Substitute algorithm)

问题

有更好的算法 

 

重构的必要性

 

收益