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

第 4 章 プログラム変更の集約手法 39

4.3 集約規則と規則の適用手順

にスナップショットS4がそれぞれ作成された場合は,そのときのafterCMB1S2beforeCMB2S3のものとなり,これら2つのソースファイルから作成され るASTはそれぞれのノードのオフセットなどが異なる場合があり,完全に同一で はない.しかし,S2S3の間にはメソッド本体のASTの構造や値を変化させる 書き換えは行われていないため,afterCMB1beforeCMB2 からそれぞれ作成さ れるASTの構造と値は同一とみなせる(仮にメソッド本体の構造や値に変化があ る場合はS2S3の間でCMBが特定される).

少なくともafterCMB1beforeCMB2 から作成されるASTの構造や値が同じ であれば,N PCM B1N PCM B2のノードの集合の比較は可能である.ノードの集 合の比較の際には,その前にあらかじめafterCMB1beforeCMB2からそれぞれ 作成された2つのASTをそれぞれ同じ探索アルゴリズムで探索し,それらのAST に含まれるノードに対して,探索した順番を表すIDを割り振っておく.そして,

N SCM B1N 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 changeGroupDCが存在する ∧changeGroupACが存在するthen

9 changeGroupのすべての変更を削除する

10 end

11 else if changeGroupACが存在する then

12 changeGroup changeGroupのすべての変更を集約して1つのACにする

13 end

14 else if changeGroupDCが存在するthen

15 changeGroup changeGroupのすべての変更を集約して1つのDCにする

16 end

17 else if changeGroupMCが存在する then

18 changeGroup ←changeGroupのすべての変更を集約して1つのMCにする

19 end

20 if changeGroupDFが存在する changeGroupAFが存在する then

21 changeGroupのすべての変更を削除する

22 end

23 else if changeGroupAFが存在する then

24 changeGroup changeGroupのすべての変更を集約して1つのAFにする

25 end

26 else if changeGroupDFが存在する then

27 changeGroup changeGroupのすべての変更を集約して1つのDFにする

28 end

29 else if changeGroupMFが存在するthen

30 changeGroup changeGroupのすべての変更を集約して1つのMFにする

31 end

32 if changeGroupDMが存在する ∧changeGroupAMが存在するthen

33 changeGroupのすべての変更を削除する

34 end

35 else if changeGroupAMが存在するthen

36 changeGroup ←changeGroupのすべての変更を集約して1つのAMにする

37 end

38 else if changeGroupDMが存在するthen

39 changeGroup← changeGroupのすべての変更を集約して1つのDMにする

40 end

41 else if changeGroupMMが存在する then

42 changeGroup←changeGroupのすべての変更を集約して1つのMMにする

43 end

4.3. 集約規則と規則の適用手順 49 目〜8行目においてAggregateSameTypeChanges(changeGroup, changetype)を呼び 出している.これは連続する変更タイプが同一のプログラム変更を1つのプログ ラム変更に集約するサブルーチンの呼び出しを表している.このサブルーチンに ついては後述する.

クラスの削除・追加・移動に関する集約規則の適用では,集約候補の中にDCACの両方が存在する場合を規則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← preChangechangeを集約した新たなプログラム変更;

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 置換により新しく登場したプログラム変更の種類は,適用された集約規則の左 辺の変更と同じである.集約後のプログラム変更が持つその他の情報については,

置換された(置換により消去された)プログラム変更に基づき決定される.変更の 識別番号と開始時刻には,置換された変更のうち開始時刻が最も早い変更の識別 番号と開始時刻が格納される.変更終了時刻については,置換された変更のうち 開始時刻が最も遅い変更の終了時刻が格納される.変更箇所と編集操作には,置 換されたすべての変更の変更箇所と編集操作を集めたものが格納される.