読者です 読者をやめる 読者になる 読者になる

リファクタリング7つ道具

 リファクタリングで重要なツールについて列挙してみると、ちょうど7つ程度に収まったので、リファクタリング7つ道具としてまとめてみました。
 以下に列挙します。

バージョン管理ソフト

 リファクタリングの作業成果をバージョン管理ソフトで細かく記録しておくと、作業の安全性を高めることができます。そこでは1つの目的を達成する度に、それに関する修正のチェンジセットをリポジトリに記録するようにすると効果的です。

 そうすることで、リファクタリングでどこを修正したのか、ある修正に関連する(依存する、影響する)他の修正はあるのか、といった重要な情報を、後から細かく確認できるようになります。
 一方で特定のリファクタリングを取り消せるようになる、コードのブランチを取ることができるといったメリットも実現されます。


 またバージョン管理ソフトを用いる際は、コミット情報に、誰が修正したのか、何の目的でその修正を行ったのかを必ず含ませると良いでしょう。
 そうすればリファクタリングが正しく行われたのか後から容易にチェックできるようになります。これは複数人でリファクタリングを行う際に、バグの混入を防ぐ点で、多大な効力を発揮します。

コーディング規約

 リファクタリングにおいては、修正すべき記述、修正しなくても良い記述、適切な記述を、あらかじめ規約として具体化しておくと作業が効率化されます。


 まず修正すべきところを具体化しておけば、リファクタリングが必要な記述をより容易に見つけ出せるようになります。
 また修正しなくても良い記述や、適切な記述を具体化すれば、不適切なリファクタリングをある程度防止することができるほか、個人的なこだわりや無意味な修正を減らして、作業の冗長性を取り除くことができます。

 さらに規約をうまく運用すれば、規約違反率などでリファクタリングの指標を数値化することができます。それは作業管理を容易にする、上司や開発メンバーに対する(主にリファクタリングの必要性についての)説得材料にできる、といったメリットにつながります。

静的解析ソフト

 splint等といった静的解析ソフトを利用すれば、リファクタリングすべき不適切な記述を機械的に抽出することができます。
 そうしたものをあらかじめ把握・修正しておけば、投入可能なリソースをより深く抽象的な対象のリファクタリングに集中させることができます。

 また出力結果やメトリクスを活用すれば、欠陥数の推移などで、コーディング規約と同様にリファクタリングの指標の数値化が実現されます。

ドキュメンテーションジェネレータ

 Doxygen等といったドキュメンテーションジェネレータを用いれば、設計やデータ構造といった全体的・抽象的な要素を可視化できるようになります。それは全体的・抽象的な要素のリファクタリングや、不吉なにおい(潜在的なリスクが感じられる記述)の特定の一助になるでしょう。

 またリファクタリングのためにドキュメンテーションジェネレータのタグコメントを定義・使用すれば、作業に必要な情報(リファクタリングの履歴、修正を予定している箇所、修正が必要そうな箇所など)を、コードに記録しつつ任意のタイミングでドキュメントとして出力できるようになります。

 なお自作のドキュメンテーションジェネレータも活用すれば、より柔軟な作業支援ができるようになるでしょう。

テスティングツール

 リファクタリングの基本ともいわれていますが、リファクタリングを行う際は、それによって機能が変化していないかソフトウェアテストで判定するようにすると安全です。
 必要な仕様を判定するのに十分なテストを書き、リファクタリング前とリファクタリング後それぞれのコードのそのテスト結果が一致していることを確認してから、リファクタリングによる修正を確定するようなサイクルを繰り返すのが理想形です。

 なおもしテスト駆動開発等により、あらかじめ必要なテストを記述するように取り決めておけば、容易・軽快にリファクタリングを実行できるようになります。そのような環境では、リファクタリングの位置づけは、気の向いたときに簡単に始められるようなありふれた工程の1つになるでしょう。

バグトラッキングシステム

 リファクタリングが必要そうな箇所、リファクタリングし損なった箇所、リファクタリングの過程で見つけたバグや機能不足など、作業の過程で記録が必要になる要素を管理するシステムを用意すると、リファクタリングとその他の作業(バグ直し等)の分離が促進されます。
 そうすれば「実装の帽子をリファクタリングの帽子 にかぶりなおす」という格言の通り、リソースをリファクタリングに集中させられるようになり、作業の効率性や安全性の向上が計れます。

 なおTracといった本格的なシステムでも問題ないですが、リファクタリングのためのバグトラッキングシステムとしては、コメントタグ+ドキュメンテーションジェネレータの組み合わせによるもの程度でも代用は十分可能だと思います。

レビュー

 レビューは、リファクタリングすべき記述や、リファクタリングで目指す理想的な記述に対する認識を共有させることができる点で有用です。
 特にコーディング規約やコメントタグ(ドキュメンテーションジェネレータ)を開発プロセスとして運用している場合は、違反判定基準を明確化するなど、大きな効力を発揮します。

 またリファクタリングのレビュー(リファクタリングでどのように修正したかのレビュー)も非常に重要です。パスアラウンド形式のレビューを行うだけでも、バグ混入の防止に大いに役立つでしょう。


 7つ道具は以上になりますが、この中でも特に重要なのはバージョン管理ソフトでしょう。
 バージョン管理ソフトの更新管理機能は、個人レベルで行う場合でも複数人で行う場合でも、リファクタリング作業を強力に支援してくれます。逆に複数人によるリファクタリングをバージョン管理ソフトなしで進めようとするのは、かなり無謀といえます。

 一方でリファクタリングおいて、世間一般で必要だといわれるテスティングツールやソフトウェアテストは、現実を見ると適用が難しい場合が多々あります。
 やるにこしたことはありませんが、リファクタリングによって無駄になるテストが少なからず発生する、GUI等テストの記述が困難なコードがある、テストを書く時間を割けるほど、リファクタリングに十分なプライオリティが与えられていないことがある、といった事情が普通に存在する点、留意が必要でしょう。