機能的関心事を抽出するためのプログラムスライシングの拡張 井上研究室 仁井谷 竜介
概要 ソフトウェアは多くの機能的関心事(≒一連の処理、以降単に関心事)で構成 関心事を理解するのはコストが高い 関心事の抽出手法を提案 関心事は複数のモジュール(クラスやメソッド)のコラボレーションで実現 関心事を理解するのはコストが高い 手がかりを見つける(単語検索, Feature locationなど) 関連するモジュールを探す モジュール間の関係を理解 関心事の抽出手法を提案 ヒューリスティクスで拡張したプログラムスライシング ここを支援したい 修士論文発表会 2007/02/19
プログラムスライシング スライシング基準と関連のあるプログラム要素、および要素間の関係の抽出を自動で行う技術 プログラム P をプログラム依存グラフに変換 頂点 : 文(など) 辺 : 依存関係(データ依存/制御依存) P に対してスライシング基準 <s, v> を指定 s : P 中の文 v : 変数 P 上の頂点の訪問により v に影響する/される文の集合とその間の関係を特定 i = 3; if (a > 0) { print i; } データ依存 <3, i> 制御依存 修士論文発表会 2007/02/19
理解支援でのスライシングの問題点 関心事との関連の弱い箇所が多く含まれる スライスのサイズが大きくなる 異なる関心事についての出力が重複する 例:main()やライブラリの詳細 スライスのサイズが大きくなる 異なる関心事についての出力が重複する 例: 「ドキュメントを開く」と「ドキュメントを保存」 依存 制御フロー 関心事(開く) スライス(開く) 関心事(保存) スライス(保存) Main.main(args) App.run() Menu.onClick(buttonID) FileDialog.getPath() Document.open(path) File.read(path) MDI.add(document) Log.debug(message) FileDialog.getPath() Document.save(path) File.write(path) App.quit() 修士論文発表会 2007/02/19
提案手法 関連の強い / 弱い箇所の境界(バリア)をヒューリスティックに見つける [1] では手動で設置される 頂点 提案手法では自動で設置される 依存辺 適切な関連の強さの箇所にバリアを配置することで、関心事に固有の部分が抽出できる バリア 依存 制御フロー 関心事(開く) スライス(開く) 関心事(保存) スライス(保存) Main.main(args) App.run() Menu.onClick(buttonID) FileDialog.getPath() Document.open(path) File.read(path) MDI.add(document) Log.debug(message) FileDialog.getPath() Document.save(path) File.write(path) App.quit() 修士論文発表会 [1] Krinke, J.: Slicing, Chopping, and Path Conditions with Barriers. Software Quality Journal, Vol.12, No.4, pp.339-360,December 2004. 2007/02/19
提案手法の手順 プログラム依存グラフの構築 開発者による入力(スライシング基準) 関心事に関連の強いメソッドと関係の抽出 ヒューリスティクスによるバリアの特定 バリアと開発者の入力を用いたスライシング 結果からライブラリに属すものをフィルタリング 開発者に提示 関心事グラフを用いた可視化 修士論文発表会 2007/02/19
引数が callee の制御を変更しないメソッド呼び出し辺 入次数の大きい頂点に入る辺 キーワードマッチと距離に基づく境界 ここだけ紹介 3.i. ヒューリスティクスによるバリアの特定 フィールドへのアクセス 引数がないメソッド呼び出し辺 引数が callee の制御を変更しないメソッド呼び出し辺 入次数の大きい頂点に入る辺 キーワードマッチと距離に基づく境界 ここだけ紹介 Name Context(メソッド m からアクセスできる型や識別子を構成する単語の集合)の類似度が低い頂点との境界 Name Context の類似度と距離に基づく境界 修士論文発表会 2007/02/19
3.i. キーワードマッチと距離に基づく境界 キーワードと閾値を与える 頂点にマークをつける 各頂点の重みを決める 下の例は autosave と buffer と閾値1.0 頂点にマークをつける キーワードにマッチするメソッドに含まれる頂点 各頂点の重みを決める マーク付き頂点からの距離から以下の式で決定 単純な距離とは異なり、同じ距離でも中間の方が重みが高い 閾値以下の頂点の辺をバリアにする autosave() getBuffers() 距離2 1.70 1.46 1.28 0.93 0.75 1.16 1.70 1.46 1.28 0.93 0.75 1.16 修士論文発表会 2007/02/19
3.ii. バリアと開発者の入力を用いたスライシング 開発者の入力からの依存関係を順/逆両方向に辿る バリアで訪問を停止 修士論文発表会 2007/02/19
5. 関心事グラフを用いた可視化 頂点 辺 クラス(メソッド・フィールドを内包) メソッド フィールド 呼び出し辺 フィールドに対するデータフロー辺 インスタンス生成辺 親子クラス辺 org.gjt.sp.jedit.Autosave actionPerformed(java.awt.event.ActionEvent): void init(): void setInterval(int): void javax.swing.Timer timer org.gjt.sp.jedit.jEdit getIntegerProperty(java.lang.String, int): int propertiesChanged(): void call 修士論文発表会 2007/02/19
評価実験 目的 : 関心事の理解支援における有効性の評価 対象 : jEdit (テキストエディタ) 関心事 Java / 777 class / 144,692 LOC 関心事 Autosave : ファイルの自動保存 Undo : 変更取り消し マニュアルに機能として存在する単語 VFS Search : 仮想ファイルシステム上のディレクトリ検索 版管理システム上で見つかった、追加された機能 スライシング基準 : grep により得られた文 修士論文発表会 2007/02/19
評価内容 「キーワードマッチと距離に基づく境界」のみ紹介 スライスサイズの変化 grep の適合率/再現率との比較 異なる関心事間のスライスの共通箇所 ヒューリスティクスを組み合わせたもの 長さ制限付きスライシングとの比較 関心事グラフの評価 「キーワードマッチと距離に基づく境界」のみ紹介 (Autosave, Undo に関して単体で一番良かった) 修士論文発表会 2007/02/19
スライスサイズの変化 スライシング基準~従来手法のサイズまで変えられる 再現率(メソッド単位)もスライシング基準~従来手法で変化する ただしサイズに比例よりは良い 修士論文発表会 2007/02/19
grep (スライシング基準) の 適合率/再現率との比較 前提 抽出されたメソッドにのみ着目(メソッド間の関係は考慮しない) grep ⊆ スライス (メソッドの集合として) スライスの再現率は必ず grep 以上 適合率は下がる可能性が高い 提案手法は抽出したメソッドだけでも grep より良い 0.95 閾値:1.45 曲線の右上は grep より性能が良い 1.35 1.25 1.20 Autosave について メソッド単位での適合率/再現率 横軸: 適合率 縦軸: 再現率 丸: スライスの適合率/再現率 破線: grep の適合率/再現率 曲線: grep のF値 修士論文発表会 2007/02/19
異なる関心事間のスライスの共通箇所 互いに共通箇所の小さなスライスが得られた AutosaveとUndoに共通するメソッド(うち2つ)は、共通して登場する 「ファイルが変更されたかどうか」 のフラグを扱う 他の組にはもとから共通箇所がない 共通箇所 修士論文発表会 2007/02/19
まとめ 機能的関心事の理解支援に適切な、プログラム要素とその間の関係を抽出 今後の課題 ヒューリスティクスにより関連の強い箇所のみ抽出 評価実験により理解支援に適したスライスが抽出ができたことが確認された 今後の課題 複数の関心事間の相互作用の調査 閾値の自動計算手法の確立 修士論文発表会 2007/02/19
修士論文発表会 2007/02/19
ライブラリやユーティリティや複数の関心事の合流点 3.i 入次数の大きい頂点に入る辺 ライブラリやユーティリティや複数の関心事の合流点 以下の入次数を個別に扱う 全ての依存辺の入次数(頂点単位) 呼出辺の入次数(メソッド単位) 修士論文発表会 2007/02/19
実装 修士論文発表会 2007/02/19
修士論文発表会 2007/02/19
長さ制限付きスライシングとの比較 提案手法(17クラス)上 長さ制限付き 適切なものが抽出できた 同程度のクラス数(16)下 関連の弱いクラスが多い 関心事グラフ的に接続されない 同程度の頂点数(175) 大きすぎるため不適 修士論文発表会 2007/02/19
関心事グラフ変化の考察 閾値が大きい 閾値が小さい ソフトウェア構造の段階的な理解を支援する 重要なクラスや関係のみを抽出 重要なクラスの周辺の振る舞いも抽出 ソフトウェア構造の段階的な理解を支援する Storeyら[2]の提案する、ソフトウェア理解支援ツールが満たすべき項目の1つ「E5: システムの構造を表すオーバービューが抽象度を変化させながら使えること」とも合致 [2] M.-A. D. Storey, F. D. Fracchia, and H. A. M¨uller. Cognitive design elements to support the construction of a mental model during software exploration. The Journal of Systems and Software, Vol. 44, No. 3, pp. 171–185, 1999. 修士論文発表会 2007/02/19
フィールドへのアクセス グラフの説明 呼出辺の入次数の大きいメソッドのヒューリスティクスとの組み合わせによりスライスサイズが目立って減少 白がヒューリスティクス有効 / 灰色が無効の従来手法を 1.0 とした時のスライスサイズ(以降同様) 左から頂点数、メソッド数、クラス数 呼出辺の入次数の大きいメソッドのヒューリスティクスとの組み合わせによりスライスサイズが目立って減少 修士論文発表会 2007/02/19
引数のないメソッド 何と組み合わせても少し減っているだけ 修士論文発表会 2007/02/19
入次数の大きい頂点(全ての辺) 入次数の制限次第(この図は >4) ただし閾値の小さなところでスライスサイズが激減するため、単一使用には向かない(べき乗則参照) 修士論文発表会 2007/02/19
入次数の大きい頂点(呼出辺) 辺の総数が少ないので、全ての辺に比べてスライスは大きめ ただし、フィールドへのアクセスとの組み合わせは全ての辺の時よりスライスが小さい 修士論文発表会 2007/02/19
キーワードマッチした頂点との関連が弱い頂点との境界 閾値次第でサイズの調整が容易(この図は1.25) 他のヒューリスティクスと比べメソッド数が減る傾向にある 修士論文発表会 2007/02/19