-
如果你发现自己需要为程序添加一个特性,而代码结构使你无法很方便的达成目的,那就先重构那个程序或模块,使得特性的添加比较容易进行,然后再添加特性
-
重构之前,首先检查自己是否有一套可靠的测试机制。这些测试必须有自我检验的能力
第二章 重构的原则
2.1 何谓重构
重构和性能优化的区别
相似之处:都需要修改代码,都不会改变程序的整体功能
区别:重构是为了程序“更容易理解,更易于修改”。这可能使得程序运行的更快,也可能使程序运行的更慢;性能优化时,只关注程序运行得更快,最终得到的代码可能更难以理解和维护,对此我们有心里准备。
2.3 为何重构
重构改变软件的设计
重构使得软件更容易理解
重构帮助找到bug
重构提高编程速度
第三章 代码坏味道
3.2 过长函数
- 每当感觉需要以注释来说明点什么的时候,我们就把需要说明的东西写进一个独立函数中,并使用其用途(而非实现手法)命名
- 如何提炼哪一段代码?(1)寻找注释;(2)条件表达式和循环
- 小函数的关键在于一个好名字
3.3 过大的类
单个类做太多的事情,伴随出现太多实例变量、太多代码
对于太多实例变量处理方法:运用提取类方法将几个变量提炼至新类中。提炼时应该选择类内彼此相关的变量;或者数个相同前缀或字尾的几个变量;将他们发放在一起。
对于有太多代码的类,同样适用提取类、提取子类的方法。方法是:先确定客户端如何使用他们,然后运用提取接口为每一种使用方式提炼出一个接口。
3.4 过长参数列表
3.5-3.6 散弹式修改&发散式变化
发散式变化:一个类由于不同原因需要向不同方向变化,导致每个方向的修改不一致。这时我们需要分离对象或者类,使得某个方向变化的所有修改都只发生在单一类中。
散弹式修改:一种变化引发多个类作出相应修改。使用搬移方法和搬移成员的方法把所有需要修改的代码放进同一个类。如果没有合适的类安置这些代码,就创建一个。
3.7 依恋情结
3.8 数据泥团
3.9 基本类型偏执
3.10 switch 惊悚现身
少用switch语句,switch语句的问题在于重复,常常发现switch语句散步在不同的地点。如果需要为它添加一个新的case子句,就必须找到所有的switch语句并修改他们。
解决办法:用多态来替换它。首先使用提取方法把switch语句提炼到一个独立函数中;然后用搬移方法将它搬移到需要多态性的那个类中。
3.20 纯粹的数据类
Data Class指的是拥有一些字段,以及用于访问(读写)这些字段的函数,除此之外别无其它。这样的类往往伴随着被其他类过分细碎的操控着。
我们期望在这些字段被取值、设置函数调用的地点,尝试以搬移方法把那些调用行为搬移到Data Class中来。
3.21 被拒绝的馈赠
子类应该继承超类的函数和数据。但是子类仅仅想继承部分的方法和字段,不想继承所有的接口和成员
3.22 过多的注释
当你感觉需要撰写注释时,请先尝试重构,试着让所有的注释变得多余
4. 构筑测试体系
4.1 自测试代码的价值
开发中最多的时间是调试;
确保所有的测试都完全自动化,让他们检查自己的测试结果;
一套测试就是强大的bug侦测器,能够大大缩减查找bug所需要的时间,大大提供开发的效率;需要确切体验到这种方法对变成速度的提升,否则自我测试就显示不出它的意义。