仕事が山積していますが、気になったことを放置すると泥沼が深くなるので、気になるソフトを軽く試用してみました。
(あ、どこで見て知ったのだったか忘れてしまった。メモには書きのURLしか書いてなかったから、もう分からないな……。失敗)
ソースコードの重複をチェックするツールです。JavaやC#に利用できます。実行環境も、.NET Framework 1.1以上またはJava 1.4以上と両対応。
使い方 §
ZIPファイルの中身をローカルHDDのどこかに置きます。
そのあとで、以下のようなコマンドラインで起動します。(実行ファイルはフルパスを書くか、環境変数pathを通しておく)
c:\>simian-2.2.8.exe "-recurse=*.cs" >simian20060104.log
(カレントディレクトリから再帰的に*.csにあたるファイルを処理する)
実行結果例 §
Similarity Analyser 2.2.8 - http://www.redhillconsulting.com.au/products/simian/index.html
Copyright (c) 2003-05 RedHill Consulting Pty. Ltd. All rights reserved..
Simian is not free unless used solely for non-commercial or evaluation
purposes.
{failOnDuplication=true, ignoreCharacterCase=true, ignoreCurlyBraces=true,
ignoreIdentifierCase=true, ignoreModifiers=true, ignoreStringCase=true,
threshold=6}
Loading (recursively) *.cs from D:\w\Inet\ML4
Found 6 duplicate lines in the following files:
Between lines 26 and 32 in D:\w\Inet\ML4\Binder\SiteBind.cs
Between lines 34 and 40 in D:\w\Inet\ML4\Binder\MemberBind.cs
Between lines 79 and 85 in D:\w\Inet\ML4\Binder\BoardBind.cs
(中略)
Found 56 duplicate lines in the following files:
Between lines 615 and 690 in D:\w\Inet\ML4\TestLTEngine\TestLogManager.cs
Between lines 485 and 560 in D:\w\Inet\ML4\TestLTEngine\TestLogManager.cs
Found 3897 duplicate lines in 365 blocks in 76 files
Processed a total of 22078 significant (39776 raw) lines in 146 files
Processing time: 13.811sec
結果の感想 §
これは、某ソフトの自作ソースコードだったりしますが。(事情通にはバレバレ?)
指摘された箇所をいくつかチェックしてみましたが、実は見た目ほど重複は多くないということが分かりました。
最も目に付いたのは、#if false……で無効化されたコードと、有効なコードの一致性を指摘するものでした。
これは、昔書いた#if-#else-#endifを活用したソースコードの書き換えを実践したあと、「修正完了後には取り除いてしまうべきものです」としているにも関わらず取り除かれていなかった怠慢の産物です。
もう1つ目に付いたのは、自動化された単体テスト中での重複の指摘です。これについては、重複しても良い、というのが私の考えです。シンプルでぱっと見て分かりやすいテストコードのためには、同じ内容が複数のテストメソッドに散在するのはありだと思っています。
さて、上記の2つを除外した後、確かにいくつか重複しているコードが発見されました。これについては、時間があればじっくりと重複を取り除く価値があると感じました、まあ、あると言ってもあまり大きな価値ではありませんが。
ちなみにもう1つ。もう使用していないソースファイルを含んだディレクトリも残っていて、これも処理されてしまったことによる無意味な結果出力もあったことを補足しておきます。
Personal/SOHO向けライセンス99ドルの価値はあるか? §
これは難しい問い掛けで、結論は人によって異なるかもしれません。
個人的には、99ドルの価値はあると感じました。
ただし、実際に買うかどうかはこの先の成り行き次第です。