像工匠一样进行重构, 让重构成为一门手艺.
Martin Flower的《Refactoring》其实更适合做一本关于重构的洗脑,宣言式的书,就像Kent Beck的《XP Explain》一样薄薄的就可以了。只可惜他却非常的厚。真正动手重构,我更喜欢《Refacoring WorkBook》,他以一个工匠的语气传授重构的手艺,,让重构从理论变为一门机械实在的手艺。
1.重构 Within Classes
1.1 大是罪
Long Method,Large Class,Long Parameter List, 一般通过度量工具找出来,还可以自己设定一个触发器,当度量结果超过某个限度时就报警. PMD可以实现这个功能, 但软件度量工具我更喜欢Metrics Reload, 一个IDEA的插件, 给出的度量信息很全面.
另外切忌为了度量的数字而重构。
Long Method当然是尝试Extract Method.
Large Class就要把类的职能分开几个域, 尝试拆出另一个Class或者SubClass
Long Parameter List 可以通过在方法内的变量用查询获得而不用由参数传入;
或者把某些参数组成一个对象.
1.2 重复也是罪
重复是30年前就被认为是不好的一样东西,表现在代码类似或者代码、接口不同而作用相近。
去除重复的方法也没什么特别,无非就是
Extract Method(同一个类)。有差异时,通过参数化达到共用。
Pull Up Method到父类(同一个父类)。有差异时,通过模板机制达到共用。
Class A调用Class B 或者 Extract Class C (两个完全无相干的类)
1.3 命名
中国程序员的英文本来就差, 要多参考Ofbiz,Comperie的命名, 尽快建立自己的项目字典,领域术语字典。
也幸亏,在工具辅助下,代码rename是最容易的重构。
1.4复杂条件
作者认为,即使现在Program最关注的是对象,以及对象间的关系了,但优质的内部代码依然重要,推荐《编程珠玑》和《Elements of Programing style》
化简复杂条件的基本有三个方法
1.通过!(A&B)==(!A)||(!B)化简
2.通过有意义的变量,函数代替条件表达式,比如
boolean isMidScore = (X>1000)&&(X<3000);
3.通过把一个if拆分开来执行,把guard clause放在前面
比如if(A||B)
do();
->if(A)
do();
if(B)
do();
又可以把2,3灵活组合,比如根据2,Extract出一个isRight()函数,根据3 isRight()
{
if(A)
return true;
if(B)
return true;
return false;
}
1.5 其他
死代码, 通过IDE工具探知并移除。小心有些框架代码是不能删除的。
Magic Number,当然是改为常量。如果Magic Number很多,可以用Map枚举类来存放.
除臭剂式的注释,为方法,变量改一个更适合的名字。如果注释是针对一个代码段的,可以Extract Method。当然,代码只能说明how, 不能说明why,更不能说明why not,这才是注释存在的地方。
2.重构 Between Classes
待续