arrow-up icon
Image

コピペ管理

"コピペコードは、あらゆるソフトウェアの諸悪の根源です "(Robert C. Martin 著、Clean Codeより) 開発遅延やバグの発生の原因となるコピペを適切に管理することでソフトウェア品質を常に健全に保ちましょう。

deco-blob-1 decoration
graphical divider

日々増加するコードをくまなく調べ、コピペを検出

既存のソースコードをコピー&ペーストする行為は、おそらく誰しも経験したことがあるでしょう。しかし、そのようなコピペコードが増えてくると、あるコードを変更した場合、対象のコードだけではなく関連するコピペコードを漏れなく全て検索し、それら全てのコードに対して同じ修正が必要か否か判断しなければなりません。ソフトウェアの規模が大きくなるに従い、この作業の難易度は指数関数的に増加し、バグの頻発や開発の遅延を引き起こします。

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までのコピペコードを検出可能です。つまり、完全に同じ文字列のコピペだけではなく、コピペ後に変数名や関数名の一部変更や、文単位の変更や挿入などの編集があったとしても、追従してコピペとして検出可能です。

  • Checkmark icon

    Type 1

    空白、タブ、改行などのコーディングスタイルの違いを許容して一致するコード
  • Checkmark icon

    Type 2

    Type 1 に加えて、変数名、関数名、型名などの字句(トークン)単位での違いを許容して一致するコード
  • Checkmark icon

    Type 3

    Type 2 に加えて、文単位の変更・挿入・削除などによる違いを許容して一致するコード
  • Checkmark icon

    Type 4

    実装方法は異なるが、処理は同じ(同じ入力に対して同じ出力を返す) コード

詳細分析のためのコードビューワー

Siderscan では、報告された各「コピペ」の詳細検討のためのコードビューワが提供されています。メールで送信されるレポートについているリンクをクリックすることで、標準的なブラウザでコピペの詳細が閲覧できます。

コピペは1対1 とは限りません。Siderscan では、同類とみなされるコピペコードをその数にかかわらず「グループ」としてまとめます。

Sinderscan のコードビューワでは、グループ内のコピペコードを1対づつサイド・バイ・サイドで表示し、2つのコード間の差異を強調表示します。検出されたコピペが、現時点で許容できるものか、あるいはすぐに対処すべきものであるのか、併せて表示される「類似度」や「コピペのサイズ」などの統計情報も参考にして検討してください。

コピペを管理し、チームで共有する手段を提供

コピペコードは、放置していれば、原因不明の不具合発生や、新規開発速度の鈍化を招きます。Siderscan では、単にコピペコードを検出するだけでなく、プロジェクト全体におけるコピペコードの増減の時系列変化を一覧できるダッシュボードを提供します。コピペコードの現状をチームで共有し、リファクタリング等に役立てましょう。

現時点では一旦放置するコピペ、アルゴリズムの誤検知によるコピペなどは、リストから削除することも可能です。属人的な記憶に頼らず、ツールでコピペを適切に管理していきましょう。

siderscan-bottle decoration

無料でコピペ解析を始める

1プロジェクトは無料で解析できます