ノートの再構築-追加関数の導入
本文は学習中の総括で、転載を歓迎しますが、出典を明記してください.http://blog.csdn.net/pistolove/article/details/44313725
前の記事では「仲介者の除去」を紹介しています.本稿では,「印加関数の導入」という再構成手法を紹介する.
この再構築手法を学びましょう.
門を開けて山を見る.
発見:サービスを提供するクラスに関数を追加する必要がありますが、このクラスを変更することはできません.
解決:クライアント・クラスに関数を作成し、サーバ・クラスのインスタンスに最初のパラメータとして入力します.
動機
あなたはよくこのようなことに遭遇します:あなたは1つのクラスを使っていて、それはとても良くて、あなたのために多くの必要なサービスを提供しました.その後、新しいサービスを追加する必要がありますが、このクラスは供給できません.そこであなたは呪い始めました:どうしてこのことをすることができませんか?ソースコードを変更できれば、自分で新しい関数を追加することができます.できない場合は、クライアントで符号化し、その関数を補完しなければなりません.
この機能を一度だけ使用する必要がある場合は、追加の符号化も大したことではありません.もともとサービスを提供していたクラスさえ必要ないかもしれません.しかし、この関数を複数回使用する必要がある場合は、コードを繰り返さなければなりません.重複コードはソフトウェアの万悪の源であることを覚えておいてください.これらの重複するコードは、同じ関数に抽出されるべきです.この再構成を行う場合、関数を加えて機能を実現すると、この関数は本来サービスを提供するクラスで実現されるべきであるという明確な信号である.
サービスクラスに多数の追加関数が確立されているか、同じ追加関数が必要なクラスが多数あることが判明した場合は、この再構築ではなく「ローカル拡張の導入」を使用します.しかし、関数を追加するのは結局適切な方法であることを忘れないでください.可能であれば、これらの関数を理想の家に移すべきです.コード所有権のせいでこのような移動ができないので、追加関数をサービスクラスに渡し、サービスクラスでこの関数を実現するのを手伝ってください.
やり方
(1)お客様クラスに必要な機能を提供するための関数を作成します.(この関数は、顧客クラスのプロパティを呼び出すべきではありません.値が必要な場合は、その値をパラメータとして渡します)
(2)サービスクラスインスタンスをこの関数の最初のパラメータとする.
(3)この関数を「関数を追加します.サービスクラスで実装する必要があります」と注記します(これにより、後で変更があれば、これらの関数を簡単に見つけることができます).
例
プログラムでは、1つの料金サイクルを越える必要があります.元のコードは次のようになります.
付与演算の右側のコードを独立した関数に抽出できます.この関数はDateクラスの追加関数です.
本文は主に再構成手法である付加関数の導入を紹介した.この手法は比較的簡単で、簡単に理解できるので、ここでは邪魔になりません.
最後に、本文があなたに役に立つことを望んでいます.質問があったら伝言してください.ありがとうございます.(PS:次編ではノートの再構築--ローカル拡張を導入)
ノート記事の再構築
ノートの再構築——入門編
再構築ノート——コードの悪い味(上)
再構築ノート——コードの悪い味(下)
ノートの再構築――テスト体の構築
ノートの再構築——関数の抽出
ノートの再構築——インライン関数
ノートの再構築——インライン一時変数
ノートの再構築:一時変数の代わりにクエリーを使用
ノートの再構築-解釈変数の導入
ノートの再構築——一時変数の分解
ノートの再構築-パラメータへの割り当てを削除
ノートの再構築-関数の代わりに関数オブジェクト
ノートの再構築-置換アルゴリズム
ノートの再構築——移動関数
ノートの再構築-フィールドを移動
ノートの再構築——抽出類
ノートの再構築:クラスをインライン化
ノートの再構築——「依頼関係」を隠す
ノートの再構築-仲介者を削除
ノートの再構築-追加関数の導入
前の記事では「仲介者の除去」を紹介しています.本稿では,「印加関数の導入」という再構成手法を紹介する.
この再構築手法を学びましょう.
門を開けて山を見る.
発見:サービスを提供するクラスに関数を追加する必要がありますが、このクラスを変更することはできません.
解決:クライアント・クラスに関数を作成し、サーバ・クラスのインスタンスに最初のパラメータとして入力します.
//before
Date newStart = new Date(previous.getYear(),
previous.getYear(),previous.getYear() + 1);
//after
Date newStart = nextDay(previous);
private static Date nextDay(Date date){
//......
return new Date(date.getYear(),date.getMonth(),date.getDate() + 1)
}
動機
あなたはよくこのようなことに遭遇します:あなたは1つのクラスを使っていて、それはとても良くて、あなたのために多くの必要なサービスを提供しました.その後、新しいサービスを追加する必要がありますが、このクラスは供給できません.そこであなたは呪い始めました:どうしてこのことをすることができませんか?ソースコードを変更できれば、自分で新しい関数を追加することができます.できない場合は、クライアントで符号化し、その関数を補完しなければなりません.
この機能を一度だけ使用する必要がある場合は、追加の符号化も大したことではありません.もともとサービスを提供していたクラスさえ必要ないかもしれません.しかし、この関数を複数回使用する必要がある場合は、コードを繰り返さなければなりません.重複コードはソフトウェアの万悪の源であることを覚えておいてください.これらの重複するコードは、同じ関数に抽出されるべきです.この再構成を行う場合、関数を加えて機能を実現すると、この関数は本来サービスを提供するクラスで実現されるべきであるという明確な信号である.
サービスクラスに多数の追加関数が確立されているか、同じ追加関数が必要なクラスが多数あることが判明した場合は、この再構築ではなく「ローカル拡張の導入」を使用します.しかし、関数を追加するのは結局適切な方法であることを忘れないでください.可能であれば、これらの関数を理想の家に移すべきです.コード所有権のせいでこのような移動ができないので、追加関数をサービスクラスに渡し、サービスクラスでこの関数を実現するのを手伝ってください.
やり方
(1)お客様クラスに必要な機能を提供するための関数を作成します.(この関数は、顧客クラスのプロパティを呼び出すべきではありません.値が必要な場合は、その値をパラメータとして渡します)
(2)サービスクラスインスタンスをこの関数の最初のパラメータとする.
(3)この関数を「関数を追加します.サービスクラスで実装する必要があります」と注記します(これにより、後で変更があれば、これらの関数を簡単に見つけることができます).
例
プログラムでは、1つの料金サイクルを越える必要があります.元のコードは次のようになります.
Date newStart = new Date(previous.getYear(),
previous.getYear(),previous.getYear() + 1);
付与演算の右側のコードを独立した関数に抽出できます.この関数はDateクラスの追加関数です.
Date newStart = nextDay(previous);
private static Date nextDay(Date date){
//......
return new Date(date.getYear(),date.getMonth(),date.getDate() + 1)
}
本文は主に再構成手法である付加関数の導入を紹介した.この手法は比較的簡単で、簡単に理解できるので、ここでは邪魔になりません.
最後に、本文があなたに役に立つことを望んでいます.質問があったら伝言してください.ありがとうございます.(PS:次編ではノートの再構築--ローカル拡張を導入)
ノート記事の再構築
ノートの再構築——入門編
再構築ノート——コードの悪い味(上)
再構築ノート——コードの悪い味(下)
ノートの再構築――テスト体の構築
ノートの再構築——関数の抽出
ノートの再構築——インライン関数
ノートの再構築——インライン一時変数
ノートの再構築:一時変数の代わりにクエリーを使用
ノートの再構築-解釈変数の導入
ノートの再構築——一時変数の分解
ノートの再構築-パラメータへの割り当てを削除
ノートの再構築-関数の代わりに関数オブジェクト
ノートの再構築-置換アルゴリズム
ノートの再構築——移動関数
ノートの再構築-フィールドを移動
ノートの再構築——抽出類
ノートの再構築:クラスをインライン化
ノートの再構築——「依頼関係」を隠す
ノートの再構築-仲介者を削除
ノートの再構築-追加関数の導入