リファクタリングとは、既存のコードの内部構造を、外部からの振る舞いを変更することなく再構築するための、規律ある技術です。

その核となるのは、振る舞いを保持する一連の小さな変換です。各変換(「リファクタリング」と呼ばれる)は小さなものですが、これらの変換を連続して行うことで、大幅な再構築を行うことができます。各リファクタリングは小さいので、失敗する可能性は低くなります。システムは各リファクタリング後も完全に動作し続けるため、再構築中にシステムが深刻に破損する可能性を減らすことができます。

photo of Martin Fowler

マーティン・ファウラー

リファクタリングは機能強化のコストを削減します

ソフトウェアシステムが成功すると、常に機能強化、問題の修正、新機能の追加が必要になります。結局のところ、それはソフトウェアと呼ばれているのですから!しかし、コードベースの性質は、これらの変更を行うのがどれほど簡単であるかに大きな影響を与えます。多くの場合、機能強化は、変更を行うのがますます困難になるように、互いに重ねて適用されます。時間が経つにつれて、新しい作業はスローダウンします。この変化に対抗するには、追加された機能強化が不必要な複雑さにつながらないように、コードをリファクタリングすることが重要です。

リファクタリングは日常的なプログラミングの一部です

リファクタリングは、プロジェクト計画に現れる特別なタスクではありません。うまく行われれば、それはプログラミング活動の通常の一部です。コードベースに新しい機能を追加する必要がある場合、私は既存のコードを見て、新しい変更を簡単に行うことができるように構成されているかどうかを検討します。そうでない場合は、この新しい追加を簡単にするために既存のコードをリファクタリングします。このように最初にリファクタリングすることで、最初にリファクタリングを行わなかった場合よりも通常は速いことがわかります。

変更を加えたら、新しい機能を追加します。機能を追加して動作するようにしたら、結果として得られたコードは動作するものの、それほど明確ではないことに気づくことがよくあります。その後、数週間後に私(または他の誰か)がこのコードに戻ったときに、このコードがどのように機能するかを解読するのに時間を費やす必要がないように、より良い形にリファクタリングします。

プログラムを変更するとき、私はしばしばコードの他の場所を見ています。なぜなら、私がする必要があることの多くはすでにプログラムにエンコードされている可能性があるからです。このコードは、簡単に呼び出すことができる関数である場合もあれば、より大きな関数の中に隠されている場合もあります。このコードを理解するのに苦労する場合は、次回に見るときに再び苦労する必要がないようにリファクタリングします。必要な機能が埋もれている場合は、簡単に使用できるようにリファクタリングします。

自動化ツールは役立ちますが、必須ではありません

90年代後半にリファクタリングの初版を書いたとき、リファクタリングをサポートする自動化ツールはほとんどありませんでした。現在、多くの言語には、多くの一般的なリファクタリングを自動化するIDEがあります。これらは、リファクタリングをより迅速に実行できるようにする、非常に貴重なツールキットの一部です。ただし、このようなツールは必須ではありません。ツールサポートのないプログラミング言語で作業することがよくあります。その場合、小さなステップを踏み、頻繁なテストを使用して間違いを検出することに頼っています。

カタログ

このサイトの主なコンテンツは、リファクタリングのオンラインカタログです。これには、第2版のリファクタリングと、リファクタリングに関する概要情報が記載されています。

書籍

リファクタリングについて詳しく学ぶには、まず私のリファクタリング本(現在第2版)を読むのが自然な出発点です。リファクタリングがあまり知られていなかった1997年から9年にかけて、私はオリジナルの版を書きました。18年後に更新したとき、リファクタリングは熟練したプログラマーにとって一般的なツールになっていました。しかし、常に新しい人々が私たちの職業に参入し、リファクタリングについて学ぶ必要があります。この本は彼らが学ぶのを助け、経験豊富な開発者が彼らのスキルを伝えるのを助けます。

第2版の例はJavaScriptで書かれていますが、リファクタリングはどの言語でも適用できます。(例がJavaだった)オリジナルの本では、多くの開発者が例を取り上げて、使用する言語に適用するのが簡単だと感じました。

書籍をお持ちの場合は、書籍のWeb版にアクセスできます。これは、規範的な版です。書籍にはないいくつかのリファクタリングと、拡張された例が含まれています。

定義

この本で、私は「リファクタリング」を次のように定義しています

名詞: ソフトウェアの内部構造を、理解しやすく、変更をより安価に行えるようにするために行われる変更で、外部からの振る舞いは変化させないもの

動詞: 外部からの振る舞いを変更することなく、一連のリファクタリングを適用することによってソフトウェアを再構築すること。

リファクタリングはコードをクリーンアップするための別の言葉ではありません。これは、コードベースの健全性を向上させるための1つの技術を具体的に定義しています。「再構築」は、他の技術を取り入れている可能性のあるコードの再編成のためのより一般的な用語として使用しています。