社団法人 電子情報通信学会
THE INSTITUTE OF ELECTRONICS,
INFORMATION AND COMMUNICATION ENGINEERS

信学技報
TECHNICAL REPORT OF IEICE.

アイテムセットマイニングを利用した
コードクローン分析作業の効率向上
宮崎 宏海†

肥後 芳樹†

井上克郎†† 大阪大学 大学院情報科学研究科〒 560-8531 大阪府豊中市待兼山町 1-3
E-mail: †{h-miyazk,higo,inoue}@ist.osaka-u.ac.jp
あらましソフトウェア保守を困難にしている要因の 1 つにコードクローンがある．コードクローンとはソースコー

ド中に存在するコード片で，他のコード片と同一または類似しているものを指す．コードクローン分析支援の手法としてコードクローンの可視化がある．散布図は可視化手法の 1 つで，コードクローンの分布状況を瞬時に把握できるが，個々のコードクローンを分析する場合はどの部分から分析すべきか判断しづらい．これは，散布図上からはコー
ドクローンの特徴を取得しづらいためである．本研究では，アイテムセットマイニング手法を用いてコードクローンの出現パターンを求め，その情報を散布図上に付加する手法を提案する．個々のコードクローンではなくその出現パ
ターンに着目することで，より巨視的な視点で類似部分を知ることができ，効率的な分析が可能になると考えられる．
そして，ツールを実装して適用実験を行い，手法の有用性を確認する．
キーワード

コードクローン，可視化，散布図，アイテムセットマイニング

Increasing Code Clone Analysis Eﬃciency Using Itemset Mining
Hiromi MIYAZAKI† , Yoshiki HIGO† , and Katsuro INOUE†† Graduate School of Information Science and Technology, Osaka University, 1-3 Machikaneyama-cho,
Toyonaka, Osaka 560-8531, Japan
E-mail: †{h-miyazk,higo,inoue}@ist.osaka-u.ac.jp
Abstract One of the factors that makes software maintenance more diﬃcult is code clone. A code clone is a codefragment that is similar or identical to other code fragments. Code clone visualization is one of the code clone analysis methods. Scatter plot is a widely used visualization, and we can ﬁgure out how code clones are distributed in
the software system at once. However, it is hard to understand where to start analysis if we analyze individual code
clone. This is because it is hard to get code clone features. Hence we propose a method using itemset mining to getcode clone appearance patterns and adding the patterns into a scatter plot. We can identify larger or structurally
similar sections of the software system, so that we can eﬃciently analyze code clones. We implement a tool andcheck usability of our method.
Key words Code Clone, Visualization, Scatter Plot, Itemset Mining

1. は じ め に

これまでに，コードクローンに関して様々な研究が行われてきた [2] [3] [4]．著者らの研究グループでもコードクローン検出

ソフトウェアの保守作業を困難にしている要因の 1 つにコー

ツール CCFinder [6] を開発している．CCFinder はコードク

ドクローンがある．コードクローンとは，ソースコード中に存

ローンを高速で検出できるツールであるが，その出力結果であ在するコード片で互いに同一もしくは類似したコード片を持つるコードクローン情報はテキスト形式であるため，そのままのものを指し，主にコピーアンドペーストによって生成される．

形式でコードクローン分析作業を行うのは効率的ではない．そコードクローンであるコード片に修正が生じた場合，コードク

こで，分析作業を支援するために散布図 [10] を実装した．散布

ローン全てに同一の修正を検討する必要があるが，大規模なソ図を用いることで，コードクローンの分布状況を把握できる．

フトウェアに対してこのような修正を行うことは極めて困難である．

散布図はコードクローンの分布状況を瞬時に知り得る点で有用であるが，個々のコードクローンに対して分析を行う際にど

—1—

F1

F2

F3

a b c a b c c c a b d e f

C4
F1

C2
C5

C3

F2

図 1 クローンペアとクローンセット
F3

こから分析を行えばよいか判断しづらい．
本研究では，アイテムセットマイニングを用いて，コードクる手法を提案する．コード片はファイルが持つ機能の一部を表しているため，複数のコードクローンを共有するファイルは，そうでないファイルに比べて，より類似度が高いと考えられる．
そこで，コードクローンのセットを散布図上に表示することで，より効率的なコードクローン分析を行うことができると考えられる．
そして，手法を実装して，あるソフトウェアに対して適用し，取得した出現パターンの内容について調査を行った．

2. コードクローンの可視化
本節では，コードクローンとその可視化について述べる．

2. 1 コードクローン
コードクローンとは，ソースコード中に存在するコード片で，他のコード片と同一もしくは類似しているものを指す．ここで，コードクローンをより良く表現するために，クローンペアとク
ローンセットの 2 つの言葉を説明する [6]．クローンペアとは，互いに同一もしくは類似しているコード片の対を指す．クロー
ンセットとは互いに類似したコード片の集合を表しており，同一のクローンセットに属する任意の 2 つのコード片はクローンペアとなる．
図 1 はクローンペアとクローンセットの例である．この図には 5 つのコードクローンがあり，C1 ,C3 ,C4 は互いに類似しており，C2 と C5 も互いに類似している．従って，図 1 には（C1 ,C3 ）（C1 ,C4 ）（C3 ,C4 ）（C2 ,C5 ）という 4 つのクローンペ
アと，｛C1 ,C3 ,C4 ｝｛C2 ,C5 ｝という 2 つのクローンセットが存在することになる．

2. 2 散 布 図
CCFinder ではコードクローンの情報をテキスト形式で扱っているため，そのままの形式で人間が分析を行うのは困難である．そこで，コードクローンを可視化する手法として散布
図 [10] がある．
図 2 は散布図をモデル化したものである．散布図では左上を起点として，右方向および下方向にファイルの絶対パス順に
ソースファイルが並べられている．この時各ソースファイルはトークン単位に分割され，縦方向の要素と横方向の要素が一定数以上連続して一致している場合，そのセルに点をプロットする．つまり，散布図上では，コードクローンはある一定以上の長さを持った線分として出現する．例えば，図 2 で F3 の 1

F4

ローンの出現パターンを取得し，その情報を散布図上に付加すa b c a b c c c a b d e f a b c c d e f

C1

F4
a b c c d e f

F1，F2，F3，F4 ：ファイル：縦方向と横方向の要素が一致する箇所

図 2 コードクローンの散布図のモデル

番目〜3 番目のトークンと F4 の 3 番目〜5 番目のトークンが「d,e,f」であるため，この部分をトークン数が 3 のコードクロー
ンとして抽出できる．このように，散布図を見ることでコードクローンの分布状況を瞬時に把握することが可能である．
しかし，散布図にはコードクローンの分布状況を瞬時に把握できるという利点があるが，個々のコードクローンを分析した
い場合にどこから調査を行うべきか判断が難しいという問題点がある．図 2 の散布図を見た場合に，コードクローンが多い箇所を特定できても，そこに分析を行うべきコードクローンがあるとは限らない．これは，散布図上からはコードクローンの特徴やコードクローン間の関係，コードクローンを含むファイルの特徴など，分布状況以外の情報を取得出来ないからである．
そのため，コードクローン分析の効率化を図るには散布図上で特徴的なコードクローンを表示する必要がある．

2. 3 関 連 研 究
コードクローンの可視化を行った研究としては，Kapser らが理解支援を目的としたツールとして CLICS を開発している [7]．

CLICS はファイル間の依存関係を表すグラフにコードクロー
ン情報を付加して表示している．また，クエリによるコードク
ローンの検索機能も実装しており，ユーザーはコードクローンのサイズなどをクエリとして与えることで，その条件を満たす
コードクローンの情報を取得することができる．

Adar らは，複数バージョン間のクラスやメソッド間の依存関係とコードクローン関係を表示するツール SoftGUESS を開発しており [1]，バージョン毎のコードクローンの比較を行っている．このツールを用いることで，バージョンを通して出現し続けているコードクローンや，バージョン間で修正が加わった
ことで削除されたコードクローン，新たに生成されたコードク
ローンなど，コードクローンの遷移を把握することができる．

Rieger らは Polymetric View [8] を用いてコードクローンの可視化を行っている [9]．Polymetric View では要素の位置，高さ，幅，色，要素間の辺などがそれぞれコードクローンの特徴を表しているため，特徴的な箇所を瞬時に判断できる．Rieger—2—らの手法では，ディレクトリツリーと各ファイルに含まれる

1．データベース中の総出現回数がサポート値以上である頻出アイテムの集合CFを抽出

コードクローンの量や同型のコードクローンの量を同時に表示

2．各トランザクションでアイテムを総出現回数の降順でソート
3．FP-treeの根の部分となるrootを作成しており，ファイル内で閉じたコードクローンなのか，多くの4．for each t ∈ T(全てのトランザクション){

ファイルで共有されているコードクローンなのかを容易に把握できるようになっている．

5．

t が含む頻出アイテムの集合Ctを抽出(Ct ⊆CF)

6．

insert_item (Ct, root){7．}

散布図による可視化を行った研究もこれまでにいくつか行わ

8．insert_item (アイテムの集合C, ノードN){れている．Ducasse ら [4] は，バージョン毎の散布図から，コードの追加や削除が行われた箇所を把握出来るかを調査した．そ9．

Cで先頭のアイテムxを取得

10．

if(Nの子ノードに x を持つノードNxが存在){

して，縦軸を古いバージョン，横軸を新しいバージョンとする

11．

Nxのカウントを1増やす

12．

散布図を調べ，修正を加えた箇所はコードクローンとならない
ことから，バージョン間でコードの追加や削除が行われた箇所を把握できるという結果を得ている．

N = Nx

13．

}

14．

else{

15．

アイテム x とカウント1を持つNewNodeを作成

16．

Nの子ノードにNewNodeを追加

17．

3. FP-Growth18．

N = NewNode}

19． Cからxを除去

20． if(Cに属するアイテムがある){

本手法では，対象とするソースコード中に頻出するコードク

21．

ローンの出現パターン (以後，頻出パターン) を効率的に見つけ22．

るために，アイテムセットマイニング手法である FP-growth [5]insert_item(C, N)}

23．}を用いている．FP-growth では FP-tree という木構造のグラフ
図 3 FP-tree 作成のアルゴリズムを利用しており，各ノードはアイテムとカウントを保持している．アイテムとは出現パターンを構成する要素であり，トラン
ザクションには複数のアイテムが含まれ，データベースには複数のトランザクションが含まれている (表 1 参照)．また，カウントはそのアイテムを含むパターンが出現するトランザクショ

上記の性質を持つ FP-tree は，図 3 のアルゴリズムで構築される．なお，入力はデータベースとし，出力は root を根とする木である．
表 1 のデータベースに図 3 のアルゴリズムを適用した場合，ンの数を表す．

FP-tree には以下のような性質がある．これらの性質を利用して頻出パターンを取得する．なお，頻出パターンかどうかは，
データベース上でのそのパターンの出現回数が閾値以上かどうかで判断するが，この閾値をサポート値と呼ぶ．

図 4 のような FP-tree が構築される．図 4 では FP-tree の他に，各頻出アイテムを保持するノードへのリンクを保持したテーブルを作成している．破線の矢印をたどれば，その頻出アイテムを保持するノードに辿りつくようになっている．
こ の FP-tree か ら ア イ テ ム p を 含 む 頻 出 パ タ ー ン を性質 1: FP-tree 上に存在する全てのアイテムは，データベー

抽 出 す る 場 合 に つ い て 考 え る ．ア イ テ ム p と カ ウ ン ト

ス中にサポート値以上の回数出現するアイテム (以後，頻出ア2([p:2] と 表 記) を 持 つ ノ ー ド か ら root ま で の 経 路 に はイテム) である[f:4],[c:3],[a:3],[m:2],[p:2] を 持 つ ノ ー ド が あ る ．ま た ，

性質 2:

ノードが保持するカウントは，親ノードが保持するカ[p:1] を持つノードから root までの経路には [c:1],[b:1],[p:1]

ウント以下かつ子ノードが保持するカウント以上である (ただを持つノードがある．前者からはアイテムの集合｛f,c,a,m,p｝

し root は除く)

が 2 つのトランザクションに表れていることが，後者からは

性質 3:｛c,b,p｝が 1 つのトランザクションに表れていることがそれぞ

各ノードから root までの経路に存在するノードが保持するアイテムは全て同一トランザクションに含まれる

れ分かる．これらの情報から，p は 3 つのトランザクションで

性質 4:

性質 3 より，ノード N から root までの経路をたどる

c と，2 つのトランザクションで a,f,m と，1 つのトランザク

ことで，N が保持するアイテムを含む出現パターンを検出でションで b と同時に出現していることが求められる．そのため，きる

3 つ以上のトランザクションに含まれる出現パターンを頻出パ

性質 5:

性質 4 より，検出された出現パターンを持つトランザ

クションは，ノード N のカウント数だけ存在するターンとする場合，このデータベース中でアイテム p を含む頻出パターンは (c,p) と (p) の 2 つであることが分かる．

4. 提 案 手 法

表 1 データベースの例
トランザクション

アイテム

頻出アイテム

ID

ID

ID

1

a,c,d,f,i,m,pf,c,a,m,p2

a,b,c,f,l,m,of,c,a,b,m3

b,f,h,j,of,b4b,c,k,p,s

c,b,p

5

a,c,e,f,l,m,n,pf,c,a,m,p

本節では，コードクローンの頻出パターンを取得する手法について説明する.

4. 1 概要

本手法は以下の手順で，コードクローンの頻出パターンを構
築する．

—3—

頻出
アイテムIDを含むファイルのファイルの集合F1を含むファイルのファイルの集合F2
C3を含むファイルのファイルの集合F3
パターンをパターンを含むファイルのファイルの集合F
全てのファイルてのファイル

root

ノードへの
ノードへの
リンク

C1

C2

c:1

f:4

f
c:3

c
a

b:1

a:3

p:1

b
m

b:1

m:2

(a) 任意の i で F ⊂ Fi の場合

b:1

を含むファイルのファイルの集合F1を含むファイルのファイルの集合F2
C3を含むファイルのファイルの集合F3
パターンを
ファイルの集合F
パターンを含むファイルの全てのファイルてのファイル
C1

p
p:2

f:4

：ノード

アイテムID カウント
図4

C2

m:1

：親子関係（親子関係（ 側が親）：ノードへのノードへのリンク
へのリンク

表 1 から作成した FP-tree(サポート値は 3)(b) ある i で F ＝ Fi の場合

図 5パターンを含むファイルとパターンを構成するクローンセット

ID を含むファイルの包含関係

手順 1： コードクローンを検出する
手順 2： コードクローン情報から，クローンセット ID をアイ用なものであるかの調査を行う．

テム，ファイルをトランザクションとする FP-tree を構築する

5. 1 実 験 内 容

手順 3： 構築した FP-tree からクローンセット ID の頻出パ

本実験では，取得した頻出パターンがコードクローン分析に有用であるかどうかを，パターンの内容とそれを含むファイル

ターンを取得するの内容から判断する．
以下，各手順について説明していく．

4. 2 手順 1:コードクローンの検出
既存のコードクローン検出ツールを用いて，対象ソースファ
イルからコードクローンを検出する．また，手順 2 でクローンセットの情報を用いるためクローンセットの情報を構築する．

4. 3 手順 2：FP-tree の作成
本手法では，クローンセット ID をアイテムとした．

FP-tree の作成の手順としては，まず頻出パターンを構成す
るコードクローン数の閾値と，含むファイル数の閾値を設定す
る．次に，各ファイルにどのコードクローンが含まれているか調べ，トランザクションを構築する．この時，閾値以上のファイルに含まれるクローンセットの ID を頻出クローンセット IDとする．なお，1 つのクローンセットに属するコードクローン
が，2 つ以上同じファイルに含まれている場合は，それらは異なる ID を持つものとする．そして，頻出クローンセット ID をアイテムとする FP-tree を作成する．FP-tree の各ノードはク
ローンセット ID とカウントを保持している．

4. 4 手順 3：頻出パターンの取得
手順 2 で作成した FP-tree から，頻出パターンを求める．この時，頻出パターンを構成するコードクローンの数とそれを含むファイルの個数は共に閾値以上である．
なお，同じファイルに含まれており，構成するクローンセッ
ト ID が包含関係になっている (例：表 2)2 つの頻出パターンがある場合，包含されているものを削除する．これは，包含されている頻出パターンは，包含しているものに比べて新たに得ら

まずは，頻出パターンを構成する各コードクローンが，パターンを含むファイルが持つ機能を表すものとして適切である
かどうかを調べる．適切であれば，同じパターンを含む 2 つのファイルは，そうでない 2 つのファイルより類似しているといえる．
次に，パターンを含むファイルと，構成するクローンセット

ID を含むファイルの包含関係を調べる．パターンを含んでいるファイルの集合を F ，パターンを構成するコードクローンを

C1 ,C2 ,..,Cn ，Ci と同型のコードクローンを含むファイルの集
合を Fi と表す．図 5 は，F と Fi の包含関係を表しており，Fが各 Fi の積集合となっていることが分かる．もし，任意の i でF ⊂ Fi ならば (図 5(a))，単一のコードクローンからは得られない，特定の機能を持つファイルの集合を得る (以後，ファイルを絞り込む) ことができる．しかし，ある i で F ＝ Fi ならば (図 5(b))，単一のコードクローンを含むファイルの集合と違いがなく，パターンを用いる意義が薄いといえる．
これら 2 つの項目を調べることで類似した機能を持つファイルの集合を取得でき，効率的な分析が可能になると考えている．
この実験では，コードクローン検出ツールは CCFinder を用
いた．CCFinder では，コードクローンを構成するトークン数の最小値を定める必要があるが，この実験では 30 とした．実験の対象とするプロジェクトは JHotDraw(バージョン 5.4) とした．JHotDraw には 484 個の Java ファイル (総行数：71736
行) が含まれており，コードクローンは 1604 個，クローンセッ
トは 323 個取得できた．また，頻出パターンを含むファイルのれる情報がないと判断したためである．

5. 実

験

表 2 クローンセット ID が包含関係になる例
頻出パターン ID クローンセット ID

ファイル ID

本節では，提案手法を実装したツールを用いてコードクロー

1

a,b,c,df1,f2,f3,f4ンの頻出パターンを取得し，それらがコードクローン分析に有

2

a,b,c

f1,f2,f3,f4—4—

数は最少で 2 個，構成するコードクローンの数は最少で 2 個とpublic void draw(Graphics g) {Rectangle r = displayBox();した．

5. 2 実 験 結 果

g.setColor(Color.yellow);g.fillOval(r.x, r.y, r.width, r.height);

JHotDraw からは頻出パターンを 40 個取得することができ

g.setColor(Color.black);g.drawOval(r.x, r.y, r.width, r.height);

た．取得したパターンの一部と，パターンを含んでいるファイルについて以下で紹介する．

(a) 3 つのファイルで定義されている draw メソッド

5. 2. 1 取得した頻出パターン 1
1 つ目の頻出パターンとして，「PolygonScaleHandle.java」

protected boolean resetPolygon() {「TriangleRotationHandle.java」「RadiusHandle.java」の 3 つ

FigureEnumeration fe = getAffectedFigures();のファイルが含むものがある (図 6)．このパターンは 2 個のif (!fe.hasNextFigure()) {return false;}

コードクローンで構成されている．図 6(a) のコード片は，3 つのファイルでメソッド名が等しい，図形を描画する draw メソッ

PolygonFigure figure = (PolygonFigure)fe.nextFigure();Polygon backupPolygon = figure.getPolygon();figure.willChange(

ドの一部である．図 6(b) 図 6(c) 図 6(d) は類似したコード片で，メソッド名は異なるが，それぞれ図形を 1 つ前の状態に戻すメソッドの一部である．これらのことから，この頻出パター
ンには「図形を描画する」「図形を 1 つ前の状態に戻す」とい(b) PolygonScaleHandle.java が含む類似コード片

protected boolean resetRelationAngle() {う 2 つの情報が含まれており，3 つのファイルが図形を処理す

FigureEnumeration fe = getAffectedFigures();

るファイルであることが分かる．

if (!fe.hasNextFigure()) {return false;}

5. 2. 2 取得した頻出パターン 2
そ の 他 の 頻 出 パ タ ー ン と し て「ChangeAttributeCom-

TriangleFigure figure = (TriangleFigure)fe.nextFigure();double backupAngle = figure.getRotationAngle();figure.willChange(

mand.java」と「SendToBackCommand.java」の 2 つのファイルが含むものがあった．図 7 は，この 2 つのファイルでパターンを構成するコード片である．メソッド execute() の一部であるコード片では複数の図形を対象としたコマンドの実行を記述(c) TriangleRotationHandle.java が含む類似コード片
protected boolean resetRadius() {しており，メソッド undo() の一部であるコード片ではそのファ

FigureEnumeration fe = getAffectedFigures();

イルが記述するコマンドの取り消し処理を記述している．これif (!fe.hasNextFigure()) {return false;}

らのことから，この頻出パターンでは「複数の図形を対象にしたコマンドを実行する」「そのコマンドを取り消す」という 2

RoundRectangleFigure currentFigure =(RoundRectangleFigure)fe.nextFigure();Point FigureRadius = currentFigure.getArc();
currentFigure.setArc(

つの情報が含まれており，2 つのファイルがコマンド処理を行うファイルであることが分かる．

5. 2. 3 パターンを含むファイル(d) RadiusHandle.java が含む類似コード片

ファイルの絞り込みが出来ているパターンは，JHotDraw か

図 6 3 つのファイルから取得した頻出パターンの例

ら取得したパターン 40 個のうち 6 個であった．頻出パター
ン 2 もその 1 つである (表 3)．メソッド execute() の一部であるコードクローンを含むファイルは他に「BringToFront-

Command.java」がある．また，メソッド undo() の一部である コ ー ド ク ロ ー ン を 含 む ファイ ル は 他 に「ConnectedText-

Tool.java」「AlignCommand.java」がある．これらのことから，「ChangeAttributeCommand.java」と「SendToBackCom-mand.java」は「BringToFrontCommand.java」とは異なり「そのコマンドを取り消す」という機能を持ち，「ConnectedText-

Tool.java」「AlignCommand.java」とは異なり「複数の図形を対象にしたコマンドを実行する」という機能を持っていることが分かる．これにより，パターンを用いることで特定の機能を持つファイルの集合を求めることができたといえる．

6. 考

察

JHotDraw に対して実験を行い，取得した頻出パターンを調べたところ，ファイルが持つ機能を表すものとして適切なものが見つかった．また，頻出パターンを含むファイルを調べたと
ころ，パターンを構成するクローンセット ID を含むファイルとの間に包含関係が成り立つものがあり，特定の機能を持つファ

表 3 頻出パターン 2 を構成するコードクローンを含むファイル

イルに分けられていた．これらのことから，頻出パターンを用

execute() の一部である

undo() の一部である

コードクローンを含むファイル

コードクローンを含むファイル

BringToFrontCommand.java

AlignCommand.java

ChangeAttributeCommand.java

ChangeAttributeCommand.java

しかし，パターンを含むファイルと，パターンを構成するク

SendToBackCommand.java

ConnectedTextTool.java

ローンセット ID を含むファイルとの間に包含関係があるパター

SendToBackCommand.java

ンは 40 個中 6 個と少なかった．また，頻出パターン 2 で得らいることで，単一のコードクローンからは得られない情報を得られることが分かった．

—5—

得られない，類似した機能を持つファイルの集合を得ることがpublic void execute() {super.execute();setUndoActivity(createUndoActivity());
getUndoActivity().setAffectedFigures(view().selection());
FigureEnumeration fe =getUndoActivity().getAffectedFigures();while (fe.hasNextFigure()) {fe. nextFigure().setAttribute(fAttribute, fValue);}

public boolean undo() {if (!super.undo()) {return false;}
FigureEnumeration fe = getAffectedFigures();while (fe.hasNextFigure()) {Figure f = fe.nextFigure();if (getOriginalValue(f) != null) {f.setAttribute(getAttribute(),getOriginalValue(f));}}
return true;}

でき，出現パターンをもとにコードクローンを分析することが有用であることが分かった．しかし，包含関係が成り立っていないパターンも多く検出され，複数のコードクローンを用いる

コードクローンの
コードクローンの出現パターン
出現パターンをパターンを構成する
構成する部分
する部分

public boolean undo() {if (!super.undo()) {return false;}
FigureEnumeration fe = getAffectedFigures();while (fe.hasNextFigure()) {Figure currentFigure =fe.nextFigure();int currentFigureLayer =getOriginalLayer(currentFigure);
getDrawingView().drawing().sendToLayer(
currentFigure, currentFigureLayer);}return true;}

今後の課題として，まず出現パターンの情報を散布図に付加することが挙げられる．次に，パターンを構成する要素の変更が挙げられる．具体的には，現在用いているコードクローンの代わりに 1 つの処理単位であるブロック文を使用する方法や，
コードクローンを構成するトークン数を変更する方法などが挙げられる．その他に，頻出パターンだけではなく，コードク
ローンのメトリクスやソフトウェアメトリクスの情報を散布図上に付加することで分析支援を行う手法も考えている．

(a) ChangeAttributeCommand.java のコード片
public void execute() {super.execute();setUndoActivity(createUndoActivity());
getUndoActivity().setAffectedFigures(view().selectionZOrdered());
FigureEnumeration fe =getUndoActivity().getAffectedFigures();while (fe.hasNextFigure()) {view(). drawing().sendToBack(fe.nextFigure());}

意義が薄いという結果も得られた．

8. 謝

辞

本研究は，IJARC(マイクロソフト産学連携機構) 第 3 回CORE プロジェクト，文部科学省科学研究費補助金基盤研究(A)(課題番号:17200001)，および若手研究 (スタートアップ)(課
題番号:19800022) の助成を得た．

コードクローンの
コードクローンの出現パターン
出現パターンをパターンを構成する
構成する部分する部分(b) SendToBackCommand.java のコード片

図 7 2 つのファイルから取得した頻出パターンの例

れたファイルと類似した機能 (メソッド execute() と undo())
を持つファイルとして「CutCommand.java」が存在しており，検出漏れがあったことが分かった．
検出漏れは，より小さいサイズのコードクローンを検出する
ことで改善できると考えている．そのために，コードクローンを構成するトークン数の最小値を変化させる方法がある．

7. まとめと今後の課題
本研究では，コードクローン分析を支援するために，コードクローンの出現パターンを取得する手法を提案した．提案手法
では，アイテムセットマイニング手法の 1 つである FP-growthを用いてコードクローンの頻出パターンを取得した．そして，

Java ソフトウェアである JHotDraw に対して適用したところ，
頻出パターンはファイルの機能を表すものとして適当であるこ

文

献[1] E. Adar and M. Kim. Visualization and Exploration of
Code Clones in Context. In 29th International Conference
on Software Engineering, pp. 762–766, May 2007.
[2] B. Baker. On Finding Duplication and Near-Duplicationin Large Software Systems. In Proc. of the 2nd Working
Conference on Reverse Engineering, pp. 86–95, 1995.
[3] I. Baxter, A. Yahin, L. Moura, M. Anna, and L. Bier. Clone
Detection Using Abstract Syntax Trees. In Proc. International Conference on Software Maintenance 98, pp. 368–
377, 1998.
[4] S. Ducasse, M. Rieger, and S. Demeyer. A Language Independent Approach for Detecting Duplicated Code. In Proc.
International Conference on Software Maintenance 99, pp.
109–118, 1999.
[5] H. JIAWEI, P. JIAN, Y. YIWEN, and R. M. Mining Frequent Patterns without Candidate Generation: A FrequentPattern Tree Approach. In Data Mining and Knowledge
Discovery, Vol. 29, pp. 1–12, 2000.
[6] T. Kamiya, S. Kusumoto, and K. Inoue. CCFinder: A
Multi-Linguistic Token-Based Code Clone Detection System for Large Scale Source Code. In IEEE Transactions on
Software Engineering, Vol. 28, pp. 654–670, 2002.
[7] C. Kapser and M. W. Godfrey. Improved Tool Support for
the Investication of Duplication in Software. In 21st International Conference on Software Maintenance, pp. 305–
314, 2005.
[8] M. Lanza and S. Ducasse. Polymetric Views: A Lightweight
Visual Approach to Reverse Engineering. In IEEE Transactions on Software Engineering, Vol. 29, pp. 782–795,
September 2003.
[9] M. Rieger, S. Ducasse, and M. Lanza. Insights into SystemWide Code Duplication. In 11th Working Conference on
Reverse Engineering, pp. 100–109, November 2004.
[10] 植田, 神谷, 楠本, 井上. 開発保守支援を目指したコードクローン
分析環境. 電子情報通信学会論文誌, 第 86-D-I 巻, pp. 863–871,
2003.

とが分かった．次に，パターンを含むファイルと，パターンを構成するクローンセット ID を含むファイルとの間に包含関係が成り立つものがあることから，単一のコードクローンからは—6—