重构 对象之间搬移特性

Move Method

如果一个类中的方法与另一个类有很多的交流,那么我们就在另一个类中建立一个有类似功能的新函数,将旧函数变成一个单纯的Delegating Method, 或是将旧函数移除。


Move Field

 状况:你的class中的field被另一个class更多的用到。那么在另一个class里建立new field,修改旧的field。


Extract Class

状况:一个类做了两个类做的事,那么建立一个新Class,将相关的Field和Method从旧Class移到新Class


Inline Class

状况:你的某个Class没有做太多事情(没有承担足够责任),那么将Class的所有特性搬移到另一个Class中,然后移除原Class。
动机:Inline Class与Extract Class相反。——把Extract Class例子反过去,因为PhoneNumber只用作读取code和number。

Hide Delegate

状况:客户直接调用Server Object的Delegate Class的Method,那么在Server端建立客户所需的函数Method,用以隐藏委托关系。
学过面向对象技术的人都知道,虽然php允许你将field声明为public,但你还应该隐藏field(private)。随着经验日渐丰富,有更多值得封装的东西。看下面一个例子:


Remove Middle Man
状况:如果某个Class做了过多的Simple Delegate,那么我们就直接调用Delegate Class。
动机:在Hide Delegate中的例子里当Department有更多新方法的时候,我们为了Hide Delegate,就要必须在Person里添加相应的方法做Delegate之用。这时候的Person完全变成了一个Middle Man,此时我们就应该直接调用Delegate Class——Department。重构的意义就在于:你永远不必说对不起,只要你把出问题的地方修补好就行了。



Introduce Foreign Method

状况:有一个类Client需要使用的类PreviousEnd中一个额外函数,但你无法修改这个类PreviousEnd,那么你就在Client中建立一个函数,并以一个PreviousEnd实体做为参数。


Introduce Local Extention

状况:你的Class需要一些额外函数,但你不能修改当前的类,那么建立一个新Class,使它包含这些函数。使用Subclass 或 Wrapper。——这个一般用于你无法修改源码的情况下使用。

拿上面Introduce Foreign Method例子来说

 使用Subclass方法

 或使用Wrapper

总结

需要注意一下,“Extract Class”和“Inline Class”,”Hide Delegate“和”Remove Middle Man",都是相反的过程,具体理解,可以看前言中的那张流程图。
“Hide Delegate"我们常用于使用少量的”Delegate Method“的时候,而”Remove Middle Man“,用于调用很多”Delegate Method“的时候,我们可以直接使用Delegate Class,进行调用,而有的Delegate Method我们视情况保留一部分。
“Extract Class”和“Inline Class”,"Extract Class"经常用于承担那过多责任而变得臃肿不堪的Class中,而“Inline Class”经常用于当前的这个类”太不负责的“时候使用。——我个人是宁愿“Extract Class”,也不愿“Inline Class”。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值