Duplo(via 2006-07-11 - togeの日記)
指定したソースの中から重複コードを探してくれるツール。 C++ にも対応しているとのことなので早速仕事で書いてるコードに対して使ってみました。 Windows 用のバイナリが最初から用意されているのでそいつをダウンロードして、コマンドプロンプトから実行。
> cd src > dir /s /b /a-d *.cpp *.h > files.txt > duplo files.txt result.txt
で result.txt に結果が出力されます。 dir コマンドの /s オプションはフォルダを再帰的に見ていくオプションで、カレントフォルダのソースしかチェックしたくない場合は外しましょう。以下、結果。
(...重複箇所が列挙されているけど省略...) Results: Lines of code: 59468 Duplicate lines of code: 6075 Total 1155 duplicate block(s) found. Time: 29.89 seconds
うわ、多すぎ、と思ったら同じファイルを include している箇所までカウントされていた。
プリプロセッサの重複はカウントしないオプション (-ip) が既に用意されているようなので、それを使って再度チャレンジ。
> duplo -ip files.txt result.txt > type result.txt (snip) Results: Lines of code: 55860 Duplicate lines of code: 2203 Total 317 duplicate block(s) found. Time: 27.406 seconds
これでも結構あるなあ。 *.h 含めると IDE が自動生成したコードも含めてしまうというのもありそうだけど。変数名がいい加減でかぶってしまっている部分 (Panel1 とか Label2 とか) は改善の余地ありですが、同じイベントハンドラは同名でも仕方ないし。
でもどのファイルの何行目のどんなコードが重複しているかが簡単に把握できるので、リファクタリングにとても役立ちそう。余裕ができたら、これを活用して DRY 原則を徹底していこう。余裕ができたら……。