Litong's Blog

Work to become, not to acquire.

第5章 介绍重构名录

重构的记录方式:

名称:重构词汇表
速写:找到你所需要的重构手法
动机:为什么需要做这个重构;什么情况下不该做这个重构
做法:简明扼要的重构步骤
范例:简单的重构示例

重构的每个步骤要拆得尽可能小,并且在每个步骤之后进行测试。

小步前进,情况越复杂,步子就要越小。

提炼函数

提炼函数/变量的关键在于命名,其反向重构是内联函数/变量。

形成函数并给函数命名,这是低层级重构的精髓。有了函数之后它们就可以组合成更高层级的模块。

提炼函数的最合理的动机是“将意图与实现分开”。

如果你需要花时间浏览一段代码才能弄清楚它到底在干什么,那么就应该将其提炼到一个函数中,并根据它所做的事为其命名(是“做什么”,而不是“怎么做”)。

写小函数。函数名称的长短不重要,代码的意图与实现之间的距离才重要。

起好名字需要练习,你必须在命名上花心思。

内联函数

非必要的间接性总是让人不舒服。

如果代码的内容和名称同样清晰,就应该直接使用其中的代码。

不是所有的间接层都有价值,如果间接层只是简单的委托,那么就可以去掉。

重构的重点在于始终小步前进。

提炼变量

别名:引入解释性变量。

表达式可能非常复杂而难以阅读,局部变量可以帮助我们将表达式分解为比较容易管理的形式。

对象带来的好处:提供合适的上下文,方便分享相关的逻辑和数据。

内联变量

别名:内联临时变量

如果变量名称比表达式更具有表现力,那么就可以考虑去掉表达式,使用内联变量。

改变函数声明

别名:函数改名

函数声明就是函数系统的关节。

函数的参数阐述了函数如何与外部世界共处。

修改参数列表不仅能增加函数应用范围,还能改变连接一个模块所需的条件,从而去除不必要的耦合。

如何选择正确的参数,没有简单的规则可循,正确的封装度会随着时间变化。

封装变量

别名:自封装字段,封装字段

如果想搬移一处被广泛使用的数据,最好的办法往往是先以函数形式封装所有对该数据的访问。

封装数据的价值除了可以将数据的组织转化为对函数的组织,还可以监控数据的变化和使用情况。

数据的作用域越大,封装就越重要。

封装数据很重要,但是不可变数据更重要。不可变性是强大的代码防腐剂。

变量改名

好的命名是整洁编程的核心,好的变量可以很好地解释一段程序在干什么。

使用范围越广,名字的好坏就越重要。

引入参数对象

将数据组织成结构是一件有价值的事,因为这让数据项之间的关系变得明晰。

参数对象重构的真正意义在于,它会将这些数据结构提升为新的抽象概念,可以帮助我们更好地理解问题域。

将关联的参数替换为真正的对象只是第一步,创建一个类是为了把行为搬移进去。

函数组合成类

如果发现一组函数形影不离地操作同一块数据,那么这就该组建一个类了。

函数组合成变换

在软件中经常需要将数据投喂给一个程序,让它再计算出各种派生信息,通常会把所有计算派生数据的逻辑收拢到一处。

创建一个变换函数,输入参数是需要变换的记录,并直接返回该记录变换后的值。

拆分阶段

每当一段代码在同时处理两件不同的事,就应该将其拆分为各自独立的模块。