一時変数の代わりにクエリを実行するためのノートの再構築


本文は学習中の総括で、転載を歓迎しますが、出典を明記してください.http://blog.csdn.net/pistolove/article/details/42386305
        前の記事では「 一時変数をインラインします.ここでは、「一時変数の代わりにクエリーを使用する」という再構築手法について説明します.
        この再構築手法を学びましょう.
門を開けて山を見る.
        発見:あなたのプログラムは一時変数で式の演算結果を保存します.
        解決:この式を独立した関数に抽出します.この一時変数のすべての参照点を新しい関数の呼び出しに置き換えます.
	//   
	double basePrice = _quantity * _itemPrice;
	if(basePrice > 5000)
		return basePrice * 0.95;
	else
		return basePrice * 0.98;
	//   
	if(basePrice() > 5000)
		return basePrice() * 0.95;
	else
		return basePrice() * 0.98;
	...
	
	double basePrice(){
		 return  _quantity * _itemPrice;
	}

動機
        一時変数は一時的であり、所属する関数でのみ使用できることはよく知られています.これにより、必要な一時変数にアクセスできるため、より長い関数を書くことができます.一時変数をクエリーに置き換えると、同じクラスのすべての関数がこの情報を取得できます.これにより、非常に役立ちます.このクラスのためにより明確なコードを作成します.
        この再構築方法は、抽出関数を使用する前に不可欠なステップです.ローカル変数はコードの抽出を困難にするため、できるだけクエリー式に置き換える必要があります.簡単な場合は、一時変数が1回のみ付与されるか、一時変数に付与される式が他の条件の影響を受けません.
やり方
        簡単な場合:
(1)代入順のみの一時変数を探し出す(複数回使用される場合は,それを複数の変数に分割することを考慮し,後続の再構成方法に対応する).
(2)この一時変数をfinalとして宣言する.
(3)コンパイル(この一時変数が確実に1回のみ付与されていることを確認する)
(4)「一時変数に値を割り当てる」文の右側の部分を独立した関数に抽出します.(まずprivateとして関数を宣言します.後で使用する必要がある箇所がたくさんあるかもしれませんが、保護を緩和するのも簡単です.抽出した関数に副作用がないことを確認します.つまり、関数がオブジェクトの内容を変更しないことを確認します).
(5)コンパイル、テスト.
(6)この一時変数に対して「インライン一時変数」再構成方法を実施する.
        一時変数を使用してループ内の累積情報を保存することがよくあります.この場合、ループ全体が独立した関数として抽出され、元の関数の数行のループ論理コードを減らすことができます.この手法の使用は、パフォーマンスの問題を心配させる可能性があります.他のパフォーマンスの問題と同じように、十中八九はまったくありません.いかなる影響も与えます.本当に問題が発生しても、最適化の時期に解決することができます.コードの組織が良好であれば、より効果的な最適化案を見つけることができます.再構築がなければ、良い最適化案はあなたと手を失う可能性があります.

        簡単な関数から始めます.
//   
double getPrice() {
	int basePrice = _quantity * _itemPrice;
	double discountFactor;
	if (basePrice > 5000)
		discountFactor = 0.95;
	else
		discountFactor = 0.98;
	return basePrice * discountFactor;
}

        私たちはその中の2つの一時変数を削除したいと思っています.もちろん、毎回処理します.
        コードは簡単ですが、一時変数をfinalとして宣言し、一度だけ付与されているかどうかを確認する必要があります.
double getPrice() {
	final int basePrice = _quantity * _itemPrice;
	final double discountFactor;
	if (basePrice > 5000)
		discountFactor = 0.95;
	else
		discountFactor = 0.98;
	return basePrice * discountFactor;
}

        このように、問題が発生するとコンパイラは警告します.これは、一時的な不安交差点が一度だけ割り当てられているわけではないので、この再構築を行うべきではありません.
        次は一時変数を置き換えて、毎回1つ、焦らないで、順番に仕事をします.
        まず、付与動作の右側の式を抽出します.
double getPrice() {
	final int basePrice = basePrice();
	final double discountFactor;
	if (basePrice > 5000)
		discountFactor = 0.95;
	else
		discountFactor = 0.98;
	return basePrice * discountFactor;
}

private double basePrice() {
	return _quantity * _itemPrice;
}

        次に、コンパイルしてテストし、インライン一時変数の使用を開始します.
        まず、一時変数basePriceの最初の参照点を置き換えます.
double getPrice() {
	final int basePrice = basePrice();
	final double discountFactor;
	if (basePrice() > 5000)
		discountFactor = 0.95;
	else
		discountFactor = 0.98;
	return basePrice * discountFactor;
}

        コンパイル、テストを行い、次に進みます.次は最後の参照点であるため、basePrice一時変数の宣言式を一括して削除します.
double getPrice() {
	final double discountFactor;
	if (basePrice() > 5000)
		discountFactor = 0.95;
	else
		discountFactor = 0.98;
	return basePrice()  * discountFactor;
}

        basePriceが完了したら、discountFactor()を同様の方法で抽出します.
double getPrice() {
	final double discountFactor = discountFactor() ;
	return basePrice()  * discountFactor;
}

private double discountFactor(){
	if (basePrice() > 5000)
		return 0.95;
	else
		return 0.98;
}

        一時変数basePriceをクエリー式に置き換えないと、discountFactor()を抽出するのがどんなに難しいかがわかります.
        最終的にgetPrice()は次のようになります.
//   
double getPrice() {
	return basePrice()  * discountFactor();
}

 
       本稿では、一時変数の代わりにクエリーを行う再構築手法を紹介します.再構築によってコードがかなり簡潔になり、コードの意図もはっきりしてきました.コードに問題が発生すると、修正も簡単になります.コードが短くてはっきりしているからです.あなたも徐々に再構築が好きになったのではないかと思います.もしそうなら、一緒に勉強して、進歩して、コードをきれいにしましょう!
        最後に、本文があなたに役立つことを望んでいます.問題があれば、伝言してください.ありがとうございます.(PS:次編では、ノートの再構築を紹介します.解釈変数を導入します)
ノートを再構築する文章は以下の通りです.
       ノートの再構築——入門編
       再構築ノート——コードの悪い味(上)
       再構築ノート——コードの悪い味(下)
       ノートの再構築――テスト体の構築
       ノートの再構築——関数の抽出
       ノートの再構築——インライン関数
       ノートの再構築——インライン一時変数