ホームページ >バックエンド開発 >PHPチュートリアル >PHP トーク「リファクタリング - 既存のコードの設計の改善」 - 関数を再編成する_PHP チュートリアル
マインドマップ
下の画像をクリックすると大きな画像が表示されます。
はじめに
私が一番気に入っていること、大切にしていることを書き留めて、皆さんと共有します。前回は「PHPと上司の対話」という記事を書きました。まだまだ疑問がたくさんあるのですが、この本がとても役に立ちました。
忙しい方や文章を読むのが面倒な方は、スクリーンショットを見るだけでも得るものが多いのでおすすめです。スクリーンショットのコードを比較すると、どちらが優れているかがわかります。
コード部分に画像を使用するのはなぜですか?私は携帯電話を使ってコードを読むことが多いので、ブログパークのコードは携帯電話ではごちゃごちゃしているので、写真を見るほうが快適です。
専門用語
結局のところ、コーディングには英語の文字を使用するため、いくつかの英単語を使用すると、プロ意識をよりよく示すことができます。以下の英単語をマスターすれば、他のプログラマーとコミュニケーションをとる際に、より直接的かつプロフェッショナルになれるでしょう。 ——臭いところを見せていきましょう(笑)。
「*」は本文中によく出てくる
を示します
インライン: インライン
関数:関数
*メソッド: メソッド
きめの細かい: きめの細かい
名前を変更: 名前を変更します
クエリ: クエリ
temp: 一時的 (一時的) - 一般に一時変数を指します
*extract: 抽出 – 個人的には「精製」と訳すことを好みます
*複製:コピー
分割:解剖学
変数: 変数
因子: 因子、因子
リファクタリングの原則
1. 復興とは何ですか?
名詞形: ソフトウェアの内部構造の調整。目的は、ソフトウェアの観察可能な動作を変更することなく、理解しやすさを向上させ、修正コストを削減することです。
動詞形式: 一連のリファクタリング原則を使用して、観察可能な動作を変更せずにソフトウェアの構造を調整します。
2. なぜリファクタリングするのか?
1. 頻繁にリファクタリングを行うと、コードを適切な形式に保つことができます。
2. コードに適切な場所を見つけさせます。
3. ソフトウェアを理解しやすくします。
4. バグが見つかる可能性があります。
5. コーディング速度を向上させます。
3. 復興の問題
1. インターフェース名を変更します
クラス内のメソッドが public の場合、名前を変更するときに大きなリスクを負います。どのモジュールがメソッドを呼び出しているかがわからないためです (通常のアプローチは、プロジェクト全体に対して grep 操作を実行してから、各モジュールの呼び出しとロジックを 1 つずつ)。 ——そのため、クラスを作成するときは、インターフェイスを開かないように、属性とメソッドを可能な限りプライベートにするように努めます。
2. リファクタリングをすべきでない場合
(1) すべてのコードを書き直す。既存のコードはわかりにくいため、書き直すよりもリファクタリングの方が良いでしょう。
(2) プロジェクトが終了に近づいているときは、リファクタリングを避けるべきです。それを解決するために復興を第2フェーズに入れることができます。
コードの悪臭
1. 重複したコード
1. 同じクラスの 2 つのメソッドに同じ式が含まれています。
解決策: Extract Method を使用して重複したコードを抽出し、両方のメソッドでこの Extract メソッドを呼び出すことができます。
2. 2 つのクラスには同様のメソッドがあります。
解決策: (1) 2 つのクラスのメソッドを提案し、親クラスを共同で構築します。
(2) 一方のクラスのメソッドを削除し、もう一方のクラスのメソッドを呼び出します。
2. ロングメソッド
1. 短い関数: サブルーチンの動作を確認するにはコンテキストを頻繁に切り替える必要があるため、コードを読むのにある程度の労力がかかります。しかし、小さなメソッドを理解しやすくするための本当の鍵は、適切な名前を付けることです。読者は、関数に何が書かれているかを読まなくても、関数の名前からその機能を理解できます。 ——初期のプログラミング言語では、メソッドの呼び出しに追加のオーバーヘッドが必要なため、プログラマーは小さなメソッドを使用することを躊躇します。しかし、最新の OO 言語では、プロセス内の追加のオーバーヘッド (関数呼び出し) がほぼ完全に排除されています。
2. コメント内のシグナルを洗練する: 何かを説明するためにコメントを使用する必要があると感じたときは、説明する必要があるものを独立した関数に記述し、その目的に応じて名前を付けます。これは、コードのグループを使用して行うことも、1 行のコードだけで行うこともできます。 - 関数名がユーザーを説明している限り、躊躇する必要はありません。
「機能」は「何をするか」または「どのように行うか」として理解されます
3. 条件式とループは、多くの場合、信号を調整します。
3. 大人数クラス
1. クラス内の複数の属性変数が同じプレフィックスまたはサフィックスを持つ場合、クラス抽出を使用できます。
2. クラス内のほとんどの変数は属性変数を使用しません。クラスの抽出を使用できます。
3. コードが多すぎる場合は、クラスを抽出できます。
4. 長いパラメータ
導入パラメータオブジェクトを作成します。 ——私はこれには同意しません。なぜなら、他の人のメソッドを使用するとき、コードの実践をほとんど見ないからです。ましてや、必要なデータを取得するためにコード内で使用されているオブジェクトのプロパティやメソッドを見ることはありません。
5. Switch ステートメント
1. switch ステートメントの使用を減らします。 ——問題は重複です。新しいケースを追加するときは、すべてのケースを検索して変更する必要があります。
2. ポリモーフィズムに置き換えます。メソッド: 1. スイッチでメソッドの抽出を実行します。 2. MoveMethod は、ケース内の実際のコードを多態性クラスに置きます。
6. コメント
Extract メソッドを使用してみてください。それが機能しない場合は、Rename メソッドを試してください。
コメントを書く必要があると感じた場合は、まずリファクタリングを試して、すべてのコメントを冗長にしてください。
コメントは通常、将来の計画に使用されますが、完全に確信が持てない領域 (何かをする理由) にも使用できます。
機能を再編成
長いメソッドには多くの情報が含まれていることが多く、複雑なロジックでカバーされているため、特定するのが困難です。
1.抽出方法
このコードを別の関数に入れて、関数名でその関数の動作を説明させます
動機:
短くて適切な名前の関数:
1. 関数が細分化されているため、相互に再利用できる可能性が高くなります。
2. この関数は一連のコメントのように見えます。
3. 関数の書き換えが簡単。
方法:
1. 新しい関数を作成し、関数の目的に従って名前を付けます。関数の実行方法ではなく、関数の動作に基づいて名前を付けます。
=》抽出関数がメッセージや関数呼び出しなど非常に単純な場合でも、新しい関数がコードの意図をより適切な方法で表現できる限り、抽出関数を改良する必要があります。ただし、もっと意味のある名前が思いつかない場合は、そのままにしておいてください。
2. 抽出コードをソース関数から新しい関数に移動します。
2. インラインメソッド
メソッド本体がメソッド名と同じくらい明確で理解しやすい場合は、メソッドをインライン化してください。
3. インライン温度
一時変数は、単純な式によって 1 回だけ代入され、代入後に 1 回だけ使用されます。 ——インライン温度をお願いします
4. Temp を Query に置き換えます
Temp 変数が式を保持している場合、メソッドを抽出 この式。 ——これはいわゆるクエリ式、queryです
モチベーション:
1. ローカル変数により、コードの改良が困難になります。
2. 一時変数を使用すると、より長いコードを作成する必要があります。クエリメソッドに変更すると、クラス配下のメソッドがこの情報を取得できるようになります。 - よりクリーンなコードを作成します。
3. 多くの場合、Temp を Query に置き換えるのは、Extract メソッドを使用する前の重要な手順です。
方法:
1. 1 回だけ割り当てられる一時変数を見つけます。
=> 一時変数が複数回割り当てられている場合は、一時変数の分割を使用して複数の変数に分割することを検討してください。
2. 独立関数への一時変数割り当ての右側の部分を抽出します。
=> メソッドをプライベートとして宣言し、将来他のクラスで使用される場合はメソッドを解放します (パブリックまたはプロテクト)。
コードが適切に編成されていれば、多くの場合、より効果的な最適化を見つけることができます。 ————本当にパフォーマンスが悪ければ、元に戻すのは簡単です。 www.2cto.com
5. 説明変数を導入する
複雑な式の結果 (またはその一部) を一時変数に入れ、変数名を使用して式の目的を説明します。
モチベーション:
式が複雑で読みにくい。この場合、一時変数は式をより管理しやすい形式に分割するのに役立ちます。
6. 分割テンポレーター変数
一時変数が複数回割り当てられている場合、それはループ変数でもセット変数でもありません。次に、各割り当てに対応する独立した一時変数を作成します。
モチベーション:
1. 一時変数が複数の役割を担う場合は、複数の一時変数に置き換える必要があります。各変数には 1 つの責任しかありません。
2. 同じ一時変数が 2 つの異なることを担当するため、レビューが混乱します。
6. パラメーターへの割り当てを削除します
コードでパラメーターを割り当てる場合は、
パラメーターの位置 を一時変数に置き換えます。
7. メソッドをメソッドオブジェクトに置き換えます
Extract メソッドは、大規模な関数によるローカル変数の使用には使用できません。次に、この
メソッドを別のオブジェクトに配置し、ローカル変数がオブジェクトのファイルになるようにし、その大きな関数を同じオブジェクト内のいくつかの小さなメソッドに分解します。
モチベーション:
1. 大規模なメソッドから比較的独立したコードを抽出すると、コードの可読性が大幅に向上します。
2. メソッドではローカル変数が蔓延しており、この関数を分解するのは非常に困難です。
3. メソッドをメソッド オブジェクトに置き換えると、すべてのローカル変数がオブジェクトの値の範囲に変更されます。次に、この新しいオブジェクトに対してメソッドの抽出を実行します。
8. 代替アルゴリズム
アルゴリズムをよりクリーンな別のアルゴリズムに置き換える場合は、
メソッド本体を別のアルゴリズムに置き換えます。 ——元のメソッド本体を直接変更するだけです。
動機: 問題についてさらに学び、より明確な方法で何かを実行できることがわかったら、複雑な方法をより明確な方法に置き換える必要があります。
概要
これは本書の内容の一部にすぎませんが、私を含め、多くのプログラマーが異なる意見を持っていることは承知しています。したがって、私たちは「善に従い、悪を正す」必要があります。
どなたでもご意見をお聞かせください。
川山賈より抜粋