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

以子类取代类型码(Replace Type Code with SubClass)

你有一个不可变的类型码,它会影响类的行为;以子类取代这个类型码

一、动机

1、借助多态来处理变化行为,标志就是switch if-then-else

2、把对不同类行为的了解从类用户那儿转移到了类自身

二、做法

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

2、为类型码的每一个数值建立一个相应的子类。在每个子类中覆写类型码的取值函数,使其返回相应的类型码值

3、每建立一个新的子类,编译并测试

4、从超类中删除掉保存类型码的字段,将类型码访问函数声明为抽象函数

5、编译,测试

时间: 2024-11-08 19:31:34

重构——31以子类取代类型码(Replace Type Code with SubClass)的相关文章

重构——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

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

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

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

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

重构——67以委托取代继承(Replace Inheritance with Delegation)

以委托取代继承(Replace Inheritance with Delegation) 1.某个子类只使用了超类接口中的一部分,或是根本不需要继承而来的数据 2.在子类中新建一个字段用以保存超类:调整子类函数,令它改而委托超类:然后去掉两者之间的继承关系 一.动机 超类中的许多操作并不真正适用于子类 二.操作 1.在子类中新建一个字段,使其引用超类的一个实例,并将它初始化为this 2.修改子类内的所有函数,让它们不再使用超类,转而使用上述那个受托字段.每次修改后,编译并测试 3.去除两个类之

重构——68以继承取代委托(Replace Delegation with Inheritance)

以继承取代委托(Replace Delegation with Inheritance) 你在两个类之间使用委托关系,并经常为整个接口编写许多极简单的委托关系:让委托类继承受托类 一.动机 需要受托类中的所有函数 二.做法 1.让委托端成为受托端的一个子类 2.编译 3.将受托字段设为该字段所处对象本身 4.去掉简单的委托函数 5.编译并测试 6.将所有其它涉及委托关系的代码,改为调用对象自身 7.移除受托字段

重构——49以函数取代参数(Replace Parameter with Methods)

以函数取代参数(Replace Parameter with Methods) 对象调用某个参数,并将结果作为参数,传递给另一个函数,而接受该参数的函数本身也能够调用前一个函数:让参数接受者去除该项参数,并直接调用前一个参数 一.动机 如果函数可以通过其他途径获得参数值,那么它就不应该通过参数取得该值 二.做法 1.如果有必要,将参数的计算过程提炼到一个独立的函数中 2.将函数本体内引用该参数的地方改为调用新建的函数 3.每次替换后,编译并测试 4.全部替换完成后,使用Remove Parame

重构——56以测试取代异常(Replace Exception with Test)

以测试取代异常(Replace Exception with Test) 面对一个调用者可以预先检查的条件,你抛出了一个异常:修改调用者,使它在调用函数之前先做检查 一.动机 异常只应该被用于异常的,罕见的行为,也就是那些产生意料之外错误的行为,而不应该成为条件检查的替代品 二.做法 1.在函数调用点之前,放置一个测试语句,将函数内catch区段中的代码复制到测试句的适当的if分支中 2.在catch区段起始处加入一个断言,确保catch区段绝对不会被执行 3.编译,测试 4.移除所有的catc

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

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

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

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