重构是指这样一个过程:在不改变代码外在行为的前提下,对代码做出修改,以改变程序的内部结构,本质是指代码写好后的设计改进,提高可理解性,降低修改成本。
什么时候重构:
1.三次原则,多次重复的事情,想办法重构
2.添加新的功能时候
3.修补错误时重构
4.复审代码时候重构
为什么要重构:
1.完成今天的任务,我们还要考虑明天;
2.难于阅读的程序,难以修改;
3.逻辑重复的程序,难以修改;
4.添加新行为时,要修改已有代码,难以理解;
5.带复杂逻辑的程序,难以修改;
6.每次重构可以加深对代码的理解,不至于遗忘;
我们希望达到这样的效果:
1.容易阅读;
2.所有逻辑只在唯一地点指定;
3.新的改动不会危及现有行为;
4.简单的表达逻辑;
有这么多重构小技巧:
计算机科学是这样一门科学:它相信所有问题都可以通过增加一个间接层来解决。----Kentn Beck
好的变量命名,可以减少注释,提高可阅读性。
一些没有调用数据库的操作,单纯操作对象提取Utill
类,对象设值,提取方法到对象中。
去除一些临时变量,提取方法,临时变量助长冗长复杂函数。
…
哪些代码的坏味道:
1.重复的代码,相同的表达式,两个互为兄弟子类内含相同表达式;
2.过长的函数,寻找注释,一行注释,也可提炼一个函数;
3.过大的类
4.过长的参数列,对象传递,数据泥团,有关系的数据,提取新对象。
5.发散式变化,散弹式修改,(修改一个点,要修改很多处),放到一个类型,有点ddd
的味道;
6.单一原则,一个方法只做一件事,返回数据简洁,不返回多余字段。
7.临时字段,过度耦合消息链;中间人,多一层调用,委托太多
8.过多的注释,有注释是好事,过多注释是代码有问题,方法名是一个很好的解释。
9.太多中间层,有较多无用的层次;
10.switch
过多地方使用,添加case
,统一到一个地方。大量的if else
,可以尝试这样优化;
好的代码习惯,方便后续开发,构筑测试体系:
自动化测试类,assert
断言一类,比较结果,小的功能,立即添加测试。
一些优化技巧:
内联函数,内联临时变量。将该变量的引用动作,替换为对他赋值的哪个表达式自身。
变量声明改成final
定义,检查是否的确只被赋值一次。
移除对参数的赋值;按值传递,按引用传递。
以查询取代临时变量;
double basePrice = 3*ww;
if(ss >10000){
}else{
}
演变:
double basePrice ()
{
return 3*ww;
}
if(basePrice () >10000)
{
}
else
{
}
函数本体,替换成一个算法;
如java8
的map
内部类使用,移除萎缩的类;
声明常量替换魔法数,使用枚举等;
简化条件表达式,合并重复的条件片段;
移除控制标记,使用break,continue,return
等,单一入口原则;
函数的名称很重要
过多的参数,无用的参数,多态
查询和修改分离;
继承,字段上移,如都有id
等,baseRequest
;
提炼接口,责任划分是通过多继承实现,java
只提供单继承,但是接口可以实现。