重构

[TOC]

重构原则

  • 重构定义

重构对软件内部结构的一种调整,目的是不改变软件可观察行为的前提下,提高其可理解性,降低修改技术


  • 为何重构

1.重构改进软件设计

2.重构使下个接盘的人更容易理解代码

3.重构期间可能可以找到bug

4.重构提高编程速度


  • 何时重构

1.三次法则(==第一次做某事的时候可以直接做第二次做的时候会产生反感第三次做得时候就应该重构==)(ps:比如一个app里面有多个发送验证码操作如果只有一次可能无须封装但如果有两次可能第二次已然不会封装,但是第三次就应该有封装的必要了)

2.添加新功能时

3.修补错误时

4.复审代码时重构


  • 何时不该重构

1.现有代码已经无法理解,这个时候只能重写而不是重构否则重构比重写花的时间要多的多

2.项目时间急的时候也不适合重构

如何重构

什么样的代码应该重构

如果尿布臭了,就换掉它
——beck奶奶

2.重复代码过多

3.过长的行为

4.免过大的类

5.发散式变化(假如新加一个功能我这需要改3个行为,在加一种我这需要改4种行为,这样可以将其分化为2个对象符合面向对象里的单一原则 )

6.霰弹 一种变化引起多个类相应修改 应将需要修改的类封装

7.依恋情节将数据和对数据操作行为包装在一起,比如执行某个行为调用了另一个类里超过半数的行为这个时候应该将该行为移动至其他地方


重构的几种姿势

过长函数和过多的参数会使人看起来这个函数很难受里面包含着特别复杂的逻辑。

重新组织函数

提炼函数最大的困难就是处理局部变量,处理临时变量时候可以用查询替代临时变量,去掉所有可以去掉的临时变量。如果很多地方都用到了临时变量,需要先分解临时变量,使其更容易被替换,如果临时变量是在特别乱的话难以替换那么需要使用以函数对象使用函数,这样可以分解混乱的函数,参数带来的问题比临时变量稍微少一些,前提是是不在函数内赋值给他们,如果已经这么做了需要移除对函数的赋值,函数分解完毕后也可以在此基础上优化算法,替换算法

提炼函数

将一个行为分解成两个个行为

内联函数

在函数调用点插入函数本体,然后移除该函数

内联临时变量

临时变量只被赋值一次 变成一个简单的表达式

将所有对变量的引用动作,替换为它赋值的那个表达式自身

let baseprice = anOrder.basePrice()
return baseprice > 1000

内联后

return anOrder.basePrice() > 1000

(提炼函数)和(内联函数)其实是对立的,里面的重构方法有很多是对立的,其实我觉得总言之是为了增加程序的可读性和聚合性来看待(提炼函数)和(内联函数)选择。

以查询替代临时变量

以一个临时变量保存某一表达式的运算结果,替换后方便多处引用。

将这个表达式提炼到一个独立函数中。这个临时变量的所有引用 点替换为对新函数的调用

let baseprice = quantity * itemprice
if baseprice > 1000 {
    return basePrice * 0.95
}else {
    return basePrice * 0.97
}

var basePrice:Double {
    get {
        return  quantity * itemprice
    }
}
...
if baseprice > 1000 {
    return basePrice * 0.95
}else {
    return basePrice * 0.97
}

引入解释性变量

分解临时变量

移除对参数的赋值

以函数对象取代函数

替换算法

在对象间搬移特性

搬移函数

搬移字段

将类内联化

隐藏委托关系

移除中间人

你可能感兴趣的:(重构)