重构 对象之间搬移特性

Move Method

如果一个类中的方法与另一个类有很多的交流,那么我们就在另一个类中建立一个有类似功能的新函数,将旧函数变成一个单纯的Delegating Method, 或是将旧函数移除。
重构 对象之间搬移特性_第1张图片

重构 对象之间搬移特性_第2张图片

Move Field

 状况:你的class中的field被另一个class更多的用到。那么在另一个class里建立new field,修改旧的field。
重构 对象之间搬移特性_第3张图片

重构 对象之间搬移特性_第4张图片

Extract Class

状况:一个类做了两个类做的事,那么建立一个新Class,将相关的Field和Method从旧Class移到新Class
重构 对象之间搬移特性_第5张图片

重构 对象之间搬移特性_第6张图片

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)。随着经验日渐丰富,有更多值得封装的东西。看下面一个例子:
重构 对象之间搬移特性_第7张图片

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

重构 对象之间搬移特性_第10张图片

Introduce Foreign Method

状况:有一个类Client需要使用的类PreviousEnd中一个额外函数,但你无法修改这个类PreviousEnd,那么你就在Client中建立一个函数,并以一个PreviousEnd实体做为参数。
重构 对象之间搬移特性_第11张图片

重构 对象之间搬移特性_第12张图片

Introduce Local Extention

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

拿上面Introduce Foreign Method例子来说
重构 对象之间搬移特性_第13张图片
 使用Subclass方法
重构 对象之间搬移特性_第14张图片
 或使用Wrapper
重构 对象之间搬移特性_第15张图片

总结

需要注意一下,“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”。


 

你可能感兴趣的:(对象)