读书笔记——《重构》

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

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

  • 这是一个重构的案例

第二章 《重构原则》

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

  • 让【请托】继承【受托】
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容