读书笔记——《重构》

  • 重构:在不改变代码外在行为的前提下,对代码做出修改,以改进程序的内部结构,即在代码写好之后改进它的设计

第一章 《重构,第一个案例》

  • 这是一个重构的案例

第二章 《重构原则》

1.何谓重构

  • 名词形式:对软件内部结构的一种调整,目的是在不改变【软件之可察行为】前提下,提高其理解性,降低其修改成本
  • 动词形式:使用一系列重构准则,在不改变【软件之可察行为】前提下,调整其结构
  • 重构的目的是使软件更容易被理解和修改

2.为何重构

  • 改进软件设计
  • 使软件更易被理解
  • 助你找到bug
  • 助你提高编程速度

3.何时重构

  • 添加功能时一并重构
  • 修补错误时一并重构
  • 复审代码时一并重构

4.怎么对经理说

  • 不要告诉经理

5.重构的难题

  • 数据库
  • 修改接口
  • 难以通过重构手法完成的设计改动

6.重构与设计

7.重构与性能

  • 短程来看,重构的确会使软件变慢,但它使优化阶段中的软件性能调整更容易

8.重构起源何处

第三章 《代码的坏味道》

1.重复的代码

2.过长函数

3.过大类

4.过长参数列

5.发散式变化

6.霰弹式修改

7.依恋清洁

8.数据泥团

9.基本型别偏执

10.switch语句

11.平行继承体系

12.冗赘类

13.夸夸其谈未来性

14.令人迷惑的暂时值域

15.过渡耦合的消息链

16.中间转手人

17.狎昵关系

18.异曲同工类

19.不完美的程序类库

20.纯稚的数据类

21.被拒绝的遗赠

22.过多的注释

第四章 《构筑测试体系》

1.自我测试代码的价值

  • 修复bug很快,找bug很难

2.JUnit测试框架

  • 测试有助于实现重构

3.添加更多测试

第五章 《重构名录》

1.重构的记录格式

  • 名称、概要、动机、作法和范例

2.寻找引用点

3.这些重构准则有多成熟

  • 重构的基本技巧:小步前进,频繁测试
  • 设计模式为你的重构提供了目标

第六章 《重新组织你的函数》

1.Extract Method

  • 提取代码,满足一个函数只做一件事的原则
  • 命名主要根据“怎么做”,而不是“做什么”

2.Inline Method

  • 在函数调用点插入函数本体,然后移除函数

3.Inline Temp

  • 将所有对该变量的引用动作,替换为对它赋值的那个表达式本身

4.Replace Temp with Query

  • 将这个表达式提炼到一个独立函数中,将这个临时变量的所有【被引用点】替换为【对新函数的调用】,新函数可被其他函数使用

5.Introduce Explaining Variable

  • 将该复杂表达式(或其中一部分)的结果放进一个临时变量,以此变量名来解释表达式用途
  • 帮助理解代码

6.Split Temporary Variable

  • 针对每次赋值,创造一个独立的、对应的临时变量

7.Remove Aassignments Parameters

  • 以一个临时变量取代该变量的位置

8.Replace Method with Object

  • 将这个函数放进一个单独对象中,如此依赖局部变量就成了对象内的值域,然后你可以在同一个对象中将这个大型函数分解为数个小型函数了

9.Substitute Algorithm

  • 将函数本体替换为另一个算法

第七章 《在对象之间搬移特效》

1.Move Method

  • 你的程序中,有个函数与其所驻class之外的另一个class进行更多交流:调用后者,或者被后者调用

2.Move Field

  • 在target class 建立一个new field,修改source field 的所有用户,令他们改用new field

3.Extract Class

  • 建立一个新class,将相关的值域和函数从旧class搬移到新class

4.Inline Class

  • 将class所有特性搬移到另一个class中,然后移除原class

5.Hide Delegate

  • 在sever端建立客户所需的所有函数,用以隐藏委托关系

6.Remove Middle Man

  • 让客户直接调用delegate

7.Introduce Foreign Method

  • 在client class中建立一个函数,并以一个server class实体作为第一引数

8.Introduce Local Extension

  • 建立一个新class,使它包含这些额外函数,让这个扩展品成为source class的subclass或wrapper

第八章 《重新组织数据》

1.Self Encapsulate Field

  • 为这个值域建立取值/设值函数,并且只以这些函数来访问值域

2.Replace Data Value with Object

  • 将这笔数据项变成一个对象

3.Change Value to Reference

  • 将这个value object变成一个reference object

4.Change Reference to Value

  • 将它变成一个value object

5.Replace Array with Object

  • 以对象替代数组,对于数组中的每个元素,以一个值域表示之。

6.Duplicate Observed Data

  • 将该笔数据拷贝到一个domain object中,建立一个Observer模式,用以对domain object和GUI object内的重复数据进行同步控制

7.Change Unidirectional Association to Bidirectional

  • 添加一个反向指针,并使修改函数能够同时更新两条连接

8.Change Bidirectional Association to Unidirectional

  • 去除不必要的关联

9.Replace Magic Number with Symbolic Constant

  • 创造一个常量,根据其意义为它命名,并将上述的字面数值替换为这个常量

10.Encapsulate Field

  • 将它声明为private,并提供相应的访问函数

11.Encapsulate Collection

  • 让这个函数返回该群集的一个只读映件,并在这个class中提供【添加/移除】群集元素的操作

12.Replace Record with Data Class

  • 为该record创建一个【哑】数据对象

13.Replace Type Code with Class

  • 以一个新的class替换该数值型别码

14.Replace Type Code with Subclasses

  • 以一个subclass取代这个type class

15.Replace Type Code with State/Strategy

  • 以state object取代type code

16.Replace Subclass with Fields

  • 修改这些函数,使它们返回superclass中的某个值域,然后销毁subclasser

第九章 《简化条件表达式》

1.Decompose Conditional

  • 从if、then、else三个段落中分别提炼出独立函数

2.Consolidate COnditional Expression

  • 将这些测试合并为一个表达式,并将这个条件式提炼成为一个独立函数

3.Consolidate Duplicate Conditional Fragements

  • 将这段重复代码搬移到条件式之外

4.Remove Control Flag

  • 以break语句或return语句取代控制标记

5.Replace Nested Conditional with Guard

  • 使用卫语句表现所有特殊情况

6.Replace Conditional with Polymorpyism

  • 将这个条件式的每个分支放进一个subclass内的覆写函数中,然后将原始函数声明为抽象函数

7.Introduce Null Object

  • 将null value 替换为null object

8.Introduce Assertion

  • 以assertion明确表现这种假设

第十章 《简化函数调用》

1.Rename Method

  • 修改函数名称

2.Add Parameter

  • 为此函数添加一个对象参数,让该对象带进函数所需信息

3.Remove Parameter

  • 将该参数去除

4.Separate Query from Modifier

  • 建立两个不同的函数,其中一个负责查询,另一个负责修改

5.Parameterize Method

  • 建立单一函数,以参数表达那么不同的值

6.Replace Parameter with Explict Methods

  • 针对该参数的每一个可能值,建立一个独立函数

7.Preserve Whole Object

  • 改使用整个对象

8.Replace Parameter with Methods

  • 让参数接受者去除该项参数,并直接调用前一个函数

9.Introduce Parameter Object

  • 以一个对象取代这些参数

10.Remove Setting Method

  • 去掉该值域所有设值函数

11.Hide Method

  • 将这个函数修改为private

12.Replace Consatructor with Factory Method

  • 将构造函数替换为工厂函数

13.Encapsulate Downcast

  • 将向下转型动作移到函数中

14.Replace Error Code with Exception

  • 改用异常

15.Replace Exception with Test

  • 修改调用者。使它在调用函数之前先做检查

第十一章 《处理概括关系》

1.Pull up Field

  • 将此一值域移至superclass

2.Pull up Method

  • 将此函数移至superclass

3.Pull up Constructor Body

  • 在superclass中新建一个构造函数,并在subclass构造函数中调用它

4.Pull Down Method

  • 将这个函数移到相关的那些subclasses去

5.Push Down Field

  • 将这个值域移到需要它的那些subclasses去

6.Extract Subclass

  • 新建一个subclass,将上面所说的那一部分特效移到subclass中

7.Extract Superclass

  • 为这两个classes建立一个superclass,将相同特性移至superclass

8.Extract Interface

  • 将相同的子集提炼到一个独立接口中

9.Collapse Hierarchy

  • 将它们合为一体

10.Form Template Method

  • 将各个措施分别放进独立函数中,并保持它们都有相同的签名式,于是原函数也变得相同了,然后将原函数上移至superclass

11.Replace Inheritance with Delegation

  • 在subclass中新建一个值域用以博村superclass,调整subclass函数,令它改而委托superclass,然后去掉两者的继承关系

12.Replace Delegation with Inheritance

  • 让【请托】继承【受托】

0人点赞

日记本

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值