重构-改善既有代码的设计

读后感

其中的一些方法平时自己也能悟得一二,但是有些规则的确读后醍醐灌顶,拍案叫绝。

整理

不是目录, 是目录 + 理解 :)

垃圾代码的表现

1 毫无节制的方法,过多的参数,过大的类。
简单、清晰、内聚是最好的指导原则。

2 调用链与委托

status = model.getBase().getStatus()

调用端是否有必要知道base的存在是是否委托的判断条件。 委托的目的是隐藏更底层的逻辑关系,调用方没必要了解这些关系,也更符合封装的原则。


方法、类与数据,所有的代码无疑是使用这三个工具完成需求。 主要的优化点与指导原则也在这三大块上。

方法

1 提炼函数与过度提炼。
2 [good]行为平行是关键。

// 像什么 放油、爆锅之类的放在cook中,而不应该与下面这几步骤平行
public prepareDinner(){
    buy();
    wash();
    cook();
}

3 以查询取代临时变量。
4 以函数对象取代函数。
在原对象大的无法处理时,进一步划分,按照职责拆解函数到对应的对象中。

5 [good]不能对参数赋值。
想要改变参数,又想提炼函数,怎么办?把这个方法放到想要改变参数的对象中。 Java的按值传递性。

6 引入NULL对象
这个很有意思,通过集成原对象,并对NULL对象的元素赋初始值,在父类和NULL子类上都实现isNull方法,这种的应用场景是大部分元素都可能为空的情况。

7 将查询函数和修改函数分离
无非是各自为政,也称为 单一职责

8 以明确函数取代参数

9 以工厂函数取代构造函数

10 以异常取代错误码

1 父类与子类各司其职
父类中应该是更通用的动作,子类是更具体的动作。

其中涉及到的概念包括:

2 尽量做到 面向对象

数据

使用 面向对象 的思想组织,能提炼为类的都变为类。

测试为上

最近写代码也很有感触,自测,单测才是避免bug的最为有效的办法,而十分钟的单测,其转化率往往是一个小时的 bug 寻找,有 bug 无所谓, 所谓的是 挫败感 和寻找过程中的 无力感