Extract Class(提炼类)
- 一个类是一个清楚的抽象,处理一些明确的责任
- 随着类的扩展,将相关变量和相关函数提炼成一个独立类
Message Chains (过度耦合的消息链)
- 隐藏委托关系,对象A->B->C ==>> A->B(k->C) ,在B对象中建立委托函数调用C
- 消息链未必需要重构
Rename Method (函数改名)
- 函数名称应该清晰表达其用途,切不可将就
- 可减少不必要繁琐的 注释
单元测试和功能测试
- 测试是一种风险驱动的行为
- 单元测试 (程序员的好朋友) 目的是为了提高程序员的生产率,暴露程序中的bug
- 功能测试目的是保证软件能够正常运作,把整个系统当作一个黑箱,不需要知道代码细节,从功能实现整体出发
Inline Temp (内联临时变量)
- 只被一个简单表达式赋值一次的临时变量,妨碍了一些重构手法
- 可将所有对该变量的引用动作,替换为对它赋值的那个表达式自身
Remove Assignments to Parameters (移除对参数的赋值)
- 代码对一个参数进行赋值,以一个临时变量取代该参数的位置
- int A; A=2; —> int B=A; B=2;
Replace Subclass with Fields (以字段取代子类)
- 建立子类目的:增加新特性或变化行为,but 子类的变化行为只有“常量函数” ,无子类继承父类的体现价值
- 在父类中建立与子类“常量函数”的返回值相应的字段,从而完全去除子类,可避免不必要的继承带来的额外复杂性
List of point(要点列表)
-
重构:对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低其修改成本
-
重构前,先检查自己是否有一套可靠的测试机制,这些测试必须有自我检验能力,事不过三,三则重构
-
频繁的运行测试,每次编译请把测试考虑进去
-
当你收到bug报告,请先写一个单元测试来暴露这个bug
-
千万不要因为测试无法捕捉所有bug就不写测试
-
重复考虑可能出错的边界条件
-
当一段代码被认为应该会出错时,请检查是否抛出了预期的异常
-
写出计算机可以理解的代码很容易,唯有写出让人类容易理解的代码才是优秀的程序员
溜~~^ -^