以下にいくつかの最適化関数を紹介します:
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>
一部の関数は 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>
関数の戻り値を表すために使用される一時変数 (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>
<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>
<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>
<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>
インパルス前:
<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