リファクタリングを使用してコードを統制する方法(PHPの例を含む)

公開: 2021-06-22

人生の他の多くのものと同様に、私たちのコードにもある程度の規律が必要です。 汚れたコードを書きたがっている開発者は世界中にいないと確信しています。 ただし、汚れたコードはまだ存在します。 これは、さまざまな理由で発生する可能性があります。ビジネス上のプレッシャー、ドキュメントの不足、チームメンバー間のやり取りの不足、または開発者の無能が原因である可能性があります。 コードをよりクリーンにし、これが原因で将来発生する可能性のある問題を回避するために、適切な措置を講じる必要があります。 幸いなことに、リファクタリングと呼ばれるコードを再構築するための統制のとれた手法でこれらの問題に取り組むことができます。

リファクタリングは、既存のプログラムソースコードの内部構造を改善し、その外部動作を維持するための手法です。 これは、コードを改善するための段階的な手順です。そうしないと、多くの時間と労力がかかります。

コードリファクタリング

汚れたコードのデメリット

長時間リファクタリングせずに新しいプログラムを追加してソースコードのサイズを拡大すると、コードが乱雑で汚れたものになります。 それはプロジェクトの維持とさらなる開発を非常に困難にします。 汚れたコードには多くの欠点があります。

  1. プロジェクトの維持費が増加します。
  2. 新機能の追加には時間がかかり、追加できなくなる場合があります。
  3. それはプロジェクトへの新しい人々の紹介を遅くします。
  4. 重複したコードが含まれています。
  5. すべてのテストに合格するわけではありません。

他にも多くの欠点がありますが、これらの問題は組織にとって多大な費用と時間を要します。

クリーンコードの利点

クリーンで統制のとれたコードには、独自の利点があります。

  1. 重複するコードは含まれていません。
  2. すべてのテストに合格します。
  3. コードを読みやすく、理解しやすくします。
  4. これにより、コードの保守が容易になり、コストが削減されます。

クリーンなコードの利点はたくさんあります。 乱雑な汚れたコードをより保守しやすいきれいなコードに変えるプロセスは、リファクタリングプロセスと呼ばれます。

リファクタリングプロセス

リファクタリングは一連の小さな変更として実行する必要があります。各変更により、既存のコードがわずかに改善され、プログラムを中断せずに実行し続けることができます。 リファクタリング後、コードは以前よりもクリーンになるはずです。 汚れたままの場合は、リファクタリングのポイントはありません。 それは時間と労力の損失です。 新しい機能を作成するためにリファクタリング中に新しいコードを追加しないでください。 リファクタリング後、すべてのテストに合格する必要があります。

リファクタリングするタイミング

リファクタリングは、次の場合に実行する必要があります。

  • プロジェクトに重複するコードを追加します。 重複コードは維持が難しく、ある場所での変更には他の多くの場所での更新が必要になる場合があるためです。
  • 機能を追加します。 リファクタリングにより、新しい機能の追加が容易になります。
  • バグを修正するときは、バグが自動的に発見されるため、リファクタリングする必要があります。
  • コードレビューは、変更が本番環境にデプロイされる前のコードのリファクタリングの最終段階です。

コードの臭いに対処する

コードの問題は、コードの臭いと呼ばれることもあります。 これらは、リファクタリング中に対処された問題です。 それらは見つけて修正するのが簡単です。

例えば:

  • 非常に扱いにくい大きなメソッドとクラス。
  • オブジェクト指向プログラミングの概念の不完全または誤った使用法。
  • 変更を追加するのを困難にするコード。
  • プロジェクト内の重複および非推奨のコード。
  • 高度に結合されたコード。

リファクタリング技術

リファクタリング手法は、コードをリファクタリングするために実行される手順です。 リファクタリング手法のいくつかは次のとおりです。

1.抽出メソッド

// 問題

function printInvoice() { $this->printHeader(); // Print details. print("name: " . $this->name); print("amount " . $this->getPrice()); }

// 解決

function printInvoice() { $this->printBanner(); $this->printDetails($this->getPrice()); } function printDetails($price) { print("name: " . $this->name); print("amount " . $outstanding); }

グループ化できるコードフラグメントがある場合は、コードのその部分に新しいメソッドを追加し、古いコードを置き換えます。 これにより、コードがより分離され、重複がなくなります。

2.変数を抽出します

// 問題

if (($student->getMarksinMath() > 60) && ($student->getMarksInPhysics() > 60) && ($student->getMarksinChemistry() > 60) && $this->pass) { // do something }

// 解決

$mathResult = $student->getMarksinMath() > 60; $physicsResult = $student->getMarksinPhysics() > 60; $chemistryResult = $student->getMarksinChemistry() > 60; $hasPassed = $this->pass; if ($mathResult && $physicsResult && $chemistryResult && $hasPassed) { // do something }

問題に表示されているような大きな式の場合、非常に理解しにくいため、式ごとに異なる変数を作成できます。 コードが読みやすくなります。 ただし、この方法は注意して適用する必要があります。 ただし、それ自体に欠点があります。 条件がfalseの場合でもコードは実行されますが、問題の場合はそうではありません。

3.インラインメソッド

// 問題

function printResult() { return ($this->getResult()) ? “Pass” : “Fail”; } function getResult() { return $this->totalMarks > 300; }

// 解決

function getRating() { return ($this->totalMarks > 300) ? “Pass” : “Fail”; }

メソッド本体がより明確な場合は、この手法を使用してください。 メソッドをメソッドコンテンツに置き換え、メソッドを削除します。 不要なメソッドの数を最小限に抑えます。

4.インライン温度

// 問題

$mathMark = $student->getMathResult(); return $mathMark > 60;

// 解決

return $student->getMathResult() > 60;

式の結果を保持するだけの不要な一時変数がある場合は、式自体で変数を削除します。 不要な変数を取り除くのに役立ちます。

5.配列をオブジェクトに置き換えます

// 問題

$row = []; $row[0] = "Virat Kohli"; $row[1] = 70;

// 解決

$row = new Player(); $row->setName("Virat Kohli"); $row->setNumberofCentury(70);

さまざまな種類のデータを含む配列がある場合は、それをオブジェクトに置き換えます。 クラスのフィールドは、さまざまなタイプのデータを含む配列よりも文書化および保守が容易であるためです。

6.パラメータ化された方法

// 問題

function fivePercentRaise() { } function tenPercentRaise() { }

// 解決

function raise(percent) { }

複数のメソッドがデータに対して同様のアクションを実行する場合は、すべてのメソッドを1つのメソッドに置き換え、データを引数として渡します。 重複した冗長なメソッドを削除します。

7.クエリを修飾子から分離します

// 問題

function getInterest() { $this->interestAmount = $this->principal * 10 / 100; return $this->interestAmount; }

// 解決

function setInterest() { $this->interestAmount = $this->principal * 10 / 100; } function getInterest() { return $this->interestAmount; }

メソッドが値を返し、オブジェクトを変更している場合は、2つのメソッドを分割します。 1つは変更用で、もう1つは結果を返すためのものです。 オブジェクトが意図せずに変更される可能性を排除します。