はじめに
ソフトウェアをメンテナンスするうえで重要なことの1つとして、重複コード(クローンコード)の排除が必要ではないでしょうか?たとえば、同じロジックを2個所で使用していた場合、一方に修正が必要と判断されると、もう一方のコードも修正する必要があります。修正自体は簡易なものであっても、同じロジックを使用している別のコードを検索することに時間が掛かってしまいます。
Understandでは、クローンコードを検出する機能「Cloned Functions」がプラグインとして提供されています。今回はその機能の使用方法をご紹介します。
Cloned Functionsプラグイン
Cloned Functions プラグインは、Understand 7.0以降では標準で提供されています。Understand 6.3では、機能拡張プラグインとして弊社よりユーザー向けに提供していたものです。6.3をご利用の方はこちらのページより取得できます。(機能的な違いはありません)
ユーザー様向けページ:機能拡張プラグイン – Understand ユーザーサポート
準備
プラグインを使用するための準備をおこないます。ここでは、日本語最新版のUnderstand 7.0 build 1220を使用して説明します。
プラグインの有効化
Understand 7.0からは、プラグインの管理画面より有効化することで、プラグインを利用できるようになります。
クローンコードの検出プラグインを有効にします。
- Understand画面のメニューから[ツール]-[プラグインの管理]を選択します。
- [インタラクティブレポート]を選択し、インタラクティブレポートプラグインの一覧を表示します。
- [Cloned Functions]の[プラグインの有効化]ボタンを押し、[有効]状態にします。

プラグインの実行
Understandメニューから[プロジェクト]-[インタラクティブ レポート]を選択すると、一覧に[Cloned Functions]メニューが表示されます。こちらを選択して実行します。

実行すると、設定画面が表示されます。類似度に関して調整をおこなうことが可能です。

項目 | 説明 |
Contents Similarity | クローンコードと判定する類似度を指定します。(%) |
Function Name Similarity | 対象とする関数名の類似度を指定します(%) |
Min Token Langth | 関数の最低限のトークン数を指定します。この値以下の関数は対象外となります。 |
Max Token Langth | 関数の最大トークン数を指定します。この値を超えるサイズの関数は対象外となります。 |
Hide this window initially | 設定ウィンドウを次回から自動で表示しません。 |
結果の出力
インタラクティブレポートの結果はUnderstand上に新たなタブとして表示されます。
設定を変更して再度実行したい場合は、画面右上のスパナアイコンをクリックすると、設定画面が表示されます。

結果の保存
インタラクティブレポートの出力は通常、GUI上への表示のみとなりますが、「Understand フローティング with APIライセンス」をお持ちの場合は、画面上部のフロッピーアイコンから結果をHTML、PDFやテキスト(.txt)形式で保存することができます。
コマンドラインでの出力
Understand 7.0では、インタラクティブレポートの出力がコマンドラインにも対応しました。コマンドアイコンより出力コマンドをコピーして、コマンドラインに貼り付けて発行するだけで同じ結果を得ることができます。
こちらはAPIなしのライセンスでも利用可能です。

まとめ
上記の手順で簡単にクローンコードを検出することができます。また、設定を変更することで目的を絞った検出も可能です。たとえば、[Function Name Similarity]を0にすることで、関数名が異なる場合でも中身が同じようなものを見つけることができます。ここで見つけたクローンコードは、ライブラリなどに部品化することでメンテナンス性を向上させることが期待できます。是非一度ご自身のプロジェクトでお試しください。