メソッドの同時更新履歴を用いたクラスの機能別分類法

Slides:



Advertisements
Similar presentations
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 1 ソフトウェア部品推薦のための.
Advertisements

シーケンス図の生成のための実行履歴圧縮手法
利用実績に基づくソフトウェア部品検索システムSPARS-J
情報伝播によるオブジェクト指向プログラム理解支援の提案
研究の背景 コードクローン ソースコード中に存在する一致または類似したコード片
プログラムの動作を理解するための技術として
EMアルゴリズム クラスタリングへの応用と最近の発展
リファクタリングのための 変更波及解析を利用した テスト支援ツールの提案
メソッド名とその周辺の識別子の 相関ルールに基づくメソッド名変更支援手法
川口真司 松下誠 井上克郎 大阪大学大学院情報科学研究科
Java ソフトウェア部品検索システム SPARS-J のための リポジトリ自動更新機能の実現
プログラム実行履歴を用いたトランザクションファンクション抽出手法
プログラム実行時情報を用いたトランザクションファンクション抽出手法
ソースコードの変更履歴における メトリクス値の変化を用いた ソフトウェアの特性分析
静的情報と動的情報を用いた プログラムスライス計算法
Javaクラスの利用関係を用いた ソフトウェア部品のカテゴリ階層構築法
コードクローンに含まれるメソッド呼び出しの 変更度合の分析
コードクローンに含まれるメソッド呼び出しの 変更度合の調査
識別子の命名支援を目的とした動詞-目的語関係の辞書構築
ソードコードの編集に基づいた コードクローンの分類とその分析システム
関数の変更履歴と呼出し関係に基づいた開発履歴理解支援システムの実現
動的依存グラフの3-gramを用いた 実行トレースの比較手法
オブジェクト指向プログラムにおける エイリアス解析手法の提案と実現
オープンソース開発の履歴情報を用いたコミュニティ検索支援システム
シーケンス図を用いて実行履歴を可視化するデバッグ環境の試作
動的スライスを用いたバグ修正前後の実行系列の差分検出手法
利用関係に基づく類似度を用いたJavaコンポーネント分類ツールの作成
実行時情報に基づく OSカーネルのコンフィグ最小化
Javaプログラムの変更を支援する 影響波及解析システム
コードクローン検出ツールを用いた ソースコード分析システムの試作と プログラミング演習への適用
利用実績に基づくソフトウェア部品検索システムSPARS-J
プログラム動作理解支援を目的とした オブジェクトの振舞いの同値分割手法
コンポーネントランク法を用いたJavaクラス分類手法の提案
動的データ依存関係解析を用いた Javaプログラムスライス手法
オープンソース開発支援のための ソースコード及びメールの履歴対応表示システム
ソースコードの特徴量を用いた機械学習による メソッド抽出リファクタリング推薦手法
オープンソース開発支援のための リビジョン情報と電子メールの検索システム
ソースコードの静的特性を用いた Javaプログラム間類似度測定ツールの試作
UMLモデルを対象とした リファクタリング候補検出の試み
コードクローン検出に基づくデザイン パターン適用支援手法の提案と実現
バイトコードを単位とするJavaスライスシステムの試作
シナリオを用いたレビュー手法PBRの追証実験 - UMLで記述された設計仕様書を対象として -
○ 後藤 祥1,吉田 則裕2 ,井岡 正和1 ,井上 克郎1 1大阪大学 2奈良先端科学技術大学院大学
ソフトウェア保守のための コードクローン情報検索ツール
コードクローン分類の詳細化に基づく 集約パターンの提案と評価
コーディングパターンの あいまい検索の提案と実装
JAVAバイトコードにおける データ依存解析手法の提案と実装
インスタンスの型を考慮したJavaプログラムの実行経路の列挙手法の提案
JavaScriptを含んだHTML文書に対する データフロー解析を用いた構文検証手法の提案
コードクローン間の依存関係に基づく リファクタリング支援環境の実装
オブジェクトの協調動作を用いた オブジェクト指向プログラム実行履歴分割手法
設計情報の再利用を目的とした UML図の自動推薦ツール
保守請負時を対象とした 労力見積のためのメトリクスの提案
ソースコードの差分を用いた関数呼び出し パターンの抽出手法の提案と実装
ソースコードの差分を用いた関数呼び出し パターンの抽出手法の提案
プログラムの差分記述を 容易に行うための レイヤー機構付きIDEの提案
クローン検出ツールを用いた ソフトウェアシステムの類似度調査
オープンソースソフトウェアに対する コーディングパターン分析の適用
A-17 検索履歴のプライバシーを秘匿した ユーザクラスタリング
UMLモデルを対象とした リファクタリング候補検出手法の提案と実現
エイリアス関係を考慮した Javaプログラム用静的スライシングツール
プログラムの一時停止時に 将来の実行情報を提供するデバッガ
コードクローン解析に基づく デザインパターン適用候補の検出手法
メソッド抽出リファクタリングが 行われるメソッドの特徴調査
関数の変更履歴と呼び出し関係に 基づいた開発履歴理解支援システム
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
識別子の読解を目的とした名詞辞書の作成方法の一試案
オブジェクト指向メトリクスを用いた 開発支援に関する研究 --- VC++とMFCを用いた開発を対象として ---
ベイジアンネットワークと クラスタリング手法を用いたWeb障害検知システムの開発
Presentation transcript:

メソッドの同時更新履歴を用いたクラスの機能別分類法 井上研究室  博士前期課程2年 楠田泰三

Feature Location ソフトウェアの持つ機能と、その実装箇所の対応を特定する ソフトウェア理解のコストの増大[1] 保守作業を行う上では、ソフトウェア全体の理解よりも保守作業に応じた一部の詳細な理解の方が重要[2] ソフトウェアの持つ機能と、その実装箇所の対応を特定する 入力ファイルを読み込む データを解析する 解析結果を出力する ソースコード [1] Encyclopedia of Software Engineering. Pigoski T. M.,1994 [2] Partial Comprehension of Complex Programs. K.Erdos et al. IWPC'98

Feature Locationの既存手法とその問題点 ソースコードを解析する 関数の呼び出しグラフを用いる ⇒動的に実行経路が決定するオブジェクト指向プログラムでは、解析が困難 プログラムの実行履歴を解析する プログラムを様々な入力の元で実行 ⇒ 非常に時間がかかる

版管理システム 3.更新を反映 1.コピー 2.更新 1.コピー 2.更新 3.更新を反映 リポジトリ 開発者領域 開発のプロセス (一回の更新作業) リポジトリとよばれるデータベースから必要なプロダクト(ソースコードなど)をコピー コピーしたプロダクトを更新する 行った更新をリポジトリに反映させる(チェックイン) 一回の更新作業で複数のプロダクトが更新され、その全ての履歴がリポジトリに存在 ソフトウェアの機能を追加・修正するために行ったソースコードの更新の情報を含む

⇒ソフトウェアの持つ機能と、その実装箇所の対応を特定する 研究の概要 目的 オブジェクト指向言語で記述されたソフトウェアのクラスを機能別に分類 ⇒ソフトウェアの持つ機能と、その実装箇所の対応を特定する 手法 版管理システムの保持している開発履歴情報を用いる 同一の機能を実装している箇所は同時に更新されることが多い 同時に更新される傾向が強いクラス群を同一の機能を実装しているクラス群と考え、グループ化する

提案手法概要 1.1 同時更新情報の抽出 1.2 多くのクラスにまたがる更新作業の除去 2.1メトリクス値の計算 2.2更新傾向グラフの作成 A.a2() B.b() A.a1() C.c() { A.a1() , A.a2() , B.b() , C.c() } { A.a1() , A.a2() , B.b() } { A.a1() , B.b() } { A.a2() , C.c() } {A , B} {A , C} 版管理システムのリポジトリ 同時更新傾向の強いクラス群 メソッドの同時更新の情報 1.1 同時更新情報の抽出 1.2 多くのクラスにまたがる更新作業の除去 2.1メトリクス値の計算 2.2更新傾向グラフの作成 3.1更新傾向グラフのクラスタリング 3.2同時更新傾向の強いクラス群の決定 更新傾向グラフ

{ A.a1() , B.b() , C.c() , D.d() , E.e() } 手順1.1 - 同時更新情報の抽出 { A.a1() , B.b() } { A.a2() , C.c() } { A.a1() , A.a2() , B.b() } { A.a1() , A.a2() , B.b() , C.c() } { A.a1() , B.b() , C.c() , D.d() , E.e() } 版管理システムのリポジトリ 同時更新されたメソッド群のリスト 一回の更新作業により更新されたメソッド群を同時に更新されたメソッド群と考える メソッドの更新 メソッドの記述内容が更新 メソッドが追加 対象とするソフトウェアに対して行われた全ての更新作業について、同時更新されたメソッド群を抽出し、そのリストを作成

手順1.2 - 多くのクラスにまたがる更新作業の除去 同時に更新されたメソッド群が多くのクラスにまたがる場合、その更新作業を除去 複数の機能の修正をまとめてチェックイン リファクタリングなどによる大規模なコードの修正 箱髭図を用いた分析 箱髭図 四分位点を用いてデータのばらつきを見るための図 各更新作業において、同時に更新されたメソッド群がまたがるクラスの個数をデータとして箱髭図を作成し、上の髭にあたる部分を越える更新作業を除去 髭 箱 髭 箱髭図

手順2.1 - 同時更新の強さを表すメトリクスの計算 { A.a1() , B.b() } { A.a2() , C.c() } { A.a1() , A.a2() , B.b() } { A.a1() , A.a2() , B.b() , C.c() } : 外れ値を除去した同時更新されたメソッド群のリスト メトリクス値 同時更新の強さ = どの程度同時に更新される傾向があるかを数値で表現 Zimmermann らが提案した confidence メトリクス[1]を用いる [1] Zimmermann et al. How History Justifies System Architecture ( or not ) . IWPSE2003

手順2.2 - 更新傾向グラフの作成 頂点はメソッド 頂点間の辺は始点と終点のメソッドの同時更新の強さを保持 0.5 1.0 A.a1() A.a2() 1.0 : B.b() C.c() メトリクス値 更新傾向グラフ 頂点はメソッド 頂点間の辺は始点と終点のメソッドの同時更新の強さを保持 始点をメソッド A 、終点をメソッド B とした時 A → B の辺は を保持

手順3.1 - 更新傾向グラフのクラスタリング 群平均法を用いる 0.58 0.58 1.0 0.83 0.48 0.375 0.375 手順3.1 - 更新傾向グラフのクラスタリング 群平均法を用いる 初期状態の頂点の一つずつをクラスタにする クラスタ間の近さの値が最大の2つのクラスタを一つのクラスタに統合 クラスタ間の近さの値は、各クラスタに含まれる頂点間のすべての組み合わせの近さの値の平均 頂点A,B間の近さは 全てのクラスタ間の近さが閾値 より小さくなるまで繰り返す 1.0 0.375 0.58 A.a2() B.b() A.a1() C.c() 0.375 0.58 0.83 0.48 クラスタ化更新傾向グラフ 更新傾向グラフ

手順3.2 - 同時更新傾向の強いクラス群の決定 クラスタリングの結果を開発者に提示する。開発者が適切にクラスタリングできていないと判断した場合は、閾値を設定し直し、再びクラスタリングを行う。 機能数に対してクラスタの数が多すぎる場合は閾値を低くする クラスタ化更新傾向グラフ中の各クラスタに含まれるメソッド群が属しているクラス群を、同時更新傾向が強いクラス群と考える 閾値を再設定 一つの機能を実装しているクラス群 A.a2() B.b() A.a1() C.c() A.a2() B.b() A.a1() C.c() { A ,B } { A ,C } 同時更新傾向の強いクラス群 クラスタリング 更新傾向グラフ クラスタ化更新傾向グラフ

検証実験 対象とするソフトウェアに対し本手法を適用し、適切にクラスがグループ化できているかを調べる 実験対象 CREBASS ( Cvs REpository Browse And Search System ) CVS リポジトリ閲覧・検索システム

実験結果 データ解析部について評価 で10個のクラス群が特定 各機能の実装クラスを最も多く含むクラス群を割り当て 機能名 実装クラス 抽出クラス 該当クラス データベースを作成する 8 10 7 データベースからデータを取得する 6 5 Cのファイルを構文解析する 3 RCSファイルを解析する 設定ファイルを読み込む 2 折れ線グラフを作成する リビジョン条件の比較する 関数データを管理する ヒストリデータを管理する 14 プロジェクトデータを管理する 計 60 65 49 各機能の実装クラスを最も多く含むクラス群を割り当て

実験結果の考察 本手法は有効 概ね高い適合率、再現率 いくつかのオープンソースソフトウェアで再現率が低い 例) jPicEdtというソフトウェアは再現率が0.22 ある程度開発を行ってから版管理システムの利用開始していたため ⇒版管理システムの利用を開始する前の履歴が取得できない

まとめ ソフトウェアの開発履歴を用いてクラスを機能別にグループ化 検証実験 今後の課題 ソフトウェアの全体ではなく、一部を詳細に理解することを支援 検証実験 本手法は有効 版管理システムの利用開始時期が遅い場合、適切にクラスが特定できない場合もある 今後の課題 変更の内容を考慮 ソースコードの静的解析と組み合わせる 既存手法との結果の比較