第 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 とmt2をCMNとして検出;
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 とmt2をCMTとして検出;
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 とmt2をCMPとして検出;
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 とmt2をCMBとして検出;
38 mt1 をMt1から除外;
39 mt2 をMt2から除外;
40 end
41 end
42 Mt1 に残っているすべてのメソッドをそれぞれDMとして検出;
43 Mt2 に残っているすべてのメソッドをそれぞれAMとして検出;
Ct1とCt2に存在するメソッドをすべて取り出し,それぞれメソッドの集合 Mt1,Mt2とする.
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行目)
お互いの名前,返り値の型,引数,本体に関する情報がすべて同じとなるメ ソッドのペアをMt1,Mt2からそれぞれみつけ,それらを変更が行われなかっ た同一のメソッドとみなす.そして,ここでペアとなったメソッドをMt1, Mt2からそれぞれ除外する.引数の比較では,比較する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)として特定する.