Git は開発者がプロジェクトの中で行われた変更を記録し追跡するための便利なツールです。これは誰がいつ何を変更したか、そしてその変更がどのような影響をもたらしたかを理解するのに役立ちます。この変更履歴を元にコードの変更頻度を計算し、それをリファクタリングの対象を決定するために利用することができます。
リファクタリングは既存のコードを整理し明確さや可読性を向上させる作業です。このためリファクタリングによって新しい機能の実装や修正を容易にすることができます。ただし全てのコードをリファクタリングすることは効率的ではありません。なぜなら変更が滅多に加えられないコードをリファクタリングしても、リファクタリングにかかったた時間がリファクタリング抜きに改修いた場合の時間よりも長くなりやすいからです。一応内部実装を読む必要がある場合は変更がない場合でもリファクタリングは効果的に働きますが、そういったことは大分レアケースです。内部実装を読まなくとも関数なりなんなりの入出力や説明のコメントを見れば十分なことが多いです。変更が加えられにくいコードに対してのリファクタリングが効果的でない一方で、頻繁に変更が行われるコードをリファクタリングすると開発速度が向上しやすいです。該当部のコードをあっちこっち行き来する時間が短くなるだけでも随分違う結果になります。
そういった理由からどの部分をリファクタリングすべきかを決定するための指標が欲しくなります。この指標の一つとしてGit のログ情報を用いてコードの変更頻度を確認することが有効です。以下のコマンドで Git のログからファイルの変更頻度を抽出できます。
# プロジェクト全体を通しての変更頻度一覧 git log --name-only --pretty=format: | sort | uniq -c | sort -n # ここ一か月の変更頻度一覧 git log --since="1 month ago" --name-only --pretty=format: | sort | uniq -c | sort -n
説明は次です。
- git log –since=”1 month ago” –name-only –pretty=format:
git log
コマンドはGitリポジトリのコミット履歴を表示します。--since="1 month ago"
オプションは期間を示します。ここでは一か月としています。--name-only
オプションは各コミットで変更されたファイルの名前のみを表示します。そして、--pretty=format:
オプションはコミットのメタデータ(著者、日付、コミットメッセージなど)を表示せず、変更されたファイルの名前だけを表示します。 - | sort: UNIXの
sort
コマンドは入力をソートします。パイプライン(|
)を使って、git log
から出力されたファイル名のリストをsort
コマンドに渡します。 - | uniq -c:
uniq
コマンドは連続する行の重複を削除します。-c
オプションを使用すると、各行が何回出現したかを表示します。ここではsort
からのソートされたファイル名のリストを入力として受け取ります。 - | sort -n: 最後に、
sort -n
コマンドを使用して数値順(昇順)に結果をソートします。ここでは、uniq -c
からの出力(つまり、各ファイル名とその出現回数)を入力として受け取ります。
こういったコマンドを使うことで頻繁に変更されているファイルや部分を特定し、それらを対象にリファクタリングを行うことでより効果的に開発の効率化を図ることができます。
注意点としてこの方法はあくまで目安であり、全ての状況に対応するわけではないという点があります。例えばファイルパスが変更された場合、その変更履歴は新しいパスに対してはリセットされます。またコードが十分に整理されていてリファクタリングの余地がほとんどない場合、さらにリファクタリングしても大して早くならなかったりもします。