重构的目标:
1.持续偏纠和改进软件设计
2.提升项目整体性能,优化代码结构
3.使代码更被其他人所理解
4.帮助发现隐藏的代码缺陷
5.从长远来看,有助于提高编程效率,增加项目进度
重构函数:
1.减少临时变量。例如:if (are > 1000) { //XXXXX } //改为 if (self.are > 1000) { //XXXXX }
2.
重构类:
//1.搬移方法 //把方法放在最适合的地方
//2.移字段 //每个字段、变量应该放到自己的类中,不能随便放,不属于这个类的字段移走
//3.提炼一个新类 //将原类的一些属性和方法可否有共同点,能否做出一个新类。降低代码耦合 //如一个person类,有number、totalCosts(话费)、name属性,可新建一个TelephoneNumber类,number、totalCosts属性放入里面。
//4.内容移动 //子类都有相同的属性或方法,可将这属性、方法移到父类;若只是一部分,可创建一个子类,写入属性、方法。需要的类的基础此类。
//5.提炼接口 //把某些特殊功能的方法写入接口中,方便其它类调用。
重新组织数据:
//1.封装字段 //写属性的get方法,方便子类改变字段结果,提高扩展性 [self interg];
//2.对象替代数值 //比如:原来某类只需要名字属性,后来又需要性别、年龄,可以新增person类。
//3.传参数时,最好将参数变成对象,数据多时,很方便
if-else:
1.合并条件表达式:如果有一系列条件测试都得到相同结果,将这些结果测试合并为一个条件表达式
2.改为平行关系,而非包含关系;如果if-else嵌套没有关联性,直接提取到第一层;尽量减少临时变量改用return直接返回
double getPayAmount(){
double result;
if(_isDead) {
result = deadAmount();
}else{
if(_isSeparated){
result = separatedAmount();
}
else{
if(_isRetired){
result = retiredAmount();
else{
result = normalPayAmount();
}
}
}
return result;
改为:
double getPayAmount(){
if(_isDead)
return deadAmount();
if(_isSeparated)
return separatedAmount();
if(_isRetired)
return retiredAmount();
return normalPayAmount();
3.把不同状态的操作封装成函数
重构前:
double getPayAmount(){
Object obj = getObj();
double money = 0;
if (obj.getType == 1) {
ObjectA objA = obj.getObjectA();
money = objA.getMoney()*obj.getNormalMoneryA();
}
else if (obj.getType == 2) {
ObjectB objB = obj.getObjectB();
money = objB.getMoney()*obj.getNormalMoneryB()+1000;
}
}
重构后:
double getPayAmount(){
Object obj = getObj();
if (obj.getType == 1) {
return getType1Money(obj);
}
else if (obj.getType == 2) {
return getType2Money(obj);
}
}
double getType1Money(Object obj){
ObjectA objA = obj.getObjectA();
return objA.getMoney()*obj.getNormalMoneryA();
}
double getType2Money(Object obj){
ObjectB objB = obj.getObjectB();
return objB.getMoney()*obj.getNormalMoneryB()+1000;
4.
if-else总结:
尽可能地维持正常流程代码在最外层,保持主干流程是正常核心流程
为维持这个原则:合并条件表达式可以有效地减少if语句数目;减少嵌套能减少深层次逻辑;
异常条件先退出自然而然主干流程就是正常流程。
针对状态处理型重构方法有两种:一种是把不同状态的操作封装成函数,简短if-else内代码行数;另一种是利用面向对象多态特性直接干掉了条件判断。