解决方案:在使用该方法最多的类中创建一个新方法,然后将代码从旧方法移动到这里。将旧方法的代码转换为对另一个类中新方法的引用,或者将其完全删除。
移动字段
问题:一个字段在另一个类中使用的次数比在它自己的类中使用的次数多。
解决方案:在新类中创建一个字段,并将旧字段的所有使用重定向到该字段。
提取类
问题:当一个类做两个类的工作时,会非常笨拙。
解决方案:相反,创建一个新类,并将负责相关功能的字段和方法放在其中。
内联类
问题:一个类几乎什么都不做,也不负责任何事情,也没有为它规划额外的责任。
解决方案:将所有功能从该类移动到另一个类。
隐藏委托关系
问题:客户端从对象 A 的字段或方法中获取对象 B。然后客户端调用对象 B 的方法。
解决方案:在类 A 中创建一个新方法,将调用委托给对象 B。现在客户端不知道也不依赖于类 B。
移除中间人
问题:一个类有太多的方法,这些方法只是委托给其他对象。
解决方案:删除这些方法,并强制客户端直接调用最终方法。
引入外部方法
问题:实用程序类不包含所需的方法,并且无法将该方法添加到该类中。
解决方案:将该方法添加到客户端类,并将实用程序类的对象作为参数传递给它。
引入本地扩展
问题:实用程序类不包含你需要的某些方法。但不能将这些方法添加到类中。
解决方案:创建一个包含这些方法的新类,并使其成为实用程序类的子类或包装器。
组织数据这些重构技术有助于数据处理,用丰富的类功能替换基本类型。
另一个重要的结果是解开了类的关联,这使得类更具可移植性和可重用性。
自封装字段
问题:你直接访问类内的私有字段。
解决方案:为字段创建一个获取器和设置器,并仅使用它们访问字段。
用对象替换数据值
问题:一个类(或一组类)包含一个数据字段。该字段有自己的行为和相关数据。
解决方案:创建一个新类,将旧字段及其行为放在该类中,并将该类的对象存储在原始类中。
将值更改为引用
问题:所以你有单个类的许多相同实例,并需要用单个对象替换它。
解决方案:将相同的对象转换为单个引用对象。
将引用更改为值
问题:你有一个太小且很少更改的引用对象,因此无法管理其生命周期。
解决方案:将其转化为值对象。
用对象替换数组
问题:你有一个包含各种类型数据的数组。
解决方案:将数组替换为每个元素都有单独字段的对象。
重复的被观测数据
问题:存储在类中的领域数据是否负责GUI?
解决方案:那么最好将数据分成不同的类,确保领域类和GUI之间的连接和同步。
将单向关联改为双向关联
问题:你有两个类,每个类都需要使用另一个类的功能,但它们之间的关联只是单向的。
解决方案:将缺少的关联添加到需要它的类中。
将双向关联改为单向关联
问题:类之间存在双向关联,但其中一个类不使用另一个类的功能。
解决方案:删除未使用的关联。
用符号常量替换幻数
问题:你的代码使用了一个具有特定含义的数字。
解决方案:将这个数字替换为一个常量,该常量有一个人类可读的名称来解释数字的含义。
封装字段
问题:你有一个公共字段。
解决方案:将字段设置为私有,并为其创建访问方法。
封装集合
问题:一个类包含一个集合字段和一个用于处理集合的简单获取器和设置器。
解决方案:将获取器的返回值设为只读,并创建用于添加/删除集合元素的方法。
用类替换类型代码
问题:一个类有一个包含类型代码的字段。这种类型的值不用于运算符条件,也不会影响程序的行为。
解决方案:创建一个新类,并使用其对象而不是类型代码的值。
用子类替换类型代码
问题:你有一个直接影响程序行为的代码类型(此字段的值触发条件中的各种代码)。
解决方案:为代码类型的每个值创建子类。然后将相关行为从原始类提取到这些子类中。用多态替换控制流代码。
用状态/策略替换类型代码
问题:你有一个影响行为的代码类型,但不能使用子类来消除它。
解决方案:用状态对象替换类型代码。如果需要用类型代码替换字段值,则另一个状态对象为“已插入”。
用字段替换子类
问题:你的子类只在(常量返回)方法上有所不同。
解决方案:用父类中的字段替换方法,并删除子类。
简化条件表达式随着时间的推移,条件的逻辑往往变得越来越复杂,还有更多的技术可以解决这个问题。
分解条件
问题:你有一个复杂的条件(if-then/else或switch)。
解决方案:将条件的复杂部分分解为单独的方法:条件、then和else。
合并条件表达式
问题:你有多个条件产生相同的结果或操作。
解决方案:将所有这些条件合并到一个表达式中。
合并重复的条件片段
问题:在条件语句的所有分支中都可以找到相同的代码。
解决方案:将代码移到条件之外。
移除控制标志
问题:有一个布尔变量充当多个布尔表达式的控制标志。
解决方案:使用break、continue和return代替变量。
使用守卫子句来代替嵌套的条件判断
问题:有一组嵌套的条件,很难确定代码执行的正常流程。
解决方案:将所有特殊检查和边界情况隔离到单独的子句中,并将其放在主要检查之前。理想情况下,你应该有一个条件列表,一个接一个。
用多态替换条件
问题:你有一个条件,根据对象类型或属性执行各种操作。