重构 - 重组方法
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)
问题
有更好的算法
解
重构的必要性