
重複コード管理
"重複コードコードは、あらゆるソフトウェアの諸悪の根源です "(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つのコード間の差異を強調表示します。検出された重複コードが、現時点で許容できるものか、あるいはすぐに対処すべきものであるのか、併せて表示される「類似度」や「重複コードのサイズ」などの統計情報も参考にして検討してください。