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)

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

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

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

    这本书真的很赞,有种醍醐灌顶的感觉,一如既往,我还是大致分析一下这本书的思想,而不是单纯的文字摘录. 首先,无论是类还是方法本身,都可以视作对象.重构则是研究怎么降低耦合度的一种技术,同时我还是很支持 ...

  2. 『重构--改善既有代码的设计』读书笔记----序

    作为C++的程序员,我从大学就开始不间断的看书,看到如今上班,也始终坚持每天多多少少阅读技术文章,书看的很多,但很难有一本书,能让我去反复的翻阅.但唯独『重构--改善既有代码的设计』这本书让我重复看了 ...

  3. 重构 改善既有代码的设计:代码的坏

    以下内容来自<<重构 改善既有代码的设计>> 一.什么是重构 所谓重构(Refactoring)是这样一个过程:在不改变代码外在行为的前提下,对代码做出修改以改进程序的内部结构 ...

  4. 重构—改善既有代码的设计

    概述 1.1 参考资料 <重构-改善既有代码的设计>读后总结 <重构改善既有代码的设计> 22种代码的坏味道,一句话概括 1.2 何谓重构 首先要说明的是:视上下文不同,重构的 ...

  5. PHP 杂谈《重构-改善既有代码的设计》之二 对象之间搬移特性

    思维导图 索引: Ø Move Method(搬移函数) Ø Move Field (搬移值域) Ø Extract Class (提炼类) Ø Inline Class (将类内联化,就是把当前的类 ...

  6. PHP 杂谈《重构-改善既有代码的设计》之三 重新组织数据

    介绍 承接上文的PHP 杂谈<重构-改善既有代码的设计>之 重新组织你的函数继续重构方面的内容. 这章主要针对数据的重构. 1.争论的声音--直接访问Field还是通过函数(Accesso ...

  7. 《重构-改善既有代码的设计》-第1例:租赁影片(2)

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 上接  重构-改善既有代码的设计-第1例:租赁影片(1) 2  运用多态取代与价格相关的条件逻辑 2 ...

  8. 《重构-改善既有代码的设计》-第1例:租赁影片(1)

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 买了<重构 - 改善既有代码的设计 >一书,一直没有好好看,大致过了下也觉得只是有点点印 ...

  9. 实践提高《重构改善既有代码的设计第2版》PDF中文+PDF英文+对比分析

    重构是编程的基础,是在不改变外部行为的前提下,有条不紊地改善代码.编程爱好者都知道,Martin Fowler 的<重构:改善既有代码的设计>已经成为全球有经验的程序员手中的利器,既可用来 ...

最新文章

  1. 怎么把项目推到gitlab上_将本地项目添加到 GitLab 上管理
  2. 数据库基础-数据库引擎
  3. wex5 教程 之 图文讲解 智能数据库设计 之(1) 触发器
  4. 选择合适的CMS搭建网站
  5. node封装mysql模块
  6. ASP.NET-Session cooike
  7. 攻防世界-web-shrine-从0到1的解题历程writeup
  8. C++数据结构struct
  9. The way of Webpack learning (IV.) -- Packaging CSS(打包css)
  10. 嵌入式linux python移植过程_嵌入式linux项目开发(一)——BOA移植
  11. 常见的SQL笔试题和面试题:SQL经典50题
  12. RK3308(3)---串口调试
  13. 一个内存增长问题的分析和处理(二)——valgrind工具的用法
  14. R语言包下载(转载)
  15. Loadrunner -27225错误
  16. 使用多种AI算法玩方格迷宫——基于Value的RL算法 【开源】
  17. Social LSTM全文翻译
  18. 全国首批城市级5G车联网应用项目落地!
  19. Hexo+Buttterly+Github Pages构建个人博客
  20. 【PCB设计】Mac系统Autodesk EAGLE PCB使用入门教程

热门文章

  1. PowerDesiger 15逆向生成工程E-R图及导出word表格
  2. http学习笔记(三):报文
  3. 学习Windows Phone手机开发:Tile的使用
  4. 详解jQuery对象与DOM对象的相互转换
  5. 面试时真能“坦白从宽”?
  6. Windows Mobile 5.0 中为开发人员提供的新功能(3)
  7. python做小程序-抖音最火的整蛊表白小程序如何做出来的?教你用python做出
  8. python画三维立体图-如何在论文中画出漂亮的插图?
  9. python画画-用python实现你的绘画梦想
  10. python大学课程-利用python完成大学刷课(从0到完成的思路)