您的位置:首页 > 其它

重构手法31:Replace Type Code with Subclass (以子类取代类型码)

2010-08-05 15:50 417 查看
你有一个不可变的类型码,它会影响类的行为。以子类取代这个类型码。

动机:如果你面对的类型码不会影响宿主类的行为,可以使用Replace Type Code with Class (以类取代类型码)来处理它们。但如果类型码会影响宿主类的行为,那么最后的办法就是借助多态来处理变化行为。

一般来说,这种情况的标志就是像switch这样的条件表达式。这种条件表达式可能有2种表现形式:switch语句或者if –then-else结构。不论哪种形式,它们都是检查类型码值,并根据不同的值执行不同的动作。这种情况下,你应该以 Replace Conditional with Polymorphism (以多态取代条件表达式)进行重构。但为了那个顺利进行那样的重构,首先应该将类型码替换为可拥有多态行为的继承体系。这样一个继承体系应该以类型码宿主类为基类,并针对每一种类型码建立一个子类。

但是以下2种情况你不能那么做1)类型码值在对象创建之后发生了变化;2)由于某种原因,类型码宿主类已经有了子类。如果你恰好面临这2种情况之一,就需要运用 Replace Type Code with StateStrategy (以状态策略取代类型码)。

Replace Type Code with Subclass (以子类取代类型码)的主要作用其实是搭建一个舞台,让Replace Conditional with Polymorphism (以多态取代条件表达式)得以一展身手。如果宿主类中并没有出现条件表达式,那么Replace Type Code with Class (以类取代类型码)更合适,风险也较低。

使用Replace Type Code with Subclass (以子类取代类型码)的另一个原因是,宿主类中出现了“只与具备特定类型码之对象相关”的特性。完成本项重构后,你可以使用 push down Method (函数下移)和push down field (字段下移)将这些特性推到合适的子类中去,以彰显它们只与特定情况相关这一事实。

Replace Type Code with Subclass (以子类取代类型码)的好处在于:它把“对不同行为的了解”从类用户那转移到了类自身。如果需要再加入新的行为变化,只需要添加一个子类就行了。如果没有多态机制,就必须找到所有条件表达式,并逐一修改它们。因此,如果为了还有可能加入新行为,这项重构将特别有价值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: