索引:
ø move method(搬移函数)
ø move field (搬移值域)
ø extract class (提炼类)
ø inline class (将类内联化,就是把当前的类合并到其他类中)
ø hide delegate (隐藏委托关系)
ø remove middle man ( 移除中间人)
ø introduce foreign method (引入外加函数)
ø introduce local extension (引入本地扩展)
介绍
承接上文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。
动机:在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”。
【说明】:本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:)!