閑古鳥

オールドプログラマの日記。プログラミングとか病気(透析)の話とか。

Duplo

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 原則を徹底していこう。余裕ができたら……。