重构领域的经典之作,开发必看,推荐之!
第一章讲了一个案例引入重构,第二章讲了重构的一些原则,如何为重构,何时重构等,理论性的东西,过,从第三章开始。
代码的坏味道
何时需要重构,作者用了代码的坏味道来描述,坏味道体现在:
- Duplicated Code;
- Long Method;
- Large Class;
- Long Parameter List;
- Divergent Change(发散式变化):一个类受到外界多个变化的影响,通常是一个类承担了多个责任,违反了单一职责原则;
- Shotgun Surgery(霰弹式修改):跟5不一样,这个是,外界的一个变化,导致多个类的修改;
- Feature Envy(依恋情结):比如A类中一个方法,这个方法处理的是B类中数据和调用的是B类中方法,那么就可以将其移到B类中;
- Data Clumps(数据泥团):一些数据项总是一起出现使用,那么就可以单独提出来;
- Primitive Obsession(基本类型偏执):简单的为一些经常出现的基本类型建立对象,如开始结束时间表示一个时间范围等;
- Switch Statements;
- Parallel Inheritance Hierarchies(平行继承体系):shutgun surgery的特例,比如我一个类中的方法,复制来复制去,然后要改动的时候,要改动所有这些类;
- Lazy Class(冗余类);
- Speculative Generality(夸夸其谈未来性):有时候,我们会为类或方法加上一些不需要的东西,期待未来某天会使用;
- Temporary Field(令人迷惑的临时字段);
- Message Chains(过度耦合的消息链):例如A调用B,B调用C;
- Middle Man(中间人):这里指的是过度使用代理模式,一个类中的大部分方法都是另一个类方法的代理,那这个类就不一定需要存在;
- Inappropriate Intimacy(狎昵关系):2个类的关系过于亲密;
- Alternative Classes with Different Interfaces(异曲同工的类);
- Incomplete Library Class(不完美的类库);
- Data Class(纯稚的数据类):拥有一些字段以及相关访问,贫血的类,只有数据,没有行为,只是数据集合,对这些类,需要更合理的访问封装;
- Refused Bequest(被拒绝的遗赠):继承情况下,子类可能存在不支持父类的情况,或者不全支持,那可能是继承关系出现问题了;
- Comments(过多的注释);
构筑测试体系
之前我们已经有了开发冒烟测试/测试环境/预发布环境测试3类,缺少单元测试,最近公司要强推单元测试,后面会更加重视这个东西了。
自动化测试,Junit测试/mock,覆盖率等。
重新组织函数
Extract Method(提炼函数):
- 有一段代码可以被组织在一起并独立出来,那就将这段代码放进一个独立函数中,用函数名解释该函数的用途;
- 提炼函数需要注意变量的提取;
- 函数名的命名要真正说明函数内容;
Inline Method:
- 一个函数的本体与名称同样清除易懂,在函数调用点插入函数本体,然后移除该函数;
- 如果函数体简短易懂,就没有必要单独出来成一个函数;
Inline Temp(内联临时变量):
- 有时候临时变量会被滥用,只是简单赋值一次计算下的,就建立个临时变量,没有必要;
Replace Temp with Query(以查询取代临时变量):
- 以一个临时变量保存某一表达式的运算结果,将这个表达式提炼到一个独立函数中。将这个临时变量的所有引用替换为对函数