版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
最近在读《重构-改善既有代码的设计》,对其简单进行了一下总结,但是对于里面大多数内容,认为都是无关紧要的。
姑且先简单写一下,如果后续有比较好的重构理念,再进行补充
重构:对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低其修改成本。
原因:
当人们只为短期目的,或是在完全理解整体设计之前,就贸然修改代码,程序将逐渐失去自己的结构,程序员越来越难通过阅读源码而理解原来的设计。
1、代码经过很多人的手,时间变长,每个人的风格不同,是代码变得杂乱
2、写代码时为了短期目的,只为满足功能,没有考虑扩展性与可理解性
三次法则:事不过三,三则重构
第一次做某件事时只管去做;第二次做类似的事会产生反感,但无论如何还是可以去做;第三次再做类似的事,你就应该重构。
添加功能时重构;复审代码时重构;修补错误时重构。
代码的坏味道:
重复代码、过长函数、过大的类、过长的参数列、发散式变化、数据泥团、switch、过多的注释
提炼函数:针对过长的函数
可以将部门独立的功能抽取出来,作为单独的函数来调用。同时函数名要能代表抽取这部分代码的功能,使人容易理解。
同时要注意是否引用局部变量,处理好局部变量与抽取新函数之间的调用关系。
拆分时注意不要粒度过于细,否则会造成函数功能过于简单,同时数量太多,反而不利于维护
void printinfo(){
printBanner();
System.out.println("print test");
System.out.println("print info");
}
void printinfo(){
printBanner();
printInfo();
}
void printInfo(){
System.out.println("print test");
System.out.println("print info");
}
2、引入解释性变量
表达式有可能非常复杂而难以阅读,这种情况下,临时变量可以帮助你将表达式分解为比较容易管理的形式
boolean volumeAndCommissionRate = (volume==0) && (commissionRate >=50) && userType.equals("0") &&
(null == dsr || dsr==50000 || dsr==0);
boolean volumeAndPrice = (volume==0) && (zkFinalPrice==0.1 || zkFinalPrice==0.01) && userType.equals("0");
boolean priceAndDsr = first && ( dsr==0 || null == dsr || dsr==50000 ) && (zkFinalPrice<=1) && userType.equals("0");
if(priceAndCommissionRate || volumeAndCommissionRate || volumeAndPrice || priceAndDsr){
System.out.println("test info");
}
if((volume==0) && (commissionRate >=50) && userType.equals("0") &&
(null == dsr || dsr==50000 || dsr==0) || (volume==0) && (zkFinalPrice==0.1 || zkFinalPrice==0.01) && userType.equals("0") || first && ( dsr==0 || null == dsr || dsr==50000 ) && (zkFinalPrice<=1) && userType.equals("0")){
System.out.println("test info");
}
3、移除对参数的赋值
当函数对传入的基本类型的参数,进行操作时,可能会造成语义不清,所以建议如果对变量进行修改,建议赋值给一个新的变量,然后进行操作,这样就能体现函数所带来的变化。
int count(int v1,int v2){
return v1*89+100
}
int count(int v1,int v2){
int temp = v1*89+100;
return temp;
}