-
神秘命名
issue:意义不明、具有二义性的函数声明、变量、类名等。resolve:改名,采用有意义的词语。
-
重复代码
issue:存在多段相同的代码结构。resolve:提炼出重复的代码,并调用提炼的代码。
-
过长函数
issue:一个函数内实现两种以上的功能。resolve:尽可能的分解函数,一个函数只做一件事。
-
过长参数列表
issue:
- 函数的参数超过三个,有几个参数总是同时出现。
- 从现有数据结构中抽出很多数据项。
- 区分函数行为的参数。
- 多个函数有同样的几个参数。
resolve:
- 将参数合并成一个参数对象。
- 保持对象完整,传入原来的数据结构。
- 移除标记参数。
- 使用函数组合成类,将共同的参数变成类的字段。
-
全局数据
issue:代码的任何一个地方都可以对齐更改,而且没有机制可以探测出那段代码做出了修改。resolve:封装变量。使用函数将全局数据包装起来,并控制对它的访问。最好将这个函数及其封装的数据移到一个类或模块中,只允许模块内的代码使用它,从而尽量控制器作用域。
-
可变数据
issue:对数据的修改经常导致出乎意料的结果和难以发现的BUG。resolve:
- 封装变量
- 拆分变量:将其拆分成各自不同用途的变量,从而避免危险的更新操作。
- 提炼函数:尽量把逻辑从处理更新操作的代码中移出来,将没有副作用的代码与执行数据更新操作的代码分开。
- 如果一个变量在其内部结构中包含了数据,最好不要直接修改其中的数据,而是将引用对象改为值对象,令其直接替换整个数据结构。
-
发散式变化
issue:某个模块经常因为不同的原因在不同的方向上发生变化。如新加入一个工具,需要修改4个函数,新加入一个数据库,需要修改3个函数。resolve:拆分函数、提炼函数,将不同的逻辑分开。
-
霰弹式修改
issue:每遇到某种变化,你都必须在许多不同的函数或类内做出许多小修改。resolve:把所有需要修改的代码放在同一个模块中,把本不该分散的逻辑聚合到一处。
-
依恋情结
issue:一个函数与另一个模块中的函数或数据交流十分频繁,远多于在自己所处模块内部的交流。resolve:
- 如果函数中只有一部分存在这种情况就提炼函数。
- 判断哪个模块拥有此函数使用的数据最多,让后就把这个函数和那些数据摆在一起。
-
数据泥团
issue:两个类中相同的字段、许多函数签名中相同的参数。resolve:将相同的字段使用提炼类方法将他们提炼到独立对象中。运用引入参数对象或保持对象完整缩短参数列表,简化函数调用。
-
基本类型偏执
issue:不创建对问题域有用的基本类型,如钱、坐标、范围等。会存在计算物理量时无视单位的情况以及大量类似 if(a<upper && a>lower) 这样的代码。resolve:以子类取代类型码,以多态取代条件表达式。
-
重复的switch
resolve:以多态取代条件表达式。 -
冗余的元素
resolve:使用内联函数或内联类、折叠继承体系。 -
夸夸奇谈通用性
issue:过分的追求函数或类的通用性是没有必要的,这么做往往会使系统更难理解和维护。resolve:去掉用不到的多余的函数或功能。
-
临时字段
issue:某个类内部的某个字段仅为某种特定的情况而设。在这个字段未使用时,很难知道它的作用。resolve:将所有和这个字段相关的代码单独提炼出来成为一个类。
-
过长的消息链
issue:客户端代码将与查找过程中的导航结构紧密耦合。一旦对象间的关系发生变化,客户端就不得不做出相应修改。resolve:观察消息链最终得到的对象是用来做什么,看能否以提炼函数把使用该对象的代码提炼到一个独立的函数中,在将函数推入消息链。
-
中间人
issue:过渡运用委托。resolve:移除中间人,直接和真正负责的对象交流。
-
过大的类
issue:单独的类做太多事情,其内部往往会出现太多字段,重复代码就会出现。resolve:提炼类、提炼超类
-
纯数据类
issue:纯数据类指拥有一些字段,以及用于访问这些字段的函数,除此之外一无长物。resolve:封装类,并将那些调用行为移入到纯数据类中。
-
被拒绝的遗赠
issue:子类复用了超类的行为,却不支持超类的接口。resolve:使用委托取代子类或超类
重构--重构的迹象
最新推荐文章于 2024-04-26 20:53:11 发布