240 likes | 362 Views
名前の重複を考慮した Java ソフトウェア部品間の 利用関係解析手法の提案. ○ 市井 誠 † , 横森 励士 ‡ , 井上 克郎 † † 大阪大学 大学院情報科学研究科 ‡ 南山大学 数理情報学部 情報通信学科. ソフトウェア部品検索システム. ソフトウェア部品の再利用・理解を支援 ソフトウェア部品 : ソフトウェアの構成単位(クラスなど). データベース化. 検索. オープンソース ソフトウェア. ライブラリ部品の 再利用. 開発現場の ソフトウェア. 実装例による 理解支援. ソフトウェア部品の利用関係.
E N D
名前の重複を考慮したJavaソフトウェア部品間の利用関係解析手法の提案名前の重複を考慮したJavaソフトウェア部品間の利用関係解析手法の提案 ○市井 誠†,横森 励士‡,井上 克郎† †大阪大学 大学院情報科学研究科 ‡南山大学 数理情報学部 情報通信学科 SS2007-75
ソフトウェア部品検索システム • ソフトウェア部品の再利用・理解を支援 • ソフトウェア部品: ソフトウェアの構成単位(クラスなど) データベース化 検索 オープンソース ソフトウェア ライブラリ部品の 再利用 開発現場の ソフトウェア 実装例による 理解支援 SS2007-75
ソフトウェア部品の利用関係 • ソフトウェア部品は互いに利用関係(依存関係)をもつ • 宣言,メソッド呼び出し,継承,… • 部品を再利用するためには,利用関係の把握が必要 • 利用関係解析による支援 実装例となる部品群 依存する部品群 インスタンス生成 メソッド呼び出し フィールド参照 メソッド呼び出し 変数宣言 継承 SS2007-75
利用関係解析における問題 [1/2] • 部品は名前により参照される • ソフトウェアのビルド単位にて一意な識別子 • データベース中では,部品の名前は一意では無い • 同じ部品の異なるバージョン • 同じインターフェースの異なる実装 • 複製・改変された部品 • 偶然同じ名前 class B { ... } ? ? class B { ... } class A { ... foong() { ... B b = new B(); ... } ... } ? class B { ... } SS2007-75
利用関係解析における問題 [2/2] • 既存の解析手法では,ユーザの要求を満たせない • 候補が1つに絞られてしまっている,もしくは • 複数の候補を適切に絞り込む手段が無い • 利用関係の区別が無い • 条件付きの利用関係を取得できない • メソッドのカスケード呼び出しなど 部品B1は使えない. 他に無いのか? ... Bfoo() { } void bar() { } ... ... Bfoo() { } void bar() { } ... B どれを使えば良いのか分からない! ... B b = new B(); ... B1 (部品A, B2を見ながら) 部品Cは使われていない様に見えるが…? B ... void bar() { } ... A ... b.foo().bar(); ... A B2 C ... Cfoo() { } ... B C B3 SS2007-75
目的 • 名前の重複を考慮した,部品間の利用関係解析 • 対象: Java • 方針 • 候補全てへ利用関係を引く • 利用関係に属性として優先度と条件を与え,候補の絞り込みを補助する 部品B1は優先度が高いが,使えない. B B1 部品B2を使おう. B A 必要なのは,部品AとB2だけだな A B2 優先度1番目, … C 優先度2番目, … C B 優先度3番目, … B3 優先度1番目, B3利用時のみ, ... SS2007-75
準備: 基本となるモデル • ソフトウェア部品検索システム SPARS-J でのモデル • に,説明のための変更を加えたもの • 参照に対してインディケーションを求めていくことで,エンティティ間の利用関係を構築する 利用関係の単位 class A { void foo() { B b = null; } } class B { void bar() { } } 参照が指し示す エンティティ A B foo bar “B” エンティティを 利用する識別子 SS2007-75
提案するモデル • 利用関係に属性 (確信度,優先度,条件) を追加する • 条件: (名前,部品,確信度,優先度)の集合. • 利用関係が求められたときに用いた,名前の重複しない部品集合 • インディケーションから求める • 確信度: {DEF, ALT} • 名前と部品の対応が確かであるという根拠が存在するかどうか • 存在するときDEF • 優先度: 0以上の整数 • 同じ名前をもつ部品の中での優先度 • 0が優先度最大 • 確信度 • 利用関係が確かであるという根拠が存在するかどうか. • 条件にALTが含まれなければDEF,さもなくばALT • 優先度 • 同じ名前を持つエンティティに対する利用関係の集合の中での優先度 • 条件に含まれる,もっとも低い確信度 SS2007-75
利用関係の属性 • インディケーションの属性に,条件を追加 • 参照が指し示すエンティティを特定するときの,名前と部品の対応 • 利用関係の属性のうちの条件は,対応するインディケーションの条件の要素の積集合 (DEF, 0, {(“B”, B, DEF, 0)}) A (A) B (B) foo bar “B” (DEF, 0, {(“B”, B, DEF, 0)}) {(“B”, B, DEF, 0)} SS2007-75
確信度と優先度 • 確信度が DEF となる条件 • 出自は同一であり,版管理されていない. • 出自が同一のリポジトリ・同一のブランチであり, かつ,それぞれの存在期間が重複する. • 優先度の決定方法 • 確信度 DEF の部品は, 確信度 ALT の部品より高い • ファイルパスが近いほど高い Software1: /src/B.java B1 DEF / 0 Software2: /src/B.java A Software1: /src/A.java B2 ALT / 1 SS2007-75
提案するモデル (図) SS2007-75
例 B (B1) class A { void main() { B b = …; b.foo().bar(); } } class B { Bfoo() { } void bar() { } } foo bar “B” {(“B”, B1, DEF, 0)} A (A) {(“B”, B1, DEF, 0)} main {(“B”, B2, ALT, 1), (“C”, C, ALT, 0)} {(“B”, B1, DEF, 0)} C (C) “B” bar “foo” “bar” B (B2) 依存 foo {(“B”, B2, ALT, 1)} class B { Cfoo() { } } class C { void bar() { } } “C” {(“B”, B2, ALT, 1)} SS2007-75
例 B (B1) class A { void main() { B b = …; b.foo().bar(); } } class B { Bfoo() { } void bar() { } } foo bar “B” A (A) (DEF, 0, {(“B”, B1, DEF, 0)}) main C (C) “B” bar “foo” “bar” B (B2) (ALT, 1, {(“B”, B2, ALT, 1), (“C”, C, ALT, 0)}) 依存 foo class B { Cfoo() { } } class C { void bar() { } } “C” (ALT, 1, {(“B”, B2, ALT, 1)}) SS2007-75
システム構成 実装 Javaソースコード集合 • Javaソースコードを解析し,部品・エンティティ・参照を抽出 • MASU*のパーサを利用 パーサ 部品 データベース • 提案手法を用いて,部品に含まれる参照のインディケーションを求める 利用関係 解析部 UI • ユーザのクエリを受け付け,利用関係を出力する • クラス単位 • Webアプリケーションとして実装 ユーザ SS2007-75 *谷口,”多言語対応メトリクス計測ツールMASUの開発,'' ウィンターワークショップ2007・イン・那覇 論文集,pp.29-30,2007.
適用実験 • 対象 • JDK1.2.2, JDK 1.4.2, 91個のOSS • Tomcat, Commons, Eclipse, NetBeans, JBoss, … • 紹介する例 • java.net.URL (JDK 1.2.2) • org.apache.commons.collections.FastArrayList (Commons collections 3.1) • org.jboss.test.util.web.HttpUtils (JBoss 3.2.5) SS2007-75
URL (JDK 1.2.2) SS2007-75
FastArrayList (Commons collections 3.1) SS2007-75
HttpUtils (JBoss 3.2.5) SS2007-75
考察 • 不正確な利用関係が存在 • 一部の部品だけに存在するメンバへの参照 • 必ずしも不要とは言い切れない • 再利用する機能に無関係なら,対応する参照を削除すれば良い • 利用関係の優先度を下げる • UIにて,メンバ単位で利用関係を閲覧出来るようにする SS2007-75
まとめ • 名前の重複を考慮した利用関係の構築手法を提案 • 解析システムを試作 • 今後の課題 • 不正確な利用関係への対処 • 優先度への反映 • UIでの対応 • ソフトウェア部品検索システムとしての実装 SS2007-75
Backward relation SS2007-75
準備: 基本となるモデル • 用語 • エンティティ (Entity) • 部品から参照される要素 • クラス(インターフェース等を含む),メンバ(メソッド,フィールド) • 参照 (Reference) • エンティティに含まれる,エンティティを利用する記述 • 変数宣言の型,メソッド呼び出し等 • インディケーション (Indication) • 参照とエンティティのペア • 参照が指し示すエンティティを表現 • 利用関係 (use relation) • エンティティとエンティティのペア • 参照に対応するインディケーションを求めることで,部品間の利用関係を求める • 簡単の為に • 参照の名前は,完全限定名 • メソッドは引数を持たない class A { void foo() { B b = null; } } class B { void bar() { } } A B foo bar “B” A B SS2007-75
基本となるモデル: クラス図風表記 SS2007-75