リファクタリングって何?
いきなりですが「リファクタリング」について、普段どれぐらい意識していますか? コード品質に関わる重要な概念ですが、この単語は、職業としてプログラミングをやらない限り、人生で出会わない単語の筆頭と言えるかもしれません。下図は、リファクタリングと、おそらくそれと同程度には知られているのでないかと思われる開発用語の検索頻度を、Google Trendsで調べてみたものです。
検索期間は2013年10月21日から2023年10月21日、地域はJapan、カテゴリーはComputers & Electronics(SoftwareやProgramingをサブカテゴリに持ちます)です。「コードレビュー」もコード品質を上げるうえでは重要な行為だと思いますが、日本では意外と浸透していないようですね。コードレビューに関しては、機会があればまた別の記事の中で取り上げたいと思います。
さて、リファクタリングとは「プログラムの外部から見た動作を変えずにソースコードの内部構造を整理すること」です。私自身恥ずかしながら、なぜこの行為をリファクタリング(Refactoring)と呼ぶのかは知りません。“Re”は、繰り返しの接頭語、“factoring”はfactorの動名詞型で、factorは因数分解をするという意味になります。ですので「ソースコードを再度わかりやすく要素ごとに因数分解する」というようなイメージなのでしょうか。ちなみに、この後紹介する『リファクタリング 第2版』の著者でもあるMartin Fowlerさんは、自身のブログでRefactoring の語源について述べています。ご参考まで。
リファクタリングは誰のためのものか?
リファクタリングは、上記の定義からもわかるように、プログラムの機能を追加したり変更したりするものではありません。つまり、リファクタリングをしてもしなくても、そのソフトウェアを使うユーザーにとっての価値は変わりません[*1]。では、リファクタリングは誰のためのものか?というと、それはまさに開発チーム、自分達のためのものです。リファクタリングを行うことで、一般的には以下のような効果が期待できます。
可読性が高まる
コードが整理され、命名が適切になることで、他の開発者がコードを理解しやすくなります。これにより、チーム全体の生産性が向上します。
バグが見つけやすくなる
整理されたコードは、不具合やバグを見つけやすくなります。複雑なコード構造や冗長なコードを排除することで、予期せぬ動作やエラーを回避しやすくなります。
変更や拡張がしやすくなる
構造化されたコードは、新しい機能の追加や既存の機能の変更が容易になります。
テストがしやすくなる
リファクタリングは、ユニットテストの作成や実行を容易にします。テストがしやすいコードは、安全性と信頼性の両方を高めるのに役立ちます。
特に複数人による長期間にわたる開発では、ソースコードの品質を一定以上に保ち、ソフトウェア開発を継続的に進めていくために、定期的にリファクタリングを行う必要があります。
[*1] ただしリファクタリングした結果、機能は変わらなくても「サクサク動くようになった」とか「不具合で落ちにくくなった」とか、性能が向上してユーザーの満足度が上がる可能性はあります。