第 3 章 版管理システムを用いたクローン履歴抽出手法 47
3.4 クローン履歴関係抽出手法
合,これらの親子間にHTtが成り立つものとする.
ただし,クローンペアに一度でもなった部分全てを追いつづけるのは非効率で ある.また,何らかの変更が加わった場合には,その時点で過去のコードとの関 連は希薄になる.そこでテキストがほとんど変更されていない場合にのみクロー ン履歴対応関係があるものとする.
(2-a)版管理システムからFtを取得し,クローン解析手法を用いてCtを求める 入力: (版管理システム)
出力: Ft, Ct
まず当該時刻のプロダクトを Ft を版管理システムから取得し,クローン解析 を適用してCtを得る.前述のとおり,本研究においてはクローン解析手法として CCFinderを用いる.
(2-b)Ft−1 に関する全てのクローンについてHCtを求める 入力: Ft−1, Ft, Ct−1, Ct
出力:HCt
Ft−1 に含まれる全てのクローンペアについて,それぞれのクローンの子がFtに 関するクローンペアとなっているかどうかを検証する.もしこの条件を満たして いれば,それぞれの親子ペアはHCtに含まれるものとする.
(2-c){Ft−1∪Change∆t}に対してCCFinderを適用して,HAtを求める 入力:Ft−1, Ft, Ct−1, Ct
出力:HAt
次に Ft−1 と Change∆t の間にクローン解析を適用する.そして a ∈ Ft−1, b ∈
Change∆t なるクローンペア a, bがあれば,b が指す位置にあるクローンb0 ∈ Ct
を考え(a, b0)をHAtに加える.
実際に適用する際には,編集された行とその前後10行をChange∆tとする.本
研究ではCCFinderが検出するクローンの最小トークン数を初期設定の30トーク
ンで適用しているため,差分が30トークンよりも小さい場合にはクローンとして 検出されなくなる.前後10行を含めることで,このような差分を含むクローンを 適切に扱うことができる.
(2-d)Ct−1 の残りとCTt−1についてHTtを求める 入力:Ft−1, Ft, Ct−1, HCt, HAt, CTt−1
出力:HTt
最後にCt−1に含まれるコード片のうちHCt, HAt内のペアに含まれないコード 片,およびCTt−1 に含まれるのコード片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∈Ft−1からコード片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)
• 開始行の一行前に挿入
• 終了行に挿入
本研究においてはFt−1 → Ftへの写像のみを扱うため,削除操作ではこのよう な複数候補を考える必要はない.
以上述べた3つの編集操作による影響をすべて足しあわせて写像先を決定する.