第 4 章 プログラム変更の集約手法 39
4.3 集約規則と規則の適用手順
にスナップショットS4がそれぞれ作成された場合は,そのときのafterCMB1 は S2,beforeCMB2 はS3のものとなり,これら2つのソースファイルから作成され るASTはそれぞれのノードのオフセットなどが異なる場合があり,完全に同一で はない.しかし,S2とS3の間にはメソッド本体のASTの構造や値を変化させる 書き換えは行われていないため,afterCMB1 とbeforeCMB2 からそれぞれ作成さ れるASTの構造と値は同一とみなせる(仮にメソッド本体の構造や値に変化があ る場合はS2とS3の間でCMBが特定される).
少なくともafterCMB1 とbeforeCMB2 から作成されるASTの構造や値が同じ であれば,N PCM B1とN PCM B2のノードの集合の比較は可能である.ノードの集 合の比較の際には,その前にあらかじめafterCMB1 とbeforeCMB2からそれぞれ 作成された2つのASTをそれぞれ同じ探索アルゴリズムで探索し,それらのAST に含まれるノードに対して,探索した順番を表すIDを割り振っておく.そして,
N SCM B1とN SCM B2に存在するそれぞれのノードの比較する際(アルゴリズム8
の3行目)に,それらに存在するノードに割り振られたIDが同じかどうかで判断 すればよい.
4.3. 集約規則と規則の適用手順 47
表 4.2: 集約規則
番号 規則 説明
1 φ=AC,{CCN|MC},DC クラスの追加直後のそのクラスの削除は,
変更なしとみなす
2 φ=AF,{CFI|MF},DF フィールドの追加直後のそのフィールドの削除は,
変更なしとみなす
3 φ=AM,{CMI|MM},DM メソッドの追加直後のそのメソッドの削除は,
変更なしとみなす
4 AC=AC, [CCN|MC] クラスの追加直後のそのクラスの移動や
情報の書き換えは,一つのクラスの追加とみなす 5 AF=AF, [CFI|MF] フィールドの追加直後のそのフィールドの移動や
情報の書き換えは,一つのフィールドの追加とみなす 6 AM=AM, [CMI|MM] メソッドの追加直後のそのメソッドの移動
や情報の書き換えは,一つのメソッドの追加とみなす
7 DC= [CCN|MC],DC クラスの移動や情報の書き換え直後の
そのクラスの削除は,一つのクラスの削除とみなす
8 DF= [CFI|MF],DF フィールドの移動や情報の書き換え直後の
そのフィールドの削除は,一つのフィールドの削除とみなす
9 DM= [CMI|MM],DM メソッドの移動や情報の書き換え直後の
そのメソッドの削除は,一つのメソッドの削除とみなす
10 MC= [CCN|MC],MC クラスの移動や情報の書き換え直後の
そのクラスの移動は,一つのクラスの移動とみなす 11 MC=MC, [CCN|MC] クラスの移動直後のそのクラスの移動や
情報の書き換えは,一つのクラスの移動とみなす
12 MF= [CFI|MF],MF フィールドの移動や情報の書き換え直後の
そのフィールドの移動は,一つのフィールドの移動とみなす 13 MF=MF, [CFI|MF] フィールドの移動直後のそのフィールドの移動や
情報の書き換えは,一つのフィールドの移動とみなす
14 MM=[CMI|MM],MM メソッドの移動や情報の書き換え直後の
そのメソッドの移動は,一つのメソッドの移動とみなす
15 MM=MM, [CMI|MM] メソッドの移動直後のそのメソッドの移動や
情報の書き換えは,一つのメソッドの移動とみなす 16 CCN=CCN, [CCN] 連続で行われたクラスの名前の書き換えは,
一つのクラスの名前の書き換えとみなす
17 CFN=CFN, [CFN] 連続で行われたフィールドの名前の書き換えは,
一つのフィールドの名前の書き換えとみなす 18 CFT=CFT, [CFT] 連続で行われたフィールドの型の書き換えは,
一つのフィールドの型の書き換えとみなす 19 CMN=CMN, [CMN] 連続で行われたメソッドの名前の書き換えは,
一つのメソッドの名前の書き換えとみなす
20 CMT=CMT, [CMT] 連続で行われたメソッドの戻り値の型の書き換えは,
一つのメソッドの戻り値の型の書き換えとみなす 21 CMP=CMP, [CMP] 連続で行われたメソッドの引数の書き換えは,
一つのメソッドの引数の書き換えとみなす 22 CMB=CMB, [CMB] 連続で行われたメソッドの本体の書き換えは,
一つのメソッドの本体の書き換えとみなす
Algorithm 10: ApplyAggregationRules(changeGroup)
1 changeGroup ← AggregateSameTypeChanges(changeGroup,CCN);
2 changeGroup ← AggregateSameTypeChanges(changeGroup,CFN);
3 changeGroup ← AggregateSameTypeChanges(changeGroup,CFT);
4 changeGroup ← AggregateSameTypeChanges(changeGroup,CMN);
5 changeGroup ← AggregateSameTypeChanges(changeGroup,CMT);
6 changeGroup ← AggregateSameTypeChanges(changeGroup,CMP);
7 changeGroup ← AggregateSameTypeChanges(changeGroup,CMB);
8 if changeGroupにDCが存在する ∧changeGroupにACが存在するthen
9 changeGroupのすべての変更を削除する
10 end
11 else if changeGroupにACが存在する then
12 changeGroup ← changeGroupのすべての変更を集約して1つのACにする
13 end
14 else if changeGroupにDCが存在するthen
15 changeGroup ← changeGroupのすべての変更を集約して1つのDCにする
16 end
17 else if changeGroupにMCが存在する then
18 changeGroup ←changeGroupのすべての変更を集約して1つのMCにする
19 end
20 if changeGroupにDFが存在する ∧ changeGroupにAFが存在する then
21 changeGroupのすべての変更を削除する
22 end
23 else if changeGroupにAFが存在する then
24 changeGroup ← changeGroupのすべての変更を集約して1つのAFにする
25 end
26 else if changeGroupにDFが存在する then
27 changeGroup ← changeGroupのすべての変更を集約して1つのDFにする
28 end
29 else if changeGroupにMFが存在するthen
30 changeGroup ← changeGroupのすべての変更を集約して1つのMFにする
31 end
32 if changeGroupにDMが存在する ∧changeGroupにAMが存在するthen
33 changeGroupのすべての変更を削除する
34 end
35 else if changeGroupにAMが存在するthen
36 changeGroup ←changeGroupのすべての変更を集約して1つのAMにする
37 end
38 else if changeGroupにDMが存在するthen
39 changeGroup← changeGroupのすべての変更を集約して1つのDMにする
40 end
41 else if changeGroupにMMが存在する then
42 changeGroup←changeGroupのすべての変更を集約して1つのMMにする
43 end
4.3. 集約規則と規則の適用手順 49 目〜8行目においてAggregateSameTypeChanges(changeGroup, changetype)を呼び 出している.これは連続する変更タイプが同一のプログラム変更を1つのプログ ラム変更に集約するサブルーチンの呼び出しを表している.このサブルーチンに ついては後述する.
クラスの削除・追加・移動に関する集約規則の適用では,集約候補の中にDCと ACの両方が存在する場合を規則1の右辺の条件に該当したとみなし,集約の結果 としてそれら全てのプログラム変更をなかったことにする(8行目〜10行目).ま た,集約候補の中にACが存在する場合を規則4の右辺の条件に該当したとみな し,集約の結果としてそれら全てのプログラム変更を一つのACに変換する(11 行目〜13行目).また,集約候補の中にDCが存在する場合を規則7の右辺の条 件に該当したとみなし,集約の結果としてそれら全てのプログラム変更を一つの DCに変換する(14行目〜16行目).そして,集約候補の中にMCが存在する場
合を規則10(または規則11)の右辺の条件に該当したとみなし,集約の結果とし
てそれら全てのプログラム変更を一つのMCに変換する(17行目〜19行目).
フィールドやメソッドについての集約規則の適用も,クラスと同様に行う.
Algorithm 11: AggregateSameTypeChanges(changeGroup, changetype)
1 change← null;
2 preChange ← null;
3 aggregatedChanges ← φ;
4 fori = 0 to |changeGroup|-1 do
5 preChange ←change;
6 change← changeGroup[i];
7 change.isAggregated ←false;
8 if preChange 6= null ∧ preChange.type = changetype ∧ change.type = changetype then
9 preChange.isAggregated← true;
10 change.isAggregated ←true;
11 change← preChangeとchangeを集約した新たなプログラム変更;
12 aggregatedChanges ←aggregatedChanges ∪ change;
13 end
14 end
15 changeGroup← changeGroup ∪aggregatedChanges;
16 changeGroup← { c |c∈ changeGroup∧ c.isAggregated = false };
17 chagngeGroupに存在するすべてのプログラム変更を変更時刻が若い順にソート
AggregateSameTypeChanges(changeGroup, changetype)のアルゴリズムをアルゴ リズム 11に示す.このアルゴリズムは与えられた集約候補の変更リスト
change-Groupから,変更の種類がchangetypeであるプログラム変更が連続している部分
図 4.2: 集約の例
を一つのプログラム変更に集約するアルゴリズムである.
アルゴリズムでは,changeGroupから1つずつプログラム変更を取り出すたび に,そのプログラム変更と1つ前に取り出したプログラム変更の両方の変更タイ
プがchangetype であった場合にそれらを一つに集約し,また,ここで集約したプ
ログラム変更を今取り出したプログラム変更として扱うことで,次に取り出した プログラム変更と集約するができる(5行目〜6行目,8行目,11行目〜12行目).
そして最後に,集約されて新たに作成されたプログラム変更と集約候補のプロ グラム変更を統合し,集約に利用されたプログラム変更をそこから除外する.そ のようにして得られたプログラム変更の集合に対して集合に存在するプログラム 変更の変更時刻が若い順にソートを行い,集約後の集約候補とする(7行目,9行 目〜10行目,15行目〜17行目).
プログラム変更の集約例を,図 4.2を用いて説明する.ここでは,5つのプログ ラム変更が事前に抽出され,時間的距離や空間的距離により,前の3つの変更か ら2つの集約候補(AM,CMN)と(CMN,CMP),後ろの2つの変更から1つの
集約候補(CMB,CMB)が見つかっているとする.
まず,すべてのプログラム変更を変更時刻が早いものから順に並べた(全体)列 を作成する.次に,集約候補のペアを結合する.このようにすることで,集約候補 となるプログラム変更の部分列が生成される.この例では,(AM,CMN,CMP)
と(CMB,CMB)という2つの部分列が生成される.生成されたそれぞれの部分
列に対してアルゴリズム 10の手順にしたがって表4.2の規則の右辺のパターンに 一致するかどうかを調べ,一致する場合,規則の左辺にあるプログラム変更に置 換される.この例では,規則6により(AM,CMN,CMP)がAMに,規則22に
より(CMB,CMB)がCMBに置換されている(それぞれアルゴリズム10の35
行目〜37行目とアルゴリズム 10の7行目).
4.3. 集約規則と規則の適用手順 51 置換により新しく登場したプログラム変更の種類は,適用された集約規則の左 辺の変更と同じである.集約後のプログラム変更が持つその他の情報については,
置換された(置換により消去された)プログラム変更に基づき決定される.変更の 識別番号と開始時刻には,置換された変更のうち開始時刻が最も早い変更の識別 番号と開始時刻が格納される.変更終了時刻については,置換された変更のうち 開始時刻が最も遅い変更の終了時刻が格納される.変更箇所と編集操作には,置 換されたすべての変更の変更箇所と編集操作を集めたものが格納される.