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

 

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

动机:如果你面对的类型码不会影响宿主类的行为,可以使用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 (以子类取代类型码)的好处在于:它把“对不同行为的了解”从类用户那转移到了类自身。如果需要再加入新的行为变化,只需要添加一个子类就行了。如果没有多态机制,就必须找到所有条件表达式,并逐一修改它们。因此,如果为了还有可能加入新行为,这项重构将特别有价值。

 

转载于:https://www.cnblogs.com/matchcolor/archive/2010/08/05/1786414.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值