重构——32以State/Strategy取代类型码(Replace Type Code with State/Strategy)

以State/Strategy取代类型码(Replace Type Code with State/Strategy)

你有一个类型码,它会影响到类的行为,但是你无法通过继承手法消除它;以状态对象取代类型码

一、动机

本项重构与Replace Type Code with Subclass很相似,但如果“类型码的值在对象生命期中发生变化”或“其他原因使得宿主类不能被继承”,你可以使用本重构,本重构使用State模式或者Strategy模式

二、做法

1、使用Self Encapsulate Field将类型码自我封装起来

2、新建一个类,根据类型码的用途为它命名。这就是一个状态对象

3、为这个新类添加子类,每个子类对应一种类型码

4、在超类中建立一个抽象的查询函数,用以返回类型码。每个子类中覆盖该函数,返回确切的类型码

5、编译

6、在源类中建立一个字段,用以保存新建的状态对象

7、调整源类中负责查询类型码的函数,将查询动作转发给状态对象

8、调整源类中为类型码设值的函数,将一个恰当的状态对象子类赋值给“保存状态对象”的那个字段

时间: 2024-09-29 00:00:02

重构——32以State/Strategy取代类型码(Replace Type Code with State/Strategy)的相关文章

重构——31以子类取代类型码(Replace Type Code with SubClass)

以子类取代类型码(Replace Type Code with SubClass) 你有一个不可变的类型码,它会影响类的行为:以子类取代这个类型码 一.动机 1.借助多态来处理变化行为,标志就是switch if-then-else 2.把对不同类行为的了解从类用户那儿转移到了类自身 二.做法 1.使用Self Encapsulate Field将类型码自我封装起来 2.为类型码的每一个数值建立一个相应的子类.在每个子类中覆写类型码的取值函数,使其返回相应的类型码值 3.每建立一个新的子类,编译

重构——30以类取代类型码(Replace Type Code with Class)

以类取代类型码(Replace Type Code with Class) 类之中有一个数值类型码,但它并不影响类的行为:以一个新的类替换该数值类型码 一.动机 让编译器可以进行类型检查,减少bug 二.做法 1.为类型码建立一个类 2.修改源类实现,并让它使用上述新建的类 3.编译,测试 4.对于源类中每一个使用类型码的函数,相应建立一个函数,让新函数使用新建的类 5.逐一修改源类用户,让它们使用新接口 6.每修改一个用户,编译并测试 7.删除使用类型码的新接口,并删除保存旧类型码的静态变量

重构——53以工厂函数取代构造函数(Replace Constructor with Factory Method)

以工厂函数取代构造函数(Replace Constructor with Factory Method) 你希望在创建对象时不仅仅是做简单的构造动作:将构造函数替换为工厂函数 一.动机 在派生子类的时候以工厂函数取代类型码 二.做法 1.新建一个工厂函数,让它调用现有的构造函数 2.将调用构造函数的代码改为调用工厂函数 3.每次替换后,编译并测试 4.将构造函数声明为private 5.编译

重构——47以明确函数取代参数(Replace Parameter with Explicit Methods)

以明确函数取代参数(Replace Parameter with Explicit Methods) 你有一个函数,其中完全取决于参数值而采取不同的行为:针对该参数的每一个可用值,建立一个独立函数 一.动机 1.根据不同参数值作出不同的行为,那么就应该使用本项重构 2.接口更加清楚 二.做法 1.针对参数的每一种可能性,新建一个明确函数 2.修改表达式的每个分支,使其调用合适的新函数 3.修改每个分支后,编译并测试 4.修改原函数的每一个被调用点,改而调用上述的某个合适的新函数 5.编译,测试

重构——8以函数对象取代函数(Replace Method with Method Object)

以函数对象取代函数(Replace Method with Method Object) 有一个大型函数,其中对局部变量的使用使你无法采用Extract Method.将这个函数放进一个单独的对象里中,如此一来局部变量就成了对象内的字段,然后你就可以在同一个对象中将这个大型函数分解为多个小型函数 一.动机 1.小函数优美动人,只要将相对独立的代码从大型函数中提炼出来,就可以大大提高代码的可读性 2.局部变量的存在会增加函数分解难度.如果一个函数之中局部变量泛滥成灾,那么想分解这个函数是非常困难的

重构——29以数据类取代记录(Replace Record with Data Class)

以数据类取代记录(Replace Record with Data Class) 你需要面对传统编程环境中的记录结构:为该记录创建一个"哑"数据对象 一.动机 把记录型结构带进面向对象的程序中 二.做法 1.新建一个类,表示这个结构 2.对于记录中的每一项数据,在新建的类中建立一个对应的private字段,并提供相应的取值/设置函数

.NET重构(类型码的设计、重构方法)

阅读目录: 1.开篇介绍 2.不影响对象中的逻辑行为(枚举.常量.Entity子类来替代类型码) 3.影响对象中的逻辑行为(抽象出类型码,使用多态解决) 4.无法直接抽象出类型码(使用策略模式解决) 1]开篇介绍 说到类型码,我们都会很有印象,在某个Entity内部多多少少会出现一两个类型码来表示当前Entity在某个抽象角度属于哪一种层面,比如在EmployeeEntity中,基本上会有一个表示性别的Sex的属性,同时Sex属性的最终保存是在某个sex字段中的,它就是很典型的类型码元素:Sex

重构——22以对象取代数组(Replace Array with Object)

以对象取代数组(Replace Array with Object) 你有一个数组,其中的元素各自代表不同的东西:以对象替换数组.对于数组中的每个元素,以一个字段来表示 一.动机 数组应该只用于"以某种顺序容纳一组相似对象" 二.做法 1.新建一个类表示数组所拥有的信息,并在其中以一个public字段保存原先的数组 2.修改数组的所有用户,让它们改用新类的实例 3.编译,测试 4.逐一为数组元素添加取值/设值函数.根据元素的用途,为这些访问函数命名.修改客户端代码,让它们通过访问函数取

重构——33以字段取代子类(Replace Subclass with Fields)

以字段取代子类(Replace Subclass with Fields) 你的各个子类的唯一差别只在"返回常量数据"的函数上:修改这些函数,使他们返回超类的某个新增字段,然后销毁子类 一.动机 1.建立子类的目的,是为了增加新特性或变化其行为 2.子类中只有常量函数,实在没有足够的存在价值 二.做法 1.对所有子类使用Replace Constructor with Factory Method 2.如果有任何代码直接引用子类,令它改而引用超类 3.针对每个常量函数,在超类中声明一个