《重构与模式》的读书笔记

ZhuYuanxiang 2023-11-06 15:10:52
Categories: Tags:

学习基础

熟悉《设计模式》和《重构》的概念,熟悉基本的 Java 语法和 XML 语法,熟悉 Eclipse 和 JUnit 的使用,有相对较好的英语基础。

1
### 学习过程
  1. 先按 P40 的学习顺序读完序号 1~9。理解每个重构模式的动机,尝试读懂示例中的代码 ( 实在不懂就放过,找机会上机也能明白 )。
  2. 在时间允许的条件下,可以重读和对书中代码重构,从而更加充分地理解重构与模式这两个重要的概念和实践方法。

学习目的

使自己编写的代码更容易被人读懂。

学习感悟

代码的重构应该是一步步完成的,每次重构的部分不要超过自己的理解能力的 5%。虽然这样操作略显繁琐,但是可以减轻头脑重构过程中的记忆强度,减少代码出错的机会。

代码的重构一定要配合 JUnit ( TDD,测试驱动开发 ) 完成,再加上 Git ( 版本管理 ) 和 Eclipse ( IDE 的重构工具 ) 那就事半功倍了。

一、构造函数

( 一 )、构造函数的重构

6.1. ( P43 ) 用 Creation Method 替换构造函数 : 用明确的创建方法代替类中的多个构造函数,避免创建新类时客户无法正确理解和使用构造函数的意图。

优点

缺点

11.1. ( P275 ) 构造函数链 : 把构造函数链接起来,减少代码的重复。特殊的构造函数调用更通用的构造函数,直到全包含构造函数 ( 处理所有的构造函数调用 )。

当构造函数数量过多时,可以使用 Creation Method ( 6.1 节 ) 重构。

( 二 )、Factory 的使用

6.3. ( P60 ) 用 Factory 封装类 : 将同一个包里面、实现了相同接口的多个类的实例化交由工厂完成。

优点

缺点

6.4. ( P67 ) 用 Factory Method 引入多态创建 : 将同样的超类,不同的创建过程统一交由工厂完成。

优点

缺点

算法重构

Strategy

7.2. ( P102 ) 用 Strategy 替换条件逻辑

优点

缺点

Template Method

8.1. ( P166 ) 形成 Template Method : 通过将不同方法中相同的顺序执行步骤提取出来从而实现泛化。

优点

缺点

Composite

XMLBuilder 的例子依据的有 ( 7.5 ) TagNode,( 6.5 ) TagBuilder,( 10.1 ) TagNode,代码中存在一些小问题,可以试着自己修改。

7.1. ( P97 ) Composed Method ( 组合方法 ) 模式 : 将代码组合成名字简单易懂的方法,再将这些方法组合成更大的方法,从而方便读懂代码。

优点

缺点

7.5. ( P143 ) Composite 模式 : 隐式地构造出树形结构。

优点

缺点

6.5. ( P74 ) 用 Builder 封装 Composite : 因为构造 Composite 有许多重复工作,并且工作流程是复杂而且容易出错的,通过 Builder 来处理构造细节来简化构造过程。

优点

缺点

10.1. Collecting Parameter ( 聚集参数 ) 模式 : 是把一个对象传入到不同的方法中,从而在这些方法中收集信息。

经常与 Composed Method 模式一起使用。

优点

缺点

8.2. ( P172 ) 提取 Composite : 将同一个超类下的多个子类实现的同样的 Composite 提取到超类中。

优点

8.3. ( P180 ) 用 Composite 替换一个对象和多个对象的分别 : 用 Composite 实现了既可以处理一个对象,也可以处理多个对象的同样的函数接口。

优点

缺点

Command

7.6. ( P155 ) 用 Command 替换条件调度程序 : 为动作创建 Command,将这些 Command 存储在集合中,再通过集合取出对应的 Command 执行。

优点

缺点

Adapter

8.6. ( P208 ) 提取 Adapter : 一个类适配了多个版本的组件、类库、API 或其他实体,可以通过提取 Adapter 来统一接口。

优点

缺点

8.5. ( P99 ) 通过 Adapter 统一接口 : 使用客户代码与多个类交互时,遵循统一接口完成。

优点

缺点

Adapter 模式与 Facade 模式的区别

State

9.1. ( P231 ) 用类替换类型代码 : 保护字段从而避免不正确或者不安全的赋值。

采用类替换类型代码而不用枚举,是因为类可以考虑未来行为的扩展,但是现在 Java 的枚举功能更加强大了,所以可以根据自己的习惯来选择。

当重构过程中产生的类需要扩展包含更多行为时,就可以考虑 ( 7.4.State 替换状态改变条件语句 ) 进行重构了。

优点

缺点

7.4. 用 State 替换状态改变条件语句 : 简化复杂的状态转换逻辑

优点

缺点

9.3. 引入 Null Object : 替换掉 null 的判断逻辑,提供了对 null 的正确处理。

优点

缺点

Singleton
6.6. 将 Singleton 内联化 : 把 Singleton 的功能搬移到需要它的类中,然后删除 Singleton。

优点

缺点

9.2. 用 Singleton 限制实例化 : 减少内存的占用,提高运行的速度。

优点

缺点

Observer

8.4. ( P190 ) 用 Observer 替换硬编码的通知

优点

缺点

注 : 例子不熟悉,所以代码没太能领悟

Decorator

7.3. ( P115 ) 将装饰功能搬移到 Decorator

优点

缺点

注 : 这部分的代码也不完备,理解起来有困难,建议大致了解作者思路就好了,Decorator 应该是个应用比较广泛的模式,以后自己可以通过实践探索。

Decorator 与 Strategy 的区别

相同点

不同点

11.2. ( P278 ) 统一接口 : 找出所有子类的公共方法,复制到超类中,在超类中执行空行为。

11.3. ( P280 ) 提取参数 : 通过客户代码提供的参数对字段进行赋值。

注 : 这两节都是辅助 Decorator 进行重构的。

6.2. ( P51 ) 将创建知识搬移到 Factory : 避免创建代码到处蔓延。

优点

缺点

注 : 可能作者认为采用的是 HTMLParser 的原因,所以给出的代码不全,不利于理解重构的含义。

Visitor

10.2. ( P259 ) 将聚集操作搬移到 Visitor : 适用于从多个对象中聚集信息,适用于从不同的对象中聚集信息。使用起来难度较大,首选应该是 Collecting Parameter 方法 ( P253,10.1. )。

优点

缺点

8.7. ( P217 ) 用 Interpreter 替换隐式语言

优点

缺点

2019.1.2. 晨,结束阅读。学习代码下载
也可以参考 GitHub 中的项目

补充 1 : 不要在意输入代码中出现的错误,那是因为代码不完备,许多类或者函数没有提供源代码。只要输入的代码可以排版和使用自动提示工具,就说明代码符合 Java 的语法规范,那么在阅读全书的过程中可以一点点把代码补全,或者根据自己的理解补全 ( 这也是个理解重构和提高编码能力的机会 )。

补充 2 : 如果需要下载 HTMLParser,请注意是 1.3 的版本才是作者使用的。但是与 HTMLParser 相关的例子与原代码并不完全相同,而作者并没有在自己的例子中把逻辑构造完整,因此建议跟 HTMLParser 相关的例子还是跳过吧,否则为了调试通过消耗时间太多。( 我现在开始渴望直接看《重构》那本书了。)

代码目录

贷款风险估算程序 ( 6.1,7.2,8.1,11.1 )

HTMLParser ( 6.2,7.3,8.2,10.1,10.2,11.2,11.3 )

对象-关系数据映射 ( 6.3 )

XMLBuilder ( 6.4,6.5,7.5,8.5 )

二十一点游戏 ( 6.6 )

集合类库 ( 7.1 )

SystemPermission ( 7.4,9.1,9.2 )

Product ( 8.3,8.7 )

CatalogApp ( 7.6 )

JUnit ( 8.4 )

数据库查询 ( 8.6 )

Applet ( 9.2 )