现在的位置: 首页 > 综合 > 正文

一、重构,第一案例

2018年03月30日 ⁄ 综合 ⁄ 共 1441字 ⁄ 字号 评论关闭

       重构是这样一个过程:在不改变代码外在行为的前提下,对代码做出修改,以改进程序的内部结构。它的本质是在代码写好之后改进它的设计。

       重构的特点是可以无须在编码开始前进行良好的设计,编码完成后,可借由重构可将它加工成设计良好的代码。当然起初有个良好的设计,可以减少重构的工作量。

      重构之前的准备工作:搭建可靠的测试环境,需具有自检功能。

      重构的步骤或节奏是测试,小修改,测试,小修改,测试,小修改........。正是这种节奏让重构得以快速而安全地前进。

     要点:如果你发现自己需要为程序添加一个特性,而代码结构使你无法很方便地那么做,那就先重构那个程序,使特性的添加比较容易进行,然后再添加特性。

      这一章影片出租代码需改进的地方和改进方法:

     (1)statement()函数太长,做了很多原本应该由其它class完成的事情。方法:找出逻辑泥团,并运用Extract Method方法,将它提炼到独立函数,最后易名,好的代码应该清楚表达自己的功能,变量名称是代码清晰的关键,帮需易名。

     (2)观察amountFor()时,发现这个函数使用了来自Rental class的信息,却没有使用来自Customer class的信息,由于绝大多数情况下,函数应该放在它所使用的数据的所属对象(或说class)内,所以amountFor()应该移到Rental class去。方法:运行Move Method。

     (3)临时变量thisAmount如今变得多余了,它接爱each.getCharge()的执行结果,然后就不再有任何改变。方法:运用Replace Temp with Query把thisAmount除去。

     (4)由于可能多个地方用到totalAmount和frequentRentalPoints这两个临时变量,故提取这两个变量。方法:运用Replace Temp with Query,并利用所谓的query method来取代totalAmount和frequentRentalPoints。

     (5)在getcharge()函数中,在movice class的属性基础上运用switch语句,这暗示getcharge()应该移到Movie class里头去,为了让它得以运行,必须把[租期长度]作为参数传递进去。当然,[租期长度]来自Rental对象。这就有一个疑问:为什么选择[将租期长度传给Movie对象]而不是[将影片类型传给Rental对象]呢?因为该系统可能发生的变化是加入新影片类型,这种变化带有不稳定倾向。如果影片类型有所变化,希诅掀起最小的涟漪,所以我选择有Movie对象内计算费用。方法:运行Move
Method。

     (6)存在多数影片类型,它们以不同的方式回答相同的问题,这听起来像是subclasses的工作。方法:运用多态来取代switch语句。这有个问题:影片在生命周期内可能改变类型,但Movie对象在生命周期内是不可改变类型的,故引入state模式加入一层间接件,在Price的子类进行与影片类型相关的动作,这汲及三个重构准则:首先运用Replace Type Code with State/Strategy,将[与类型相依的行为]搬移至state模式内。然后运用Move Method将switch语句移到Price
class里头。最后运用Replace Conditional with Polmorphism去掉switch语句。

抱歉!评论已关闭.