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

メソッドに関する変更の特定

第 3 章 プログラム変更の特定手法 17

3.4 クラス情報の比較

3.4.3 メソッドに関する変更の特定

アルゴリズム3(MethodChange(Ct1, Ct2))では,与えられた編集前後の同一ク ラスとみなされた2つのクラスCt1, Ct2から,メソッドに関するプログラム変更

(AM,DM,CMN,CMT,CMP,CMB)を特定する.本アルゴリズムの大 まかな手順は,アルゴリズム 2と同様であるが,メソッドの情報の書き換えの特 定において,比較する情報がアルゴリズム 2と異なる.アルゴリズム 3に対応す る手順の説明は以下となる.

1. メソッドの集合の取り出し(1〜2行目)

3.4. クラス情報の比較 29 Algorithm 3: MethodChange(Ct1, Ct2)

1 Mt1 Ct1に存在するすべてのメソッド;

2 Mt2 Ct2に存在するすべてのメソッド;

3 foreachmt1 ∈Mt1 do

4 if mt1 が操作 ops(t1, t2)によって削除されたthen

5 mt1 DMとして検出;mt1 Mt1から除外;

6 end

7 end

8 foreachmt2 ∈Mt2 do

9 if mt2 が操作 ops(t1, t2)によって挿入されたthen

10 mt2 AMとして検出;mt2 Mt2から除外;

11 end

12 end

13 foreachmt1 ∈Mt1, mt2∈Mt2 do

14 if mt1.name =mt2.name mt1.type = mt2.type

15 mt1.par =mt2.par ∧mt1.body= mt2.body then

16 mt1 Mt1から除外;mt2 Mt2から除外;

17 end

18 end

19 foreachmt1 ∈Mt1, mt2∈Mt2 do

20 if mt1.name 6=mt2.name mt1.type = mt2.type

21 mt1.param =mt2.param∧ mt1.body= mt2.body then

22 mt1 mt2CMNとして検出;

23 mt1 Mt1から除外;

24 mt2 Mt2から除外;

25 else if mt1.name = mt2.name ∧mt1.type 6= mt2.type

26 mt1.param =mt2.param∧ mt1.body= mt2.body then

27 mt1 mt2CMTとして検出;

28 mt1 Mt1から除外;

29 mt2 Mt2から除外;

30 else if mt1.name = mt2.name ∧mt1.type = mt2.type

31 mt1.param 6=mt2.param∧ mt1.body= mt2.body then

32 mt1 mt2CMPとして検出;

33 mt1 Mt1から除外;

34 mt2 Mt2から除外;

35 else if mt1.name = mt2.name ∧mt1.type = mt2.type

36 mt1.param =mt2.param∧ mt1.body6= mt2.body then

37 mt1 mt2CMBとして検出;

38 mt1 Mt1から除外;

39 mt2 Mt2から除外;

40 end

41 end

42 Mt1 に残っているすべてのメソッドをそれぞれDMとして検出;

43 Mt2 に残っているすべてのメソッドをそれぞれAMとして検出;

Ct1Ct2に存在するメソッドをすべて取り出し,それぞれメソッドの集合 Mt1Mt2とする.

2. 編集操作によるメソッドの削除の特定(3〜7行目)

Mt1から時刻t1〜t2に行われた編集操作ops(t1, t2) によって削除されたメ ソッドをみつけ,それらをそれぞれメソッドの削除(DM)として特定して メソッドの集合から除外する.編集操作によるDMの特定の具体的な手順 については3.4.4 節で説明する.

3. 編集操作によるメソッドの追加の特定(8〜12行目)

Mt2から時刻t1〜t2に行われた編集操作ops(t1, t2) によって挿入されたメ ソッドをみつけ,みつかったメソッドをメソッドの追加(AM)として特定 してメソッドの集合から除外する.編集操作によるAMの特定の具体的な 手順については3.4.4 節で説明する.

4. 同一メソッドの対応付け(13〜18行目)

お互いの名前,返り値の型,引数,本体に関する情報がすべて同じとなるメ ソッドのペアをMt1Mt2からそれぞれみつけ,それらを変更が行われなかっ た同一のメソッドとみなす.そして,ここでペアとなったメソッドをMt1Mt2からそれぞれ除外する.引数の比較では,比較する2つのメソッドの引 数の数が等しく,かつ,2つのメソッドのn個の引数を記述されている順番 で並べたときに互いのメソッドの1〜n番目の引数の型の文字列がすべて一 致する場合を等しいとみなす.メソッドの本体の比較では,互いのメソッド 本体以下のASTについて,構造と各ノードの値が一致する場合を等しいと みなす.

5. メソッドの情報の書き換えの特定(19〜41行目)

メソッドの情報である名前,返り値の型,引数,本体に関する情報につい て,お互いの名前だけが異なるメソッドのペアをメソッドの名前の書き換え

CMN)として,お互いの返り値の型だけが異なるメソッドのペアをメソッ ドの返り値の型の書き換え(CMT)として,お互いの引数だけが異なるメ ソッドのペアをメソッドの引数の書き換え(CMP)として,お互いの本体 だけが異なるメソッドのペアをメソッドの本体の書き換え(CMB)として,

それぞれ特定する.最後に,ここでペアとなったフィールドをFt1,Ft2から それぞれ除外する.

6. 残されたメソッドを追加・削除として特定(42〜43行目)

3.4. クラス情報の比較 31

図 3.3: 誤った対応付けの例

以上の手順を経て,Mt1に残されたメソッド(Mt1に存在してMt2に存在しな いメソッド)を,時刻t1から時刻t2の間に削除されたメソッドとみなし,メ ソッドの削除(DM)として特定する.また,Mt2に残されたメソッド(Mt1 に存在せずMt2に存在するメソッド)を,時刻t1から時刻t2の間に追加さ れたメソッドとみなし,メソッドの追加(AM)として特定する.