
コピペ管理
"コピペコードは、あらゆるソフトウェアの諸悪の根源です "(Robert C. Martin 著、Clean Codeより) 開発遅延やバグの発生の原因となるコピペを適切に管理することでソフトウェア品質を常に健全に保ちましょう。
日々増加するコードをくまなく調べ、コピペを検出
既存のソースコードをコピー&ペーストする行為は、おそらく誰しも経験したことがあるでしょう。しかし、そのようなコピペコードが増えてくると、あるコードを変更した場合、対象のコードだけではなく関連するコピペコードを漏れなく全て検索し、それら全てのコードに対して同じ修正が必要か否か判断しなければなりません。ソフトウェアの規模が大きくなるに従い、この作業の難易度は指数関数的に増加し、バグの頻発や開発の遅延を引き起こします。
Siderscan は、初回の解析でプロジェクト全体に存在するコピペコードを分析し、概要レポートを作成します。さらに、毎日の開発で追加・更新されるコードを分析し、新たに生成されたコピペがあればユーザーに通知します。
nominal_D_overlap[i] = LAYERS[i]->getDIM_D() - offs; //
}
DIM_D += LAYERS[N_LAYERS-1]->getDIM_D();
}
- int MultiSliceVolume(int i, int j) {
if (j==0)
return LAYERS[i]->getDIM_V();
else if(j==1)
return LAYERS[i]->getDIM_H();
else if(j==2)
return LAYERS[i]->getDIM_D();
nominal_D_overlap[i] = LAYERS[i]->getDIM_D() - offs; //
}
DIM_D += LAYERS[N_LAYERS-1]->getDIM_D();
}
+ int MultiLayerVolume(int i, int j) {
if (j==0)
return LAYERS[i]->getDIM_V();
else if(j==1)
return LAYERS[i]->getDIM_H();
else if(j==2)
return LAYERS[i]->getDIM_D();
※名前空間が異なるが、ロジックは左右のファイルで同じであるためコピペコードとして検出されている例
革新的なコピペ検出アルゴリズム
コピペコード(重複コード、クローンコードとも呼ばれます) 検出は、処理速度と検出精度の両面を改善するために、現在までに様々なアルゴリズムが提唱されてきました。各種検出アルゴリズムが検出できるコピペコードは、類似コードペア間の差異の度合いに基づき、学術的には4つのタイプに分類されています。
Siderscanの重複コード検知は、特許出願中の独自アルゴリズムを採用しており、大規模プロジェクトであっても高速にType 3までのコピペコードを検出可能です。つまり、完全に同じ文字列のコピペだけではなく、コピペ後に変数名や関数名の一部変更や、文単位の変更や挿入などの編集があったとしても、追従してコピペとして検出可能です。
Type 1
空白、タブ、改行などのコーディングスタイルの違いを許容して一致するコードType 2
Type 1 に加えて、変数名、関数名、型名などの字句(トークン)単位での違いを許容して一致するコードType 3
Type 2 に加えて、文単位の変更・挿入・削除などによる違いを許容して一致するコードType 4
実装方法は異なるが、処理は同じ(同じ入力に対して同じ出力を返す) コード
詳細分析のためのコードビューワー
Siderscan では、報告された各「コピペ」の詳細検討のためのコードビューワが提供されています。メールで送信されるレポートについているリンクをクリックすることで、標準的なブラウザでコピペの詳細が閲覧できます。
コピペは1対1 とは限りません。Siderscan では、同類とみなされるコピペコードをその数にかかわらず「グループ」としてまとめます。
Sinderscan のコードビューワでは、グループ内のコピペコードを1対づつサイド・バイ・サイドで表示し、2つのコード間の差異を強調表示します。検出されたコピペが、現時点で許容できるものか、あるいはすぐに対処すべきものであるのか、併せて表示される「類似度」や「コピペのサイズ」などの統計情報も参考にして検討してください。