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

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

Jul 20, 2016 am 10:57 AM
extract method 導入 最適化 数種類 関数 発見する 構成する 説明する 詳しい

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

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 までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

golang 関数で新しい関数を動的に作成するためのヒント golang 関数で新しい関数を動的に作成するためのヒント Apr 25, 2024 pm 02:39 PM

Go 言語は、クロージャとリフレクションという 2 つの動的関数作成テクノロジを提供します。クロージャを使用すると、クロージャ スコープ内の変数にアクセスでき、リフレクションでは FuncOf 関数を使用して新しい関数を作成できます。これらのテクノロジーは、HTTP ルーターのカスタマイズ、高度にカスタマイズ可能なシステムの実装、プラグイン可能なコンポーネントの構築に役立ちます。

C++ 関数の命名におけるパラメーターの順序に関する考慮事項 C++ 関数の命名におけるパラメーターの順序に関する考慮事項 Apr 24, 2024 pm 04:21 PM

C++ 関数の名前付けでは、読みやすさを向上させ、エラーを減らし、リファクタリングを容易にするために、パラメーターの順序を考慮することが重要です。一般的なパラメータの順序規則には、アクション-オブジェクト、オブジェクト-アクション、意味論的な意味、および標準ライブラリへの準拠が含まれます。最適な順序は、関数の目的、パラメーターの種類、潜在的な混乱、および言語規約によって異なります。

Java で効率的で保守しやすい関数を記述するにはどうすればよいでしょうか? Java で効率的で保守しやすい関数を記述するにはどうすればよいでしょうか? Apr 24, 2024 am 11:33 AM

効率的で保守しやすい Java 関数を作成するための鍵は、シンプルに保つことです。意味のある名前を付けてください。特殊な状況に対処します。適切な可視性を使用してください。

Excel関数の公式の完全なコレクション Excel関数の公式の完全なコレクション May 07, 2024 pm 12:04 PM

1. SUM 関数は、列またはセルのグループ内の数値を合計するために使用されます (例: =SUM(A1:J10))。 2. AVERAGE 関数は、列またはセルのグループ内の数値の平均を計算するために使用されます (例: =AVERAGE(A1:A10))。 3. COUNT 関数。列またはセルのグループ内の数値またはテキストの数をカウントするために使用されます。例: =COUNT(A1:A10)。 4. IF 関数。指定された条件に基づいて論理的な判断を行い、結果を返すために使用されます。対応する結果。

C++ プログラムの最適化: 時間の複雑さを軽減する手法 C++ プログラムの最適化: 時間の複雑さを軽減する手法 Jun 01, 2024 am 11:19 AM

時間計算量は、入力のサイズに対するアルゴリズムの実行時間を測定します。 C++ プログラムの時間の複雑さを軽減するためのヒントには、適切なコンテナー (ベクター、リストなど) を選択して、データのストレージと管理を最適化することが含まれます。クイックソートなどの効率的なアルゴリズムを利用して計算時間を短縮します。複数の操作を排除して二重カウントを削減します。条件分岐を使用して、不必要な計算を回避します。二分探索などのより高速なアルゴリズムを使用して線形探索を最適化します。

Samsung S24aiの機能を詳しく紹介 Samsung S24aiの機能を詳しく紹介 Jun 24, 2024 am 11:18 AM

2024 年は AI 携帯電話元年です。AI スマート テクノロジーにより、携帯電話はますます効率的かつ便利に使用できるようになります。最近、今年の初めにリリースされたGalaxy S24シリーズは、生成AIエクスペリエンスを再び改善しました。以下で詳細な機能の紹介を見てみましょう。 1. 生成 AI は Samsung Galaxy S24 シリーズを強力に強化します。Galaxy S24 シリーズは、Galaxy AI によって強化され、多くのインテリジェント アプリケーションをもたらします。これらの機能は Samsung One UI6.1 と緊密に統合されており、ユーザーはいつでも便利なインテリジェントなエクスペリエンスを得ることができ、パフォーマンスが大幅に向上します。携帯電話の効率と使いやすさ。 Galaxy S24 シリーズで先駆けて開発されたサークルアンド検索機能は、長押しするだけで実現できる機能です。

C++ 関数例外の詳細: カスタマイズされたエラー処理 C++ 関数例外の詳細: カスタマイズされたエラー処理 May 01, 2024 pm 06:39 PM

C++ の例外処理は、特定のエラー メッセージ、コンテキスト情報を提供し、エラーの種類に基づいてカスタム アクションを実行するカスタム例外クラスを通じて強化できます。 std::Exception から継承した例外クラスを定義して、特定のエラー情報を提供します。カスタム例外をスローするには、throw キーワードを使用します。 try-catch ブロックでdynamic_castを使用して、キャッチされた例外をカスタム例外タイプに変換します。実際の場合、open_file 関数は FileNotFoundException 例外をスローします。例外をキャッチして処理すると、より具体的なエラー メッセージが表示されます。

オンラインスコアチェックプラットフォーム(便利で高速なスコア照会ツール)の紹介 オンラインスコアチェックプラットフォーム(便利で高速なスコア照会ツール)の紹介 Apr 30, 2024 pm 08:19 PM

高速スコア照会ツールは、生徒と保護者にとって利便性を高めます。インターネットの発展に伴い、ますます多くの教育機関や学校がオンライン スコア チェック サービスを提供し始めています。お子様の学業の進歩を簡単に追跡できるように、この記事では、一般的に使用されているオンラインスコアチェックプラットフォームをいくつか紹介します。 1. 利便性 - 保護者は、オンラインスコア確認プラットフォームを通じて、いつでもどこでも子供のテストスコアを確認できます。保護者は、コンピュータまたは携帯電話で対応するオンラインスコア確認プラットフォームにログインすることで、いつでも簡単に子供のテストスコアを確認できます。インターネットに接続できる環境であれば、仕事中でも外出中でも、保護者は子どもの学習状況を把握し、的を絞った指導や支援を行うことができます。 2. 複数の機能 - スコアのクエリに加えて、コースのスケジュールや試験の手配などの情報をオンラインで検索することもできます。

See all articles