• 検索結果がありません。

クローン履歴関係抽出手法

第 3 章 版管理システムを用いたクローン履歴抽出手法 47

3.4 クローン履歴関係抽出手法

合,これらの親子間にHTtが成り立つものとする.

ただし,クローンペアに一度でもなった部分全てを追いつづけるのは非効率で ある.また,何らかの変更が加わった場合には,その時点で過去のコードとの関 連は希薄になる.そこでテキストがほとんど変更されていない場合にのみクロー ン履歴対応関係があるものとする.

(2-a)版管理システムからFtを取得し,クローン解析手法を用いてCtを求める 入力: (版管理システム)

出力: Ft, Ct

まず当該時刻のプロダクトを Ft を版管理システムから取得し,クローン解析 を適用してCtを得る.前述のとおり,本研究においてはクローン解析手法として CCFinderを用いる.

(2-b)Ft1 に関する全てのクローンについてHCtを求める 入力: Ft1, Ft, Ct1, Ct

出力:HCt

Ft1 に含まれる全てのクローンペアについて,それぞれのクローンの子がFtに 関するクローンペアとなっているかどうかを検証する.もしこの条件を満たして いれば,それぞれの親子ペアはHCtに含まれるものとする.

(2-c){Ft1∪Change∆t}に対してCCFinderを適用して,HAtを求める 入力:Ft1, Ft, Ct1, Ct

出力:HAt

次に Ft1Change∆t の間にクローン解析を適用する.そして a Ft1, b

Change∆t なるクローンペア a, bがあれば,b が指す位置にあるクローンb0 Ct

を考え(a, b0)をHAtに加える.

実際に適用する際には,編集された行とその前後10行をChange∆tとする.本

研究ではCCFinderが検出するクローンの最小トークン数を初期設定の30トーク

ンで適用しているため,差分が30トークンよりも小さい場合にはクローンとして 検出されなくなる.前後10行を含めることで,このような差分を含むクローンを 適切に扱うことができる.

(2-d)Ct1 の残りとCTt1についてHTtを求める 入力:Ft1, Ft, Ct1, HCt, HAt, CTt1

出力:HTt

最後にCt1に含まれるコード片のうちHCt, HAt内のペアに含まれないコード 片,およびCTt1 に含まれるのコード片aについて,その子bとのテキスト類似 度を計測してHTtの抽出を行う.テキスト類似度は以下の式で定義する.

T extSim(a, b) = 2|a∩b|

|a|+|b|.

ただし|a|=aの行数,|a∩b|はGNU diffによって同一と判定された行数とする.

そしてテキスト類似度が0.7以上のコード片bが存在したとき,(a, b)∈HTtとす

る.なお,コード片aに対して子は複数ありうるため,HTtの条件を満たすコー ド片も複数存在し得る.このときには類似度が最大のコード片のみをHTtの対象 とする.

このようにHTtの判定条件は,ほぼ同一のテキストかどうかの判定となってい る.もしクローン自身も何らかの変更があった場合には,この部分はChange∆tに 含まれるため HAtの解析対象となる.従ってHTtの解析を行う際には,そのよ うなケースを考慮する必要はない.

3.4.3 コード片の写像

t

t-1 t-1 t

2

t t-1

b’ b’’

b a

a b

a

b

6

2

4

2

4

6

b, b’, b’’

a

Case 3

Case 2 Case 1

図3.5: コード片の写像

本節ではコード片a∈Ft1からコード片b ∈Ftへの写像について述べる.

56

まず時刻t−1と時刻t において,コード片 aが含まれるファイルに変更がな かった場合,aの写像先bの開始行,終了行はaと全く同じとする.

次に,コード片aが含まれるファイルに何らかの編集操作が行われていた場合 を考える.もしaよりも前の部分に変更箇所があれば,その内容に応じて写像先b の開始行,終了行を調整する.図3.5のCase 1はコード片aの前で編集操作が行 われた場合の例である.このとき,aの前で行われた編集操作の全てを勘案してa の写像先bの開始行,終了行はaのそれのそれぞれ4行後ろとする.またaに含 まれる部分に変更が加えられていた場合には,その内容に応じてb の終了行を調 整する.図3.5 のCase 2ではa内に2行新しい行が追加されているため,bの終 了行はaのそれに対して2行追加した値とする.

最後に,クローン片の端の部分で書きかえ操作が発生した場合について述べる.

図3.5のCase 3ではコード片aの開始行を跨がる形で書きかえされている.この

ような場合,「コード片aの上に2行挿入があった」という解釈と,「コード片aに 2行の挿入がされた」という解釈,およびその中間(1行がコード片の上に,1行は コード片a中に挿入された)が成りたつ.そこで,これら全てのケースをコード片 aの子とする.このように複数の子が生成されるケースは以下の3つである.

開始行,終了行が編集されている箇所を含む(図3.5 Case 3)

開始行の一行前に挿入

終了行に挿入

本研究においてはFt1 Ftへの写像のみを扱うため,削除操作ではこのよう な複数候補を考える必要はない.

以上述べた3つの編集操作による影響をすべて足しあわせて写像先を決定する.

関連したドキュメント