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

第 6 章 評価実験 67

6.3 定性的評価

6.3.5 事例 5

6.3. 定性的評価 79 ドの見やすさのために,空白文字によって一部の文のスタイルを調整し行頭に行 番号を付加している.このコードでは,変数の宣言のあとに4つのif文が存在し,

それぞれのif文の中に単一の文が存在しており,これらの文によってx座標の下 端の補正と上端の補正,y座標の下端の補正と上端の補正がそれぞれ行われてい る.その後,補正された値を使ってパズルピースを移動させている.

図 6.1のようなコードでは,4行目5行目,6行目7行目,8行目9行目,10 行目11行目に存在するif文の間のそれぞれの空間的距離はすべて3となる.そ のため,これらの文から別のこれらの文のどれかに編集箇所が移動するたびに,3S による集約では別のプログラム変更として集約されてしまう.具体的に見ていく と,CID=1139が7行目,CID=1140が11行目でこの2つは別のプログラム変更 として集約され,同様にCID=1150とCID=1151が4行目と6行目で,CID=1152 とCID=1153が6行目と5行目で,CID=1162とCID=1163が9行目と10行目で それぞれ別のプログラム変更として集約されていた.

また,3Sによる集約のもう一つの誤検出として,それぞれ別の変更タスクによ る変更であるCID=1143とCID=1144について,同じプログラム変更として集約 してしまったというものがある.2つの変更の編集箇所を見ると,CID=1143が10

行目,CID=1144が3行目と4行目の間に説明用変数の宣言文を挿入しており,こ

れらの空間的距離は2となりこの2つの変更は1つのプログラム変更として集約 されてしまっていた.

空間的距離は,「ある変更タスクによって行われた変更の変更範囲はすべて狭い 範囲の中で行われ,ある変更タスクと別の変更タスクによって行われた変更のそ れらの変更範囲はお互いに離れる傾向にある」という仮説を前提としているため,

事例2でも述べたように空間的距離の結果は変更タスクとソースコードの構造と の関係に依存しやすい.しかし本事例の変更タスク1と2から,お互いのタスクに よる変更の変更範囲が離れない場合は同じ変更タスクによる変更とみなして誤っ た集約をしてしまう傾向にあることが考察できる.

表 6.7: 事例5における検出結果

CID 開始 終了 検出結果 1M 3S 変更タスク

5739 14:05:38 14:05:54 CMB CMB CMB 1.while文をdo-while文に置き換え 5740 14:06:02 14:06:02 CMB

5741 14:06:05 14:06:05 CMB 5742 14:06:06 14:06:06 CMB 5743 14:06:07 14:06:07 CMB 5744 14:06:09 14:06:09 CMB 5745 14:06:15 14:06:19 CMB 5746 14:06:23 14:06:39 CMB 5747 14:06:39 14:06:45 CMB

5748 14:06:47 14:06:48 CMB CMB

5749 14:06:48 14:06:54 CMB

5750 14:06:57 14:07:01 CMB CMB

5751 14:07:09 14:07:09 CMB CMB

5752 14:07:20 14:07:20 CMB 2.ループを抜ける判定のフラグの除去

5753 14:07:23 14:07:23 CMB

5754 14:09:10 14:09:12 CMB CMB 3. AIの思考ルーチンの拡張1(パズルピースの回転)

5755 14:09:16 14:09:16 CMB 5756 14:09:17 14:09:17 CMB 5757 14:09:18 14:09:18 CMB 5758 14:09:55 14:09:55 CMB 5759 14:10:24 14:10:24 CMB 5760 14:10:25 14:10:26 CMB 5761 14:10:28 14:10:46 CMB

5762 14:13:11 14:13:26 CMB CMB CMB 4. AIの思考ルーチンの拡張2(配置する列の決定)

5763 14:13:36 14:13:36 CMB 5764 14:13:47 14:14:02 CMB 5765 14:14:05 14:14:05 CMB 5766 14:14:05 14:14:05 CMB 5767 14:14:39 14:16:06 CMB 5768 14:16:08 14:16:08 CMB 5769 14:16:22 14:16:22 CMB

6.3. 定性的評価 81 この開発期間の初期状態からメソッドに存在していた,while文と同じ処理とな るdo-while文を作成し,さきほどのwhile文をコメントアウトすることで削除 することで,while文をdo-while文に置き換えていた.

変更タスク「2. ループを抜ける判定のフラグの除去」では,初期状態に存在し ていたwhile文や変更タスク1で作成されたdo-while文で使用されていた,ルー プ処理を抜けるためのフラグを更新する代入文がコメントアウトによって削除さ れ,そのフラグの変数宣言文が削除されていた.このタスクの最後では,コメン トアウトされたwhile文とフラグの変数宣言文の削除される編集おこなわれてい たが,構文上に変化はないため変更としては検出されなかった.

変更タスク「3. AIの思考ルーチンの拡張1(パズルピースの回転)」では,操作 しているパズルピースをそのまま配置するというAIの思考ルーチンを拡張して,

配置する時に配置する列の一番上に配置されているのパズルピースの色と現在操 作して配置しようとしているパズルピースの組の上のパズルピースが同じ色だっ た時に,それらのパズルピースが隣り合うように操作中のパズルピースを反転さ せる処理を追加していた1

変更タスク「4. AIの思考ルーチンの拡張2(配置する列の決定)」では,これ までは指定した列に操作しているパズルピースを配置するだけだった思考ルーチ ンを拡張して,配置が可能な列のなかで最も右側の列にパズルピースを配置する ようにする処理を追加していた2

まず,1Mによる集約では,変更タスク1と2を1つの変更タスクとみなしてし まった点を除いて,この開発期間の変更タスクの切り替わるタイミングをすべて 正確に捉えられているといえる.1つの変更タスクとみなしてしまった変更タス ク1と2についても,2つの変更タスク同士の関連が強く,完全に別の変更タスク とは言いがたかった.

時間的距離による集約がうまく言った理由としては,変更を加えた箇所につい てのソースコードのレビューや動作の確認が行われたというものが考えられる.本 事例における変更タスク1, 2では,メソッドの振る舞いを変えずに「while文か らdo-while文へ置き換え」や「フラグの除去」が行われたが,その場合に,それ らの変更タスクを行う前後でメソッドの振る舞いが変わっていないかを確認する のは自然である.また,変更タスク3, 4で行われた拡張についても,変更タスク の前後で拡張が正しく行われたことを確認するのは自然である.開発者によって そのようなレビューや確認が行われている間,ソースコードへの編集操作が行わ

1被験者が作成しているパズルゲームは,同じ色のパズルピースを一定数以上隣同士に配置して 消すゲームである.また,プレイヤーやプレイヤーの対戦相手であるAIは,ランダムに生成され 2つのパズルピースの組を操作する.

2このゲームにおけるパズルピースを配置するゲームフィールドの高さには上限があるため,同 じ列にパズルピースを積み上げ続けると,いずれパズルピースを配置することができなくなる.

表 6.8: CID=57475754の間における空間的距離の一覧

変更ペア 基準 前側の変更箇所 後側の変更箇所 距離 集約 変更タスク 5747, 5748 5747 method.dW.dWB.if.then method.dW.dWB 3 × 5748, 5749 5748 method.dW.dWB.if method.dW.dWB.if.else 2 5749, 5750 5749 method.dW.dWB.if.else method.dW.dWB 3 ×

5750, 5751 5750 method.dW.dWB method 3 ×

5751, 5752 5751 method method.dW 2 ×

5752, 5753 5752 method.dW method 2

5753, 5754 5753 method method 1 ×

れずに,今回行われた変更と次に行われる変更の変更時刻に差が開いたのではな いかと考察する.

それに対して,3Sによる集約では,変更タスク1による変更(CID=57395751)

が4つのプログラム変更に分断されており,この集約結果を提示された開発者や 保守者には,集約結果から変更タスクを自身の手で構築する手間が発生してしま う.また,CID=57525761を単一のプログラム変更として集約することで,単一 のプログラム変更に3つの変更タスク1, 2, 3が含まれてしまっており,この集約 結果を提示された開発者や保守者はこれらの変更タスクを見落としてしまう可能 性が高い.

ここでは3Sによる集約で誤検出が頻出したCID=57475754に焦点を絞り,そ れぞれのプログラム変更間における空間的距離を踏まえて誤検出が起きた原因 を分析する.CID=57475754の間のソースコードの変化を図 6.2に示す.図は,

CID=5746のプログラム変更が行われた後のソースコードを初期状態として,CID=

57475754のそれぞれのプログラム変更が行われた後のソースコードの状態を表 している.それぞれの状態のソースコードの左には,どのプログラム変更を適用 した後のソースコードなのかを表す番号が記載されており,たとえば「5747」と いう番号の右にあるソースコードは,CID=5747のプログラム変更が行われた後 のソースコードを示している.また,紙面の都合により,考察とは関係のないコー ドや空白文字は省略している.そして,変更タスク1で置き換えられたwhile文 の詳細についても考察と関係ないため”]] while文 ]]”というラベルに省略してい る.1つ前の状態のソースコードから追加されたコードは赤字で示し,削除され たコードはそのコードの削除が行われた付近を赤い矢印で示している.

また,それぞれのプログラム変更間の空間的距離におけるプログラム変更のそ れぞれの変更箇所を表6.8にまとめた.「変更ペア」は空間的距離を測るそれぞれの 変更のペアをCIDで表している.「前側の変更箇所」は変更ペアのうち,前に行わ

6.3. 定性的評価 83

図 6.2: CID=57475754の間におけるソースコードの変化

れたプログラム変更の空間的距離の計算において特定された変更箇所を表し,同 様に,「後側の変更箇所」は後ろに行われたプログラム変更の変更箇所を表わす.そ の際の表記では,メソッド本体のブロックを「method」,do-while文を「dW」,

do-while文のブロックを「dWB」,if 文を「if」,if文のthen節のブロックを

「then」,if文のelse節のブロックを「else」とし,メソッド本体のブロックを頂点と して,頂点から変更箇所をたどるまでに通過する先に示したノードを,通過した順 番にドット(.)でつないだものを変更箇所として表記する.たとえば,CID=5747 が行われた後のソースコードにおいて,do-while文の中のif文のthen節に存在 する文が書き換えられた場合は,「method.dW.dWB.if.then」となる.「距離」はそ の変更ペアから計算された空間的距離を表す.「集約」は空間的距離による集約結 果を表し,集約された場合は「◯」,集約されなかった場合は「×」となる.また,

「変更タスク」は変更ペアの前側の変更と後側の変更が同じ変更タスクによるプロ グラム変更かどうかを表し,同じ場合は「◯」,そうでない場合は「×」となる.

CID=5747とCID=5748は同じ変更タスク1によって行われたプログラム変更で あるため,それらは1つに集約されるべきであるが,3Sによる集約では異なるプログ ラム変更として検出されている.CID=5747ではif文のthen節の中で文を挿入し,

CID=5748ではif文にelse節を追加している.そのため,CID=5747とCID=5748 の空間的距離において,CID=5747のプログラム変更が行われた後のソースコー ドのASTを基準とした時,CID=5747の変更箇所は「method.dW.dWB.if.then」,

CID=5748の変更箇所は「method.dW.dWB.if」となり,一見すると空間的距離は 2となり集約条件を満たしているに思える.しかし本手法では,if文へのelse節の 追加による書き換えはif文およびthen節のブロックの外となるため,CID=5748 の変更はif文で行われたとはみなされず,実際の変更箇所は「method.dW.dWB」 となってしまう.その結果,空間的距離が3となり集約条件を満たさない.これは 本手法ではソースコードのテキスト表現の差分の範囲をAST上の変更箇所にマッ ピングすることで起きてしまう問題である.この問題は変更前後のASTの差分抽 出アルゴリズムなどを利用することで改善することが可能だが,差分抽出アルゴ リズムを利用する計算量に対して得られる効果がそれほど大きくないと考え本手 法では採用しなかった.

CID=5748とCID=5749については,同じ変更タスク1による変更と定義されて いるのと同様に,3Sによる集約でも単一のプログラム変更として検出できている.

CID=5748ではif文にelse節を追加し,CID=5749では追加されたelse節に文を追 加しているため,CID=5748とCID=5749の空間的距離において,CID=5748のプ ログラム変更が行われた後のソースコードのASTを基準とした時,CID=5748の変 更箇所は「method.dW.dWB.if」,CID=5749の変更箇所は「method.dW.dWB.if.

else」で,空間的距離は2となり集約条件を満たしている.ここで,CID=5747と