《重构》中有点不清楚的两个手法
时间:2010-09-25 来源:rangzee
感觉“以子类取代型别码”和“值域取代子类”应该是一个互为逆向的重构手法,不过书中没有这么说,所以只能瞎猜了,盼高人拍砖指正。
下面是本人总结的两类手法的对比:
以子类取代型别码 Replace Type Code with Subclasses 源类情况:私有成员保存型别码
构造函数中指定型别码以创建相应对象
重构结果:无需保存型别码
子类根据工厂函数指定的型别码而创建
子类有函数返回硬编码的型别码
父类提供一个用于返回硬编码的型别码的抽像函数
各子类实现返回硬编码型别码的抽像函数返回的硬编码常量值不同 以值域取代子类 Replace Subclasses with Fields 源类情况:子类返回硬编码的常量值(其实也是型别码)
父类提供抽像函数
各子类的唯一差别只是返回常量值不同
重构结果:在父类中保存的常量值(其实也是型别码)
子类被全部删除
父类中提供以子类名字命名的工厂函数
工厂函数可以创建保存了旧子类常量(型别码)的对象(根据型别码对应原来的子类) 感觉示例只是一个声明了型别码的静态变量,另一个直接硬编码而已,没其它区别,而且重构结果直接硬编码的工厂函数,也可以重构为“声明型别码的静态变量”,感觉真是一样了。
以子类取代型别码 Replace Type Code with Subclasses 源类情况:私有成员保存型别码
构造函数中指定型别码以创建相应对象
重构结果:无需保存型别码
子类根据工厂函数指定的型别码而创建
子类有函数返回硬编码的型别码
父类提供一个用于返回硬编码的型别码的抽像函数
各子类实现返回硬编码型别码的抽像函数返回的硬编码常量值不同 以值域取代子类 Replace Subclasses with Fields 源类情况:子类返回硬编码的常量值(其实也是型别码)
父类提供抽像函数
各子类的唯一差别只是返回常量值不同
重构结果:在父类中保存的常量值(其实也是型别码)
子类被全部删除
父类中提供以子类名字命名的工厂函数
工厂函数可以创建保存了旧子类常量(型别码)的对象(根据型别码对应原来的子类) 感觉示例只是一个声明了型别码的静态变量,另一个直接硬编码而已,没其它区别,而且重构结果直接硬编码的工厂函数,也可以重构为“声明型别码的静态变量”,感觉真是一样了。
相关阅读 更多 +