ホームページ  >  記事  >  バックエンド開発  >  最適化関数の構成の詳細_PHPチュートリアル

最適化関数の構成の詳細_PHPチュートリアル

WBOY
WBOYオリジナル
2016-07-20 10:57:03880ブラウズ

以下にいくつかの最適化関数を紹介します:

1. Extractメソッド(抽出関数)

説明:

関数のコードが非常に長いことがわかった場合、この関数は次のことを行う可能性があります。多くの場合、関数内にコメントがあるかどうかを確認してください。多くの場合、コメントは次のコード部分が何を行うかを説明するものです。これを行うことの利点は次のとおりです。 -明らかです。Yu は、オブジェクト指向の 5 つの基本原則のうち、比較的長い関数を小さな関数に分割することで、コードの再利用を容易にします。インパルション後:

<ol class="dp-c">
<li class="alt"><span><span class="keyword">public</span><span> void Print(Employee employee)   </span></span></li>
<li><span>{   </span></li>
<li class="alt">
<span class="comment">//print employee's information  </span><span> </span>
</li>
<li>
<span>Console.WriteLine(</span><span class="string">"Name:"</span><span> + employee.Name);   </span>
</li>
<li class="alt">
<span>Console.WriteLine(</span><span class="string">"Sex:"</span><span> + employee.Sex);   </span>
</li>
<li>
<span>Console.WriteLine(</span><span class="string">"Age:"</span><span> + employee.Age);   </span>
</li>
<li class="alt">
<span class="comment">//print employee's salary  </span><span> </span>
</li>
<li>
<span>Console.WriteLine(</span><span class="string">"Salary:"</span><span> + employee.Salary);   </span>
</li>
<li class="alt">
<span>Console.WriteLine(</span><span class="string">"Bonus:"</span><span> + employee.Bonus);   </span>
</li>
<li><span>}  </span></li>
</ol>

2. インラインメソッド (関数をインライン化)

説明:

一部の関数は 1 行または 2 行だけであり、この時点ではコードの意図も非常に明白です。オブジェクト内のメソッドが多すぎると不快に感じます。
Before impulse:

<ol class="dp-c">
<li class="alt"><span><span class="keyword">public</span><span> void Print(Employee employee)   </span></span></li>
<li><span>{   </span></li>
<li class="alt">
<span class="comment">//print employee's information  </span><span> </span>
</li>
<li><span>PrintInfo(employee);   </span></li>
<li class="alt">
<span class="comment">//print employee's salary  </span><span> </span>
</li>
<li><span>PrintSalary(employee);   </span></li>
<li class="alt"><span>}   </span></li>
<li>
<span class="keyword">public</span><span> void PrintInfo(Employee employee)   </span>
</li>
<li class="alt"><span>{   </span></li>
<li>
<span>Console.WriteLine(</span><span class="string">"Name:"</span><span> + employee.Name);   </span>
</li>
<li class="alt">
<span>Console.WriteLine(</span><span class="string">"Sex:"</span><span> + employee.Sex);   </span>
</li>
<li>
<span>Console.WriteLine(</span><span class="string">"Age:"</span><span> + employee.Age);   </span>
</li>
<li class="alt"><span>}   </span></li>
<li>
<span class="keyword">public</span><span> void PrintSalary(Employee employee)   </span>
</li>
<li class="alt"><span>{   </span></li>
<li>
<span>Console.WriteLine(</span><span class="string">"Salary:"</span><span> + employee.Salary);   </span>
</li>
<li class="alt">
<span>Console.WriteLine(</span><span class="string">"Bonus:"</span><span> + employee.Bonus);   </span>
</li>
<li><span>}  </span></li>
</ol>

After。 impulse:

<ol class="dp-c">
<li class="alt"><span><span class="keyword">public</span><span> bool IsDeserving(int score)   </span></span></li>
<li><span>{   </span></li>
<li class="alt">
<span class="keyword">return</span><span> IsScoreMoreThanSixty(score);   </span>
</li>
<li><span>}   </span></li>
<li class="alt">
<span class="keyword">public</span><span> bool IsScoreMoreThanSixty(int score)   </span>
</li>
<li><span>{   </span></li>
<li class="alt">
<span class="keyword">return</span><span> (score > 60);   </span>
</li>
<li><span>}  </span></li>
</ol>

3. Inline Temp (インライン一時変数)

説明:

関数の戻り値を表すために使用される一時変数 (Temp) がある場合、一般的に、このアプローチは適切です。ただし、この一時変数が本当に冗長である場合、この一時変数が他の再構築作業を妨げる場合でも、この一時変数をインライン化する必要があります。関数の長さを減らすと、他の再構築作業がよりスムーズに進む場合があります。
インパルス前:

<ol class="dp-c">
<li class="alt"><span><span class="keyword">public</span><span> bool IsDeserving(int score)   </span></span></li>
<li><span>{   </span></li>
<li class="alt">
<span class="keyword">return</span><span> (score > 60) ;   </span>
</li>
<li><span>}  </span></li>
</ol>

インパルス後:

<ol class="dp-c">
<li class="alt"><span><span>int salary = employee.Salary;   </span></span></li>
<li>
<span class="keyword">return</span><span> (salary > 10000);  </span>
</li>
</ol>

説明:

プログラムには一時変数 (Temp) があります。特定の式を保存するには 式の計算結果を独立した関数 (つまり Query) に抽出し (Extract)、この一時変数が呼び出されたすべての箇所を新しい関数 (Query) の呼び出しに置き換えます。この関数は他の関数でも使用できます。その利点は、関数の長さを短縮し、コードの再利用率を高め、さらにコードの再構築を容易にすることです。また、ローカルであるため、クエリによる置換は多くの場合必須のステップであることに注意してください。コードを洗練するのは簡単ではないため、同様のリファクタリングの前にクエリに置き換えることができます。次の例は、Replace Temp With Query を使用する必要はありませんが、主に Temp を Query に置き換える方法を示しています。 Impulse" 前の関数には totalPrice を使用するコード ブロックが多数ありました。ある日突然、この関数が長すぎることに気付きました。このコード ブロックを別の関数に洗練する必要があるため、totalPrice = 価格 * 数値を入力する必要がありました。 ; into 抽出された各関数で、クエリ式が大量の計算を必要とする場合、この問題は発生しません。 :

<ol class="dp-c">
<li class="alt"><span><span class="keyword">return</span><span> (employee.Salary > 10000);   </span></span></li>
<li><span>Replace Temp With Query (用查询式代替临时变量) </span></li>
</ol>

After impulse:

<ol class="dp-c">
<li class="alt"><span><span class="keyword">public</span><span> double FinalPrice(double price, int num)   </span></span></li>
<li><span>{   </span></li>
<li class="alt"><span>double totalPrice = price * num;   </span></li>
<li>
<span class="keyword">if</span><span> (totalPrice > 100)   </span>
</li>
<li class="alt">
<span class="keyword">return</span><span> totalPrice * 0.8;   </span>
</li>
<li>
<span class="keyword">else</span><span>   </span>
</li>
<li class="alt">
<span class="keyword">return</span><span> totalPrice * 0.9;   </span>
</li>
<li><span>}  </span></li>
</ol>

5. 説明変数の導入 (わかりやすい変数の導入)

説明:

条件論理式では、多くの条件がその意味を理解するのを難しくします、なぜこれを満たしますか?条件がわかりません。説明変数の導入を使用して各条件節を抽出し、適切な一時変数名を使用して条件節の意味を表現できます。

その利点は、プログラムの可読性が向上することです。 impulse:

<ol class="dp-c">
<li class="alt"><span><span class="keyword">public</span><span> double FinalPrice(double price, int num)   </span></span></li>
<li><span>{   </span></li>
<li class="alt">
<span class="keyword">if</span><span> (TotalPrice(price, num) > 100)   </span>
</li>
<li>
<span class="keyword">return</span><span> TotalPrice(price, num) * 0.8;   </span>
</li>
<li class="alt">
<span class="keyword">else</span><span>   </span>
</li>
<li>
<span class="keyword">return</span><span> TotalPrice(price, num) * 0.9;   </span>
</li>
<li class="alt"><span>}   </span></li>
<li>
<span class="keyword">public</span><span> double TotalPrice(double price, int num)   </span>
</li>
<li class="alt"><span>{   </span></li>
<li>
<span class="keyword">return</span><span> price * num;   </span>
</li>
<li class="alt"><span>}  </span></li>
</ol>
impulse 後:

<ol class="dp-c">
<li class="alt"><span><span class="keyword">if</span><span>((operateSystem.Contains(</span><span class="string">"Windows"</span><span>))&&   (browser.Contatins(</span><span class="string">"IE"</span><span>)))     </span></span></li>
<li><span>{    </span></li>
<li class="alt">
<span> </span><span class="comment">//do something   </span><span> </span>
</li>
<li><span>} </span></li>
</ol>

6. 一時変数の分割 (一時変数の削除)

説明:

たとえば、関数の上のコードに一時変数があります。は長方形の周囲を表し、関数の下に領域が割り当てられています。つまり、この一時変数は複数回割り当てられており、各割り当てに独立した一時変数を割り当てる必要があります。変数は 1 つの数量のみを表す必要があります。そうでないと、コード リーダーが混乱します。

インパルス前:

<ol class="dp-c">
<li class="alt"><span><span>bool isWindowsOS = operateSystem.Contains(</span><span class="string">"Windows"</span><span>);   </span></span></li>
<li>
<span>bool isIEBrowser = browser.Contatins(</span><span class="string">"IE"</span><span>);   </span>
</li>
<li class="alt">
<span class="keyword">if</span><span> (isWindowsOS && isIEBrowser)   </span>
</li>
<li><span>{   </span></li>
<li class="alt">
<span class="comment">//do something  </span><span> </span>
</li>
<li><span>}  </span></li>
</ol>
インパルス後:

<ol class="dp-c">
<li class="alt"><span><span>double temp = (width + height) * 2;   </span></span></li>
<li>
<span class="comment">//do something  </span><span> </span>
</li>
<li class="alt"><span>temp = width * height;   </span></li>
<li>
<span class="comment">//do something </span><span> </span>
</li>
</ol>

7. パラメーターへの代入を削除します (パラメーターへの代入操作を削除します)

説明:
パラメータの受け渡しには、「値で渡す」と「アドレスで渡す」の2種類があります。「アドレスで渡す」の場合は、関数内のパラメータの値を変更するだけなので問題ありません。ただし、「値渡し」の場合は、コード内のパラメータに値を代入すると混乱が生じるため、関数内のこのパラメータを一時変数に置き換えてから、他の代入を行う必要があります。操作はこの一時変数に対して実行されます。

インパルス前:

<ol class="dp-c">
<li class="alt"><span><span>double perimeter = (width + height) * 2;   </span></span></li>
<li>
<span class="comment">//do something  </span><span> </span>
</li>
<li class="alt"><span>double area = width * height;   </span></li>
<li>
<span class="comment">//do something </span><span> </span>
</li>
</ol>

インパルス後:

<ol class="dp-c">
<li class="alt"><span><span class="keyword">public</span><span> double FinalPrice(double price, int num)   </span></span></li>
<li><span>{   </span></li>
<li class="alt"><span>price = price * num;   </span></li>
<li>
<span class="comment">//other calculation with price  </span><span> </span>
</li>
<li class="alt">
<span class="keyword">return</span><span> price;   </span>
</li>
<li><span>}  </span></li>
</ol>

8. メソッドをメソッド オブジェクトに置き換えます (関数を関数オブジェクトに置き換えます)

説明:

の行を衝動的に書き込んだ後。コードを作成したところ、この関数が非常に大きくなり、この関数には多くのローカル変数が含まれているため、メソッド抽出を使用することができなくなりました。このとき、メソッドをメソッドオブジェクトに置き換える方法は、この関数を に入れることです。別のオブジェクトであり、関数内の一時変数はこのオブジェクトの値フィールド (フィールド) になります。

インパルス前:

<ol class="dp-c">
<li class="alt"><span><span class="keyword">public</span><span> double FinalPrice(double price, int num)   </span></span></li>
<li><span>{   </span></li>
<li class="alt"><span>double finalPrice = price * num;   </span></li>
<li>
<span class="comment">//other calculation with finalPrice  </span><span> </span>
</li>
<li class="alt">
<span class="keyword">return</span><span> finalPrice;   </span>
</li>
<li><span>}  </span></li>
</ol>
インパルス後:

<ol class="dp-c">
<li class="alt"><span><span class="keyword">class</span><span> Bill   </span></span></li>
<li><span>{   </span></li>
<li class="alt">
<span class="keyword">public</span><span> double FinalPrice()   </span>
</li>
<li><span>{   </span></li>
<li class="alt"><span>double primaryPrice;   </span></li>
<li><span>double secondaryPrice;   </span></li>
<li class="alt"><span>double teriaryPrice;   </span></li>
<li>
<span class="comment">//long computation  </span><span> </span>
</li>
<li class="alt"><span>...   </span></li>
<li><span>}   </span></li>
<li class="alt"><span>}  </span></li>
</ol>

9. 置換アルゴリズム (置換アルゴリズム)

説明:

こんなジョークがあります:

ある多国籍日用化学会社は、包装中に石鹸が漏れる可能性があるという石鹸生産ラインの問題を抱えており、空の石鹸箱を顧客に販売してはならないため、同社の社長は、博士が率いる専門家グループの結成を命じた。研究開発チームは、世界最先端の技術(赤外線検出、レーザー照射など)を駆使し、多額の費用と半年を費やして、ついに石鹸箱検出システムを完成させました。空の石鹸箱がある場合、ロボットハンドが空の箱を押し出します。この方法により、石鹸箱の空充填率が 5% 未満に効果的に減少し、問題は基本的に解決されました。同様の問題があったため、上司は中卒の組立ラインの職長に解決策を見つけるよう命じ、長い間考えた後、扇風機を製造ラインの端に持ってきて強く吹きました。ベルトコンベア。石鹸が入っていない石鹸箱は、その軽さのために風で飛ばされました...

このジョークは非常に良いものになるでしょう。関数の複雑なアルゴリズムについては、方法を見つけてください。以前と同じか、それよりも優れた結果を達成するためにアルゴリズムを簡素化します

この記事へのリンク:


http://www.bkjia.com/PHPjc/445784.html

本当http://www.bkjia.com/PHPjc/445784.html技術記事いくつかの最適化関数を以下に紹介します。 1. Extract メソッド (Extract Function) 説明: 関数のコードが非常に長い場合、この関数は多くのことを行う可能性があります。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。