改善既有代码的设计》之二 对象之间搬移特性

改善既有代码的设计》之二 对象之间搬移特性

索引:

(搬移函数)

(搬移值域)

(提炼类)

(将类内联化,就是把当前的类合并到其他类中)

(隐藏委托关系)

( 移除中间人)

(引入外加函数)

(引入本地扩展)

 

 介绍

 

 承接上文PHP 杂谈《重构-改善既有代码的设计》之 重新组织你的函数 ,继续说重构方面的内容。

 


 专业术语

 

delegate:委托

encapsulate:封装

introduce:引入

wrapper:覆盖

 

 前言

 

”决定把责任放在哪里“——运用重构改变原先的设计。

 

改善既有代码的设计》之二 对象之间搬移特性

解释:

  1、Class承担过多而臃肿不堪——Extract Class将一部分责任分离出去。

  2、Class没有承担足够多的责任,不再有单独存在的理由——Inline Class将它融入另一个Class。

  3、Class使用另一个Class——Hide Delegate隐藏关系。

  4、承接(3),如果Client通过Middle Man 调用很多的Delegate Class的函数(这里只是简单调用,只做跳转,而Middle Man没有做太多的业务逻辑,如10个Delegate Class中的Method对应10个Middle Man的Method)——Remove Middle Man,直接使用Delegate Class,可以部分使用Delegate Method。

 Move Method

 

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

改善既有代码的设计》之二 对象之间搬移特性

改善既有代码的设计》之二 对象之间搬移特性

类图:

改善既有代码的设计》之二 对象之间搬移特性

动机:

  1、如果一个类与另一个类有高度耦合,我就会Move Method。——class更简单,更干净利落的实现系统交付的任务。

  2、移动一些值域,就要检查是否使用另一个类的次数必使用所驻对象的次数还多。

 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)。随着经验日渐丰富,有更多值得封装的东西。

 

看下面一个例子:

改善既有代码的设计》之二 对象之间搬移特性

 

 $person->getDepartment()->getManager()明显揭露了,要想找到Xiaocai的领导,必须要经过department,所以我们要做的事隐藏department。——可以减少耦合性。

 

改善既有代码的设计》之二 对象之间搬移特性

 Remove Middle Man

 

状况:如果某个Class做了过多的Simple Delegate,那么我们就直接调用Delegate Class。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/5395f960b5ad7f73c077317e14b4c2b8.html