金融IT技术人员
提炼超类(Extract Superclass):两个类有相似特性;为这两个类建立一个超类,将相同的特性搬移到超类
提炼子类(Extract Subclass):类中的某些特性只被某些实例用到;新建一个子类,将上面所说的那一部分特性移到子类中
字段下移(Push Down Field):超类中某个字段只被部分子类用到;将这个字段移到需要它的子类中去
函数下移(Push Down Method):超类中的某个函数只与部分子类有关;将这个函数移到相关的子类中去
构造函数本体上移(Pull Up Constructor Body):你在各个子类中拥有一些构造方法,它们的本体几乎完全一致;在超类中新建一个构造函数,并在子类构造函数中调用它
函数上移(Pull Up Method):有些函数,在各个子类中产生完全相同的结果;将该函数移至超类
字段上移(Pull Up Field):两个子类拥有相同的字段;将该字段移至超类
以测试取代异常(Replace Exception with Test):面对一个调用者可以预先检查的条件,你抛出了一个异常;修改调用者,使它在调用函数之前先做检查
以异常取代错误码(Replace Error Code with Exception):某个函数返回一个特定的错误码,用以表示某种错误情况;改用异常
封装向下转型(Encapsulate Downcast):某个函数返回的对象,需要由函数调用者执行向下转型(downcast);将向下转型动作移到函数中
以工厂函数取代构造函数(Replace Constructor with Factory Method):你希望在创建对象时不仅仅是做简单的构造动作;将构造函数替换为工厂函数
隐藏函数(Hide Method):有一个函数,从来没有被其它任何类用到;将这个函数改为private
移除设值函数(Remove Setting Method):类中的某个字段应该在对象创建时被设值,然后就不再改变;去掉该字段的所有设值函数
引入参数对象(Introduce Parameter Object):Range模式;某些参数总是很自然的同时出现;以一个对象取代这些参数
以函数取代参数(Replace Parameter with Methods):对象调用某个参数,并将结果作为参数,传递给另一个函数,而接受该参数的函数本身也能够调用前一个函数;让参数接受者去除该项参数,并直接调用前一个参数
保持对象完整(Preserve Whole Object):你从某个对象中取出若干值,将它们作为某一次函数调用时的参数;改为传递整个对象
以明确函数取代参数(Replace Parameter with Explicit Methods):你有一个函数,其中完全取决于参数值而采取不同的行为;针对该参数的每一个可用值,建立一个独立函数
令函数携带参数(Parameterize Method):若干函数做了类似的工作,但在函数本体中却包含了不同的值;建立单一函数,以参数表达那些不同的值
将查询函数和修改函数分离(Separate Query from Modifier):某个函数即返回对象状态,又修改对象状态;建立两个不同的函数,其中一个负责查询,另一个负责修改
移除参数(Remove Parameter):函数本体不再需要某个函数;将该参数去除
添加参数(Add Parameter):某个函数需要从调用端得到更多信息;为此函数添加一个对象,让该对象带进函数所需信息
函数改名(Rename Method):函数的名称未能揭示函数的用途;修改函数名称
引入断言(Introduce Assertion):某一段代码需要对程序状态作出某种假设;以断言明确表现这种假设
引入Null对象(Introduce Null Object):你需要再三检查某对象是否为null;将null值替换为null对象
以多态取代条件表达式(Replace Conditional with Polymorphism):你手上有个条件表达式,它根据对象类型的不同而选择不同的行为;将这个条件表达式的每个分支放进一个子类内的覆写函数中,然后将原始的函数声明为抽象函数
以卫语句取代嵌套条件表达式(Replace Nested Conditional with Guard Clause):函数中的条件逻辑使人难以看清正常的执行路径;使用卫语句表现所有特殊情况
合并重复的条件片段(Consolidate Duplicate Conditional Fragments):在条件表达式的每个分支上有相同的一段代码;将这段重复的代码搬移到条件表达式之外
合并条件表达式(Consolidate Conditional Expression):你有一系列条件测试,都得到相同结果;将这些测试合并为一个条件表达式,并将这个条件表达式提炼为一个独立函数
分解条件表达式(Decompose Conditional):你有一个复杂的条件语句;从if,then,else三个段落中分别提炼出独立函数
以字段取代子类(Replace Subclass with Fields):你的各个子类的唯一差别只在“返回常量数据”的函数上:修改这些函数,使他们返回超类的某个新增字段,然后销毁子类
以State/Strategy取代类型码(Replace Type Code with State/Strategy):你有一个类型码,它会影响到类的行为,但是你无法通过继承手法消除它;以状态对象取代类型码
以子类取代类型码(Replace Type Code with SubClass):你有一个不可变的类型码,它会影响类的行为;以子类取代这个类型码
以类取代类型码(Replace Type Code with Class):类之中有一个数值类型码,但它并不影响类的行为;以一个新的类替换该数值类型码
以数据类取代记录(Replace Record with Data Class):你需要面对传统编程环境中的记录结构;为该记录创建一个“哑”数据对象
封装集合(Encapsulate Collection):有个函数返回一个集合;让这个函数返回该集合的一个只读副本,并在这个类中提供添加/移除集合元素的函数
封装字段(Encapsulate Field):你的类中存在一个public字段:将它声明为private,并提供相应的访问函数
以字面常量取代魔法数(Replace Magic Number with Symbolic Constant):你有一个字面数值,带有特别含义:创造一个常量,根据其意义为它命名,并将上述的字面数值替换为这个常量
将双向关联改为单向关联(Change Bidirectional Association to Unidirectional):两个类之间有双向关联,但其中一个类如今不再需要另一个类的特性;去掉不必要的关联
将单项关联改为双向关联(Change Unidirectional Association to Bidirectional):两个类都需要对方特性,但其间只有一条单向连接;添加一个反向连接,并使修改函数能够同时更新两条连接
复制“被监视数据”(Duplicate Observed Data):Observer/Observable模式。你有一些领域数据置身于gui控件中,而领域函数需要访问这些数据;将该对象复制到一个领域对象中。建立一个Observer模式,用以同步领域对象和Gui对象内的重复数据
以对象取代数组(Replace Array with Object):你有一个数组,其中的元素各自代表不同的东西;以对象替换数组。对于数组中的每个元素,以一个字段来表示
将引用对象改为值对象(Change Reference to Value):你有一个引用对象,很小且不可改变,而且不容易管理;将它变为一个值对象
将值对象改为引用对象(Change Value to Reference):你从一个类衍生出许多彼此相等的实例,希望将它们替换为同一对象;将这个值对象变成引用对象
以对象取代数据值(Replace Data Value with Object):你有一个数据项,需要与其他数据和行为一起使用才有意义;将数据项变为对象
自封装字段(Self Encapsulate Field):你直接访问一个字段,但与字段之间的耦合关系逐渐变得笨拙;为这个字段建立取值/设置函数,并且只以这些函数来访问字段
引入本地扩展(Introduce Local Extension):你需要为服务类提供一些额外函数,但你无法修改这个类;建立一个新类,使它包含这些额外函数,让这个类扩展成为源类的子类或者包装类
引入外加函数(Introduce Foreign Method):你需要为提供服务的类增加一个函数,但你无法修改这个类;在客户端建立一个函数,并以第一参数形式传入一个服务类实例
移除中间人(Remove Middle Man):某个类做了过多的简单委托动作;让客户直接调用受托类
隐藏“委托关系”(Hide Delegate):客户通过一个委托类来调用另一个对象;在服务类上建立客户所需的所有函数,用以隐藏委托关系
类内联化(Inline Class):某各类没有做太多的事情;将这个类的所有特性搬移到另外一个类中,然后移除原类