動的情報を利用したソフトウェア 部品評価手法 藤井 将人 井上研究室 2003年2月18日
研究の背景 ソフトウェア開発効率を向上するための手法として,再利用が注目されている 再利用を用いて開発を行うには・・・・ 既存のソフトウェア部品を同一システム内や他のシステム内で用いること ソフトウェア部品 ソフトウェア開発者が再利用を行う単位 部品例:ソースコード,ドキュメント,・・・ 再利用を用いることで,生産性と品質を改善し,結果としてコスト削減にもつながる 再利用を用いて開発を行うには・・・・ 部品選択のための基準(評価値)が必要 ソフトウェア開発効率を向上するための手法として,再利用が注目されている 再利用 既存のソフトウェア部品を同一システム内や他のシステム内で用いること ソフトウェア部品 ソフトウェア開発者が再利用を行う単位 部品例:ソースコード,ドキュメント,・・・ 再利用を用いることで,生産性と品質を改善し,結果としてコスト削減にもつながる まずはじめに研究の背景について説明します。 近年のソフトウェアの大規模化・複雑化に伴い、高品質なソフトウェアを一定期間内に効率よく開発することが重要となってきています。 ソフトウェア開発効率を向上するための手法は多数提案されておりますが、その一手法として再利用が注目されています。 再利用とは既存のソフトウェア部品を同一システム内、他のシステム内で用いることをいい、再利用を用いることにより、生産性と品質が改善され、結果としてコストの削減にもつながると言われています。 この再利用を、実際のソフトウェア開発において行うためには、 どの部品が再利用に適していて、どの部品が適していないかを判断するために 再利用性を定量的に示すことが必要です。
ソフトウェア部品評価手法 再利用を用いた開発モデル 利用実績から部品の評価値を評価: Component Rank法(CR法)* 開発者は重要であると判断した部品を再利用 被利用数が多い部品ほど重要である 利用実績から部品の評価値を評価: Component Rank法(CR法)* 被利用数の多い部品は重要 重要な部品から利用されている部品は重要 部品間の利用関係をもとに,部品の評価値を計算 よく利用される汎用性の高い部品の検索に有効 再利用性を定量的に評価する手法は多数提案されておりますが、 従来の再利用性評価手法は、個々の部品の静的な特性を評価するものでした。 例えば、えつこーんらは 複数のコードメトリクスを足し合わせて再利用性を評価する手法を提案しております。 また、やまもとらは部品のインターフェース部分の情報から再利用性を評価する手法を 提案しております。 しかしながら、静的な特性、たとえばソースコードの複雑さなどからは 再利用性が低いと評価されていても、 実際には頻繁に再利用されているような部品も存在すると考えられます。 * Inoue et al: “Component Rank: Relative Significance Rank for Software Component Search ”, ICSE2003 (to appear).
再利用の問題点 再利用における問題点 CR法によるソフトウェア部品評価手法 どの部品を利用するか? どのように部品を利用するか? 汎用性の高い部品は? どのように部品を利用するか? 「いつ」「どのように」に利用する? CR法によるソフトウェア部品評価手法 静的な利用関係解析より部品評価値を計算 「どのように部品を利用するか?」という情報を完全に 取得することができない しかしソフトウェア開発に再利用を用いるためには,どの部品を利用するか?という情報だけでなく,どのように部品を利用するかという情報も必要となります.(クリック) しかし,CR法による・・・では,静的な・・計算しているため,「どのように・・・」という情報を・・・できません.
提案手法 動的情報を利用したソフトウェア部品評価手法 特定の“機能”を実装するために,重要となる部品の検出 ソフトウェアを実行し,動的な利用関係を取得 どのように部品を利用するか? CR法を用いて,部品の評価値を求める どの部品を利用するか? 特定の“機能”を実装するために,重要となる部品の検出 そこで,本研究では,動的情報を・・・手法の提案を行います. 本提案手法では,ソフトウェアを実行時に動的な利用関係を取得し,それをもとにCR法を用いて部品評価値を求めます.この時,動的な利用関係から「どのように部品を利用するか?」という情報を取得し,部品評価値から「どの部品をりようするか?」という情報を取得できるため,特定の機能・・・検出に有効な手法であると考えられます. 以降,この提案手法について説明を行いますが,まず初めに利用関係の概念について説明します.
部品間の利用関係 ソフトウェア部品間には利用関係が存在 利用関係の種類 利用関係例 部品グラフ(Component Graph) ソースコード:メソッド呼び出し,継承 ドキュメント:リンク,参考文献 部品グラフ(Component Graph) 頂点:ソフトウェア部品 有向辺:利用関係 利用関係の種類 静的な利用関係 動的な利用関係 c4 c5 c1 c2 c3 まず、これまでソフトウェア部品という言葉を使ってきましたが、ソフトウェア開発者が再利用を行う単位をソフトウェア部品あるいは単に部品と呼びます。 部品例として、ソースコードファイルやドキュメントがあげられます。 またおのおのの部品間には、利用する、されるという利用関係が存在します。 右下の図を用いて説明します。 四角は部品をあらわし、 矢印は利用関係を表します。 この図では、 c2はc1を利用し、c1はc4を利用しています。 また、この図では、 C2’とC3がC1’を利用して、C1’はC5とC3を利用しています 部品グラフ例
動的利用関係 動的利用関係 動的利用関係解析 ソフトウェア実行時に,実際に呼び出し関係が発生した部品間の関係 動的利用関係を抽出する解析手法 ソフトウェアを実行し,その実行履歴から利用関係を取得 C4 : C5 : C2 : C3 C2 C4 C6 : : C1 C3 C5
動的利用関係 動的利用関係 動的利用関係解析 特徴 ソフトウェア実行時に,実際に呼び出し関係が発生した部品間の関係 動的利用関係を抽出する解析手法 ソフトウェアを実行し,その実行履歴から利用関係を取得 特徴 実行方法により利用関係が変化 開発者が再利用したい機能に注目できる 呼び出しの順序が取得できる
動的部品グラフの生成 動的利用関係 動的部品グラフ 実行されるまで,どの部品が利用されるか特定できない 実行中,部品が呼び出されて初めて利用関係が生じる 利用される部品は利用する部品に依存する 動的部品グラフ 有向辺の向き:利用される部品→利用する部品 C4 : C5 : 動的な利用関係では,実行されるまで・・・できません.実行中,部品が・・・生じます そのため,利用される部品・・依存するとみなすことができます. そこで,動的部品グラフを作成する際,利用される部品から利用する部品へ有効辺を引くこととします.この部品グラフを用いた部品評価値では,利用数の多いクラスは重要であると判断されます. C2 : C3 C2 C4 c1 c4 c5 C1 C6 : : 動的部品グラフ C3 C5
Component Rank法の利用 利用実績を基に部品の評価値を求める 部品評価値計算方法 計算手順 C1 C2 C3 C1 C2 C3 部品グラフの利用 計算手順 各頂点に適当な重みを与える 頂点の重みの総和は1 各有向辺の重みを求める 頂点の重みを,その頂点から出ていく辺で分配する 辺ごとに与えられた配分率を用いて計算 各頂点の重みを再計算 頂点に入ってくる辺の重みの総和を,その頂点の重みとして再定義する 頂点の重みが収束するまで,2.,3.を繰り返し計算する 収束した頂点の重みを,その頂点に対応する部品の評価値として出力 C1 0.500 C2 0.1665 C3 0.3335 C1 0.400 C2 0.200 C3 C1 C2 C3 0.1665 0.167 0.500 C1 0.333 C2 0.167 C3 0.500 C1 0.334 C2 0.333 C3 C1 0.334 C2 0.333 C3 v1×50% v2×100% v3×100% C1 C2 C3 0.167 0.333 われわれの研究グループが提案する、利用実績に基づく再利用性評価手法(Component Rank法)では、先に説明しました利用関係に着目し、その関係を抽出してグラフを作成します。 そして、各関係に重み付けし評価を行います。そのときの評価の方法として、非利用数が多い部品は重要である、また、重要な部品から利用されている部品も重要であるという方針で計算を行います。
システムの実装 システムの構成 ソフトウェア部品評価システム 利用関係解析部 部品グラフ生成部 部品評価値計算部 対象ソフトウェア:Javaプログラム 部品 クラス(ソースコード) 部品間の利用関係 クラスの継承,インターフェースおよび抽象クラスの実装,メソッド呼び出し,フィールド参照 システムの構成 利用関係解析部 ソフトウェア実行の際に,実行履歴を保存し,利用関係を出力 部品グラフ生成部 利用関係より部品グラフを生成 部品評価値計算部 CR法に基づいて,部品の評価値を計算
システムの構成 Component Rank class files A ・・ 利用関係解析部 Component Graph Class Rank A ・・ B ・・ ・・ ・・ class files CA ・・・ 08 ・・・ 00 ・・・ 利用関係解析部 Component Graph - A B ・・ 1 : Profiler (JVMDI) JavaVM Ranker A B ・・・ 部品評価値計算部 Dynamic Relation Analyzer execute result prof files 部品グラフ生成部
評価実験 実験対象プログラム javac (javaコンパイラ) 実行方法: 「正常コンパイル終了」する プログラムを引数に与える 全159クラス(内部クラス含む) 実行方法: 「正常コンパイル終了」する プログラムを引数に与える 評価値順位 クラス名(部品名) 部品評価値 利用部品数 利用数順位 1 com.sun.tools.javac.v8.Main 6230715 17 11 2 com.sun.tools.javac.v8.JavaCompiler 5401857 24 7 3 com.sun.tools.javac.v8.comp.Gen 3308156 36 4 com.sun.tools.javac.Main 2911060 53 5 com.sun.tools.javac.v8.comp.Attr 2844601 34 6 com.sun.tools.javac.v8.comp.Enter 2588095 28 com.sun.tools.javac.v8.comp.TransInner 2007288 27 8 com.sun.tools.javac.v8.comp.ClassReader 1949322 26 9 com.sun.tools.javac.v8.comp.Enter$CompleteEnter 1821256 16 14 10 com.sun.tools.javac.v8.comp.TransTypes 1797646 評価値順位 クラス名(部品名) 部品評価値 利用部品数 利用数順位 1 com.sun.tools.javac.v8.Main 6230715 17 11 2 com.sun.tools.javac.v8.JavaCompiler 5401857 24 7 3 com.sun.tools.javac.v8.comp.Gen 3308156 36 4 com.sun.tools.javac.Main 2911060 53 5 com.sun.tools.javac.v8.comp.Attr 2844601 34 6 com.sun.tools.javac.v8.comp.Enter 2588095 28 com.sun.tools.javac.v8.comp.TransInner 2007288 27 8 com.sun.tools.javac.v8.comp.ClassReader 1949322 26 9 com.sun.tools.javac.v8.comp.Enter$CompleteEnter 1821256 16 14 10 com.sun.tools.javac.v8.comp.TransTypes 1797646 まず初めに,Javac(Javaコンパイラ)に対して,部品評価値を求めた結果を表に示します.ここで,実行方法には,正常に・・・与えて実行を行いました.表を見てわるように,評価値の順位と利用部品数の順位との間には完全な相関があるわけではないことがわかります. ソフトウェアにおいて,部品利用数が少ない部品でも重要である部品も存在すると考えられます.例えば,表のMainクラスは,Javac実行時に一番最初に実行されるクラスであり,提案手法では,4位に位置していますが,利用数では53位に位置します.機能を再利用する際に,Mainの情報も必要になると考えられます.そのため,単純に利用数で評価を行うよりも,提案手法は有効であると考えられます.
評価実験 実験対象プログラム j2sdk1.4.0_01.demo.jfc.Notepad 単純なテキストエディタプログラム 全19クラス(内部クラス含む) 複数機能実行結果 「file open」実行結果 「copy&paste」実行結果 順位 クラス名 1 <System> 2 Notepad 3 Notepad$UndoAction 4 Notepad$OpenAction 5 Notepad$ShowElementTreeAction 6 Notepad$UndoHandler 7 ElementTreePanel 8 Notepad$3 9 Notepad$FileLoader : : 順位 クラス名 1 Notepad 2 <System> 3 Notepad$OpenAction 4 Notepad$FileLoader 5 Notepad$UndoHandler Notepad$UndoAction Notepad$RedoAction Notepad$NewAction Notepad$ExitAction Notepad$ShowElementTreeAction : 順位 クラス名 1 Notepad 2 <System> 3 Notepad$UndoHandler 4 Notepad$UndoAction Notepad$OpenAction 6 Notepad$RedoAction Notepad$NewAction Notepad$ExitAction Notepad$ShowElementTreeAction Notepad$ActionChangedListener Notepad$1 : 最下位ってゆう?
考察 部品利用数と部品評価値 実行方法と部品評価値 部品利用数と部品評価値に完全に相関があるわけではない 利用数が少なくても,機能実装の核となる部品が存在 提案手法による部品評価手法は有効 実行方法と部品評価値 実行された機能を実現する部品ほど、高い評価値を得られる ファイルオープンを実行した時には,その動作に関連の高い部品が,高い評価値を得る 「特定の機能を実現する部品」の再利用に利用できる
部品評価値の利用法 シーケンス図(sequence diagram)への適用 動的な部品間の利用関係をグラフ化 「いつ」「どのように」部品を利用しているか? Greeter Database Recipe Planner Massage: browse() 部品 Massage: display() return: display() メッセージのやり取り 時間軸 return: browse() Massage: makePlan()
部品評価値の利用法 適当な部品評価値でフィルタリング 例:Notepad ・・・ ・・・ 28,475,829 3,800,453 10,882,916 7,715,919 Notepad Notepad$ UndoHandler Notepad$ UndoAction Notepad$ RedoAction ・・・ Notepad$ OpenAction ・・・ Notepad$ FileLoader <init> <init> <init> <init> <init> <init> Notepadについてまずフィルタリングせずにシーケンス図を描くと下のようになります. たった19のクラスから成り立つプログラムであっても,それらの間の利用関係が全て出力されれば 複雑な図になり,開発者にとって有意義な図であるとはいえません. しかし,(クリック)FileLoaderクラスの評価値でフィルタリングすることにより(クリック) <init> <init> <init> <init> getFrame getFrame
部品評価値の利用法 適当な部品評価値でフィルタリング 例:Notepad 重要な部品のみ出力 開発者が注目すべき部品,利用関係を絞り込める 28475829 10882916 7715919 Notepad Notepad$ OpenAction Notepad$ FileLoader 重要な部品のみ出力 開発者が注目すべき部品,利用関係を絞り込める “機能の再利用”へ利用 ソフトウェア理解を支援 <init> <init> getFrame getFrame 次のように,出力される部品数が減らすことができます.この時,評価値でフィルタリングをしていますので,与えたフィルタリング値より重要な部品が残ることになり,開発者は注目すべき部品を絞り込めます.例では,FileLoaderの評価値でフィルタリングしていますが,その結果,ファイルを開くという機能を実装している部分のみ出力され,再利用を行うのに利用できるのではないかと考えられます. また,ソフトウェア理解を支援にも利用できると考えられる. : <init> <init>
システムへの追加 動的利用関係によりシーケンス図を作成 部品評価値でフィルタリング フィルタリング前 フィルタリング後
まとめ まとめ 今後の課題 動的情報を利用したソフトウェア部品評価手法の提案 評価値の利用方法-シーケンス図への利用 ソフトウェア中の特定の“機能”の再利用に利用できる 評価値の利用方法-シーケンス図への利用 ソフトウェア理解支援 今後の課題 提案手法による部品評価値計算 より多くのソフトウェアに適用 他の評価手法との比較 シーケンス図の表示 辺の重みによるフィルタリング フィルタリングの有効性検証