ホームページ  >  記事  >  php教程  >  【転送】PHP雑話「リファクタリング - 既存コードの設計改善」第1回 関数を再編成する

【転送】PHP雑話「リファクタリング - 既存コードの設計改善」第1回 関数を再編成する

WBOY
WBOYオリジナル
2016-10-18 08:42:031163ブラウズ
元のアドレス: PHP Talk「リファクタリング - 既存のコードの設計の改善」パート 1 関数を再編成する
マインドマップ
下の画像をクリックすると大きな画像が表示されます。

はじめに
私が最も好きなもの、最も気にかけているものを書き留めて、あなたと共有します。前回は「PHPと上司の対話」という記事を書きました。まだまだ疑問がたくさんあるのですが、この本がとても役に立ちました。
忙しい場合やテキストを読むのが面倒な場合は、スクリーンショットを見るだけで多くのことを学ぶことをお勧めします。スクリーンショットのコードを比較すると、どちらが優れているかがわかります。
コード部分に画像を使用するのはなぜですか?私は携帯電話を使ってコードを読むことが多いので、ブログパークのコードは携帯電話ではごちゃごちゃしているので、写真を見るほうが快適です。
専門用語
結局のところ、コーディングには英語の文字を使用するため、いくつかの英単語を使用すると、プロ意識をよりよく示すことができます。以下の英単語をマスターすれば、他のプログラマーとコミュニケーションをとる際に、より直接的かつプロフェッショナルになれるでしょう。 ——臭いところを見せていきましょう(笑)。
「*」は本文中で頻繁に言及されていることを示します
インライン: インライン
関数: 関数
*メソッド: メソッド
きめの細かい: きめの細かい
名前変更: 名前を変更
クエリ: クエリ
temp: 一時的 (一時的) - 一般に一時変数を指します
*extract: 抽出 - 個人的には「精製」と訳すことを好みます
*重複:コピー
分割: 解剖
変数: 変数
因子: 因子、因子
リファクタリングの原則
1. 復興とは何ですか?
動詞形式: 一連のリファクタリング原則を使用して、観察可能な動作を変更せずにソフトウェアの構造を調整します。
2. なぜリファクタリングするのか?
1. 頻繁にリファクタリングを行うと、コードを適切な形式に保つことができます。
2. コードに適切な場所を見つけさせます。
3. ソフトウェアを理解しやすくする。
4. バグが見つかる可能性があります。
5. エンコード速度を向上させます。

3. 復興の問題
1.インターフェース名を変更します
クラス内のメソッドがパブリックである場合、名前を変更するときに大きなリスクを負います。どのモジュールがメソッドを呼び出しているかわかりません(通常のアプローチは、プロジェクト全体の操作に対して grep を実行してから、それを確認することです)。各モジュールの呼び出しとロジックを 1 つずつ)。 ——そのため、クラスを作成するときは、インターフェイスを開かないように、属性とメソッドを可能な限りプライベートにするように努めます。
2. リファクタリングをすべきでない場合
(1)コードを全部書き直す、既存のコードがわかりにくいので書き直すよりリファクタリングの方が良い。
(2)プロジェクトが終わりに近づいているときは、リファクタリングは避けるべきです。それを解決するために復興を第2フェーズに入れることができます。

コードの臭い
1. コードが重複しています
1. 同じクラスの 2 つのメソッドに同じ式が含まれています。
解決策: Extract メソッドを使用して重複したコードを抽出し、両方のメソッドでこの Extract メソッドを呼び出すことができます。
2. 2 つのクラスには同様のメソッドがあります。
解決策: (1) 2 つのクラスのメソッドを提案し、親クラスを共同で構築します。
(2) あるクラスのメソッドを削除し、別のクラスのメソッドを呼び出す。
2. ロングメソッド
1. 短い関数: サブルーチンの動作を確認するためにコンテキストを頻繁に切り替える必要があるため、コードを読むのに多少の労力がかかります。しかし、小さなメソッドを理解しやすくするための本当の鍵は、適切な名前を付けることです。読者は、関数に何が書かれているかを読まなくても、関数の名前からその機能を理解できます。 ——初期のプログラミング言語では、メソッドの呼び出しに追加のオーバーヘッドが必要だったため、プログラマーは小さなメソッドを使用することに消極的でした。しかし、最新の OO 言語では、プロセス内の追加のオーバーヘッド (関数呼び出し) がほぼ完全に排除されています。
2. コメントでシグナルを洗練する: コメントで何かを説明する必要があると感じたときは、説明する必要があるものを独立した関数に記述し、その目的に応じて名前を付けます。これは、コードのグループを使用して行うことも、1 行のコードだけで行うこともできます。 - 関数名がユーザーを説明している限り、躊躇する必要はありません。
「機能」は「何をするか」または「どのように行うか」として理解されます
3. 条件式とループはシグナルを調整することがよくあります。
4. 「コードの清潔さ」の例。考えてみましょう!

3. 大人数のクラス
1. Class 内の複数の属性変数が同じプレフィックスまたはサフィックスを持つ場合、Extract Class を使用できます。
2. Class 内のほとんどの変数は属性変数を使用しません。Extract Class を使用できます。
3. コードが多すぎる場合は、クラスを抽出できます。
4. 長いパラメータ
パラメータオブジェクトの導入にしました。 ——私はこれには同意しません。なぜなら、他の人のメソッドを使用するとき、コードの実践をほとんど見ないからです。ましてや、必要なデータを取得するためにコード内で使用されているオブジェクトのプロパティやメソッドを見ることはありません。
5. ステートメントの切り替え
1. switch ステートメントの使用を減らします。 ——問題は重複です。新しいケースを追加するときは、すべてのケースを検索して変更する必要があります。
2. ポリモーフィズムに置き換えます。メソッド: 1. スイッチでメソッドの抽出を実行します。 2. MoveMethod は、ケース内の実際のコードを多態性クラスに置きます。
6. コメント
Extract Method を試してください。それがうまくいかない場合は、Rename Method を試してください。
コメントを書く必要があると感じた場合は、まずリファクタリングを試して、すべてのコメントを冗長にするようにしてください。
コメントは通常、今後の計画について使用されますが、完全に確信が持てない部分(なぜ何かをするのか)についても使用できます。

機能を再編成する
長いメソッドには情報が多すぎることが多く、複雑なロジックでカバーされており、特定するのが困難です。
1.抽出方法
状況: 長すぎる関数、または目的を理解するためにコメントが必要なコードを見つけました。次に、このコードを別の関数に配置し、関数名で関数の目的を説明します。

動機:

短くて適切な名前の関数: --粒度が細かい

1. 再利用の絶好のチャンス。

2. この関数は一連のコメントのように見えます。

3.関数の上書きは簡単です。

キーポイント: 関数の長さの鍵は、関数名と関数オントロジーの間の意味論的な距離にあります。アクションを洗練することでコードの明瞭さが向上する場合は、そうしてください。

方法:

1. 新しい関数を作成し、関数の目的に従って名前を付けます。「どのように」実行するかではなく、「何を実行するか」に基づいて名前を付けます。

=》 抽出関数がメッセージや関数呼び出しだけなど非常に単純な場合でも、新しい関数がコードの意図をより適切な方法で表現できる限り、抽出関数を抽出する必要があります。ただし、もっと意味のある名前が思いつかない場合は、そのままにしておいてください。

2. ExtractコードをSource FunctionからNew Functionに移動します。

2. インラインメソッド

メソッド本体がメソッド名と同じくらい明確でわかりやすい場合は、メソッドをインライン化してください。

3. インライン温度

一時変数は単純な式によって 1 回だけ代入され、代入後に 1 回だけ使用されます。 ——インライン温度をお願いします

4. Temp をクエリに置き換えます

Temp 変数が式を保持している場合、Extract メソッドを使用してこの式を抽出します。 ——これがいわゆる検索式、クエリです

動機:

1. ローカル変数があるとコードの改良が難しくなります。

2. 一時変数を使用すると、より長いコードを記述する必要があります。クエリメソッドに変更すると、クラス配下のメソッドがこの情報を取得できるようになります。 - よりクリーンなコードを作成します。

3. Temp を Query に置き換えることは、Extract メソッドを使用する前の重要なステップであることがよくあります。

やり方:

1. 1 回だけ代入される一時変数を見つけます。

=> 一時変数が複数回割り当てられている場合は、一時変数の分割を使用して複数の変数に分割することを検討してください。

2. 独立関数への一時変数代入の右側部分を抽出します。

オフ スルー スルー スルー スルー スルー スルー スルー スルー スルー スルー スルー スルー スルー スルー スルー スルー スルー スルー スルー スルー スルー スルー スルー‐‐ クラスのクラス内に存在するには、必ずメソッドをプライベートとして宣言し、将来他のクラスで使用される場合はメソッドを解放 (パブリックまたはプロテクト) してください。

コードがよく整理されていれば、より効果的な最適化ソリューションを見つけることができます。 ————本当にパフォーマンスが悪ければ、元に戻すのは簡単です。
5. 説明変数を導入する
複雑な式の結果 (またはその一部) を一時変数に入れ、変数名を使用して式の目的を説明します。

動機:
表現が複雑で読みにくい。この場合、一時変数は式をより管理しやすい形式に分割するのに役立ちます。
6. 分割テンポレーター変数
一時変数が複数回割り当てられている場合、それはループ変数でもセット変数でもありません。次に、各割り当てに対応する独立した一時変数を作成します。

動機:

1. 一時変数が複数の責任を負っている場合は、複数の一時変数に置き換える必要があります。各変数には 1 つの責任しかありません。

2. 同じ一時変数が 2 つの異なることを担当するため、レビューが混乱します。

6. パラメータへの割り当てを削除する
コードでパラメータに値を割り当てる場合は、パラメータの位置を一時変数に置き換えます

7. メソッドをメソッドオブジェクトに置き換えます

大規模な関数でローカル変数を使用する場合、Extract メソッドは使用できません。次に、このメソッドを別のオブジェクトに配置して、ローカル変数がオブジェクトのファイルになるようにし、大きな関数を同じオブジェクト内のいくつかの小さなメソッドに分解します。

動機:

1. 大きなメソッドから比較的独立したコードを抽出すると、コードの可読性が大幅に向上します。

2. メソッドには非常に多くのローカル変数があるため、この関数を分解するのは非常に困難です。

3. メソッドをメソッドオブジェクトに置き換えると、すべてのローカル変数がオブジェクトの値の範囲に変更されます。次に、この新しいオブジェクトに対してメソッドの抽出を実行します。

8. 代替アルゴリズム
アルゴリズムをよりクリーンな別のアルゴリズムに置き換える場合は、メソッド本体を別のアルゴリズムに置き換えます。 ——元のメソッド本体を直接変更するだけです。
動機: 問題についてさらに学び、より明確な方法で何かを実行できることがわかったら、複雑な方法をより明確な方法に置き換える必要があります。
まとめ
これは本書の内容の一部にすぎませんが、私を含め、多くのプログラマーが異なる意見を持っていることは承知しています。したがって、私たちは「善に従い、悪を正す」必要があります。
どなたでもご意見をお聞かせください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。