专业术语
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。
状况:客户直接调用Server Object的Delegate Class的Method,那么在Server端建立客户所需的函数Method,用以隐藏委托关系。
学过对象技术的人都知道,虽然php允许你将field声明为public,但你还应该隐藏field(private)。随着经验日渐丰富,有更多值得封装的东西。
看下面一个例子:
$person->getDepartment()->getManager() は明らかに、Xiaocai のリーダーを見つけたい場合は部門を通過する必要があることを明らかにしています。したがって、私たちがしなければならないのは部門を非表示にすることです。 ——カップリングを軽減できる。
仲介者を削除
状況: クラスに単純なデリゲートが多すぎる場合は、デリゲート クラスを直接呼び出します。
動機: Hide Delegate の例では、Department にさらに新しいメソッドがある場合、Delegate を非表示にするには、Delegate として使用する対応するメソッドを person に追加する必要があります。この時点で、その人は完全に仲介者になっています。この時点で、私たちは代表クラス部門に直接電話する必要があります。
リファクタリングの意味は、問題を解決する限り、決して「ごめんなさい」と言う必要はないということです。
外部メソッドの紹介
状況: PreviousEnd クラスにはクライアントが使用する必要がある追加の関数がありますが、この PreviousEnd クラスは変更できないため、クライアントで関数を作成し、PreviousEnd エンティティをパラメータとして受け取ります。
ローカル拡張機能を導入します
状況: クラスには追加の関数が必要ですが、現在のクラスを変更してから、これらの関数が含まれるように新しいクラスを作成することはできません。サブクラスまたはラッパーを使用します。 ——ソースコードを変更できない場合によく使われます。
上記の外部メソッドの導入の例を見てみましょう
サブクラスメソッドを使用する
「クラスの抽出」と「クラスのインライン化」、「デリゲートの非表示」と「中間者の削除」はすべて逆のプロセスであることに注意してください。具体的に理解するには、序文のフローチャートを参照してください。
「デリゲートの非表示」は少数の「デリゲート メソッド」を使用する場合によく使用され、「中間者の削除」は多数の「デリゲート メソッド」を呼び出す場合に使用されます。デリゲート クラスを直接使用して呼び出すことができます。状況に応じてデリゲートメソッドの一部を保持します。
「抽出クラス」と「インラインクラス」、「抽出クラス」は責任が多すぎて肥大化したクラスでよく使われ、「インラインクラス」は無責任すぎる現行クラスでよく使われます」を使用する場合。 ——個人的には「インラインクラス」よりも「抽出クラス」の方が好きです。