重构-改善既有代码的设计读书笔记

重构-改善既有代码的设计读书笔记_第1张图片

1、基本重构

1.1 提炼函数(Extract Function)

将意图和实现分开,如果需要花时间浏览一段代码才能弄清它到底在干什么,那么就应该将其提炼到一个函数中,并根据它所做的事为其命名。

1.2 内联函数(Inline Function)

在内容代码和函数同样清晰易读时,应该去掉函数,直接使用其中代码。
有太多间接层,系统中的所有函数只是对另一个函数的简单委托时,使用内联函数。

1.3提炼变量(Extract Variable)

易于理解,提高可读性

1.4 内联变量(Inline Variable)

在表达式比变量更有表达力时,用内联的方法消除变量

1.5 改变函数声明(Change Function Declaration)

为了清晰表达函数用途。包含修改函数名以及参数。

1.6 封装变量(Encapsulate Variable)

主要是修改作用域,减小可访问范围,方便后期重构。
易于监控数据的变化及使用情况。
面向对象方法强调对象的数据应该保持私有。

1.7 变量改名(Rename Variable)

主要是为了代码可读性

1.8 引入参数对象(Introduce Parameter Object)

将联系比较紧密的数据组织成数据结构,提升为新的抽象概念,更好地理解问题域。

1.9 函数组合成类(Combine Functions into Class)

将联系紧密的行为封装到类中。

1.10 函数组合成变换(Combine Functions into Transform)

将计算派生数据的逻辑收拢到一起,避免重复。

1.11 拆分阶段(Split Phase)

拆分成各自独立的模块。

2、封装

2.1 封装记录(Encapsulate Record)

用类来封装数据

2.2 封装集合(Encapsulate Collection)

访问时返回副本,同时支持对集合添加删除元素也封装起来

2.3 以对象取代基本类型(Replace Primitive with Object)

2.4 以查询取代临时变量(Replace Temp with Query)

将变量的计算逻辑放到函数中,有助于提炼得到的函数与原函数之间设立清晰的边界,避免难缠的依赖及副作用。
避免了在多个函数中重复编写计算逻辑。

2.5 提炼类(Extract Class)

为了职责清晰划分。

2.6 内联类(Inline Class)

一个类不再承担足够责任,不再有单独存在的理由,删除源类。

2.7 隐藏委托关系(Hide Delegate)

隐藏细节,方便后期修改

2.8 移除中间人(Remove Middle Man)

受委托的功能多时,则不需要转发

2.9 替换算法(Substitute Algorithm)

将方法抽象出来,方便策略替换

3、搬移特性

3.1 搬移函数(Move Function)

模块化考虑,将联系紧密的放置在一起,提高内聚性。

3.2 搬移字段(Move Field)

将联系紧密的放置在一起,提高内聚性。

3.3 搬移语句到函数(Move Statement into Function)

消除重复

3.4 搬移语句到调用者(Move Statement to Callers)

以往在多个地方共用的行为,现在需要在某些调用点表现出不同行为,差异部分移出到调用处

3.5 函数调用取代内联代码(Replace Inline Code with Function Call)

提升代码表达力

3.6 移动语句(Move Statement)

让相关联的东西一起出现,使代码更容易理解。

3.7 拆分循环(Split Loop)

让代码结构清晰

3.8 以管道取代循环(Replace Loop With Pipeline)

增强可读性

3.9 移除死代码(Remove Dead Code)

4 重新组织数据

4.1 拆分变量(Split Variable)

增强代码表达力,提高代码可读性

4.2 字段改名(Rename Field)

帮助理解

4.3 以查询取代派生变量(Replace Derived Variable with Query)

把可变数据的作用域限制在最小范围

4.4 将引用对象改为值对象(Change Reference to Value)

作为不要变对象来设计

4.5 将值对象改为引用对象(Change Value to Reference)

作为共享数据来使用

5、简化条件逻辑

5.1 分解条件表达式(Decompose Conditional)

处理复杂的条件表达式,使用提炼函数方式来简化

5.2 合并条件表达式(Consolidate Conditional Expression)

用于厘清逻辑组合,也可以使用提炼函数

5.3 以卫语句取代嵌套条件表达式(Replace Nested Conditional with Guard Clauses)

用以清晰表达在主要逻辑之前先做检查的意图

5.4 以多态取代条件表达式(Replace Conditional with Polymorphism)

用来处理switch分支

5.5 引入特例(Introduce Special Case)

创建一个特例元素,用以表达对这种特例的共用行业的处理。

5.6 引入断言 (Introduce Assertion)

6、重构API

6.1 将查询函数和修改函数分离(Separate Query from Modifier)

作好职责分离

6.2 函数参数化(Parameterize Function)

相似函数合并成一个函数,以参数形式传入不同的值,消除重复

6.3 移除标记参数(Remove Flag Argument)

使代码整洁,帮助开发工具更好地发挥作用。

6.4 保持对象完整(Preserve Whole Object)

通过使用引入对象

6.5 以查询取代参数(Replace Parameter with Query)

参数列表应该尽量避免重复,越短越容易理解

6.6 以参数取代查询(Replace Query with Parameter)

为了不依赖某个元素,把这个元素以参数形式传递

6.7 移除设值函数(Remove Setting Method)

6.8 以工厂函数取代构造函数(Replace Constructor with Factory Function)

工厂函数的实现内部可以调用构造函数,也可以换成别的方式实现

6.9 以命令取代函数(Replace Function with Command)

命令对象提供了更大的灵活性和更强的表达能力,除了函数调用本身 ,也可以支持附加的操作。

6.10 以函数取代命令(Replace Command with Function)

函数不复杂时

7、处理继承关系

7.1 函数上移(Pull Up Method)

重复代码上移到基类中

7.2 字段上移(Pull Up Field)

7.3 构造函数本体上移(Pull Up Constructor Body)

子类构造函数中公共部分提取到基类构造函数中。

7.4 函数下移(Push Down Method)

移到到真正关心子类中去

7.5 字段下移(Push Down Field)

如果某个字段只被一个子类用到,搬移到需要该字段的子类中。

7.6 以子类取代类型码(Replace Type Code with Subclasses)

与以多态取代条件表达式配合使用。

7.7 移除子类(Remove Subclass)

如果子类用处太少,则移除

7.8 提炼超类(Extract Superclass)

两个类在做相似事时,相似之处提炼到超类。

7.9 折叠继承体系(Collapse Hierarchy)

一个类与其超类已经没有多大差别,不值得再作为独立的类存在时,将子类和超类合并起来。

7.10 以委托代替子类(Replace Subclass with Delegate)

对于不同的变化原因,可以委托给不同的类,接口更清晰,耦合更少。

7.11 以委托代替超类(Replace Superclass with Delegate)

如果子类与超类之间耦合过强,超类的变化很容易破坏子类的功能 ,可以使用委托代替超类

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