同種の異なる機能を 持つプログラムに共通機能を追加

同種の異なる機能を持つプログラムに共通
機能を追加する支援システムの構築
海尻・海谷研究室
07TA595J
本田 俊光
研究の背景(1)
 ソフトウェア開発において、開発目的によって
作業の分岐や、システムの統合が行われている。
例えば、新機能の開発と既存機能の保守を分担して
作業する場合。
 一度変更されてしまったソフトウェアは、違いを見つけ
て統合するのは困難。Subversion などのバージョ
ン管理ツールの支援が必要になる。
研究の背景(2)
 バージョン管理ツールを使用しても、変更が
あった一部の機能に関係するコードのみを統
合することは困難。
例えば、開発者用のバージョンの一部機能を
安定化バージョンに追加するような場合。
研究の目的
 同種の異なる機能を持つプログラムに共通機
能を追加する支援システムの構築。
 開発経験を利用して、システムの機能の一部
を、他のシステムに追加することを支援する。
支援システムの機能
 二つの異なるシステムの機能について、
メソッド呼出の単位で、違を確認できる
機能。
 機能に関係するファイルの差分について、
確認できる機能。
用語の説明
 機能に関するテスト
入力データに対する出力結果が仕様どうりか検証す
ること。
 コールグラフ
コールグラフとはメソッド間の呼び出し関係を表現
した有向グラフ。プログラム中のメソッドをノードで、
呼び出し関係をエッジで表現する。
支援システムの概要(1)
 元は同じシステムで、それぞれに変更が加えられた
システム1とシステム2がある。
システムのメソッド構成と呼出関係の図:
システム1
M1
M2
システム2
M1
M2
M3
M4
支援システムの概要(2)
システム1の一部の機能を、システム2に追加する
場合の動作。
1.
2.
3.
4.
システム1で機能に関係するテストを実行する。
実行の記録を解析する。
コールグラフを生成する。
差分リスト表を生成する。
支援システムの構成
Java言語
システム1
CUI画面
Java言語
AspectJ
差分リスト
解析システム
システム2
Graphviz
支援システムの動作
(コールグラフの動的生成)
プログラム
アスペクト
コールグラフ
呼出先
メソッド呼出
アドバイス:
ファイルにログを書く
0 1 0 0
呼
出
元
 AspectJ を使ってメソッド呼出を記録する。
 記録を辿って呼出の関係をグラフにする。
0 0 0 0
0 1 0 1
1 0 0 0
支援システムの動作
(ファイル差分表の生成)
実行ログ(メソッド名)
ファイルの保持するメソッド名
対応関係をとる
 実行ログからメソッド名を抽出。
 クラスファイルからメソッド名を抽出(Bcel を使用)。
Bcel: Javaのbytecode操作ライブラリ
 対応関係を調べる。
システムの動作(ファイル差分表の生成)
システム1
システム2
ファイル差分表
ファイル1 ファイル2
ファイル2
ファイル1
・メソッドの内容が容等しい
・メソッドの内容が異なる
・メソッドがない
・メソッド以外の変更がある
Diff
・ファイルがない
 ファイルのDiff(プログラムの行ごとの差分)をとる。
 差分からメソッドに関する変更を抽出。
支援システムの動作(メソッドの差分)
Java ソース
Java Bytecode
0:
1:
2:
3:
0
5:
iconst_0
istore_2
iload_2
bipush 10
8:
c
invokestati
if_icmpge
Bcel
public void M1() {
i++;
..
..
}
 Bcelを使用して、メソッドの先頭と終わりの行をみつけて、
ソースコードの差分(Diff)をとる。
支援システムの使い方(1)
システム1の機能の一部をシステム2へ移す場合
システム1
1.
2.
3.
4.
システム2
システム1でAspectJのプログラムをコンパイル。
システム1で機能に関するテストを使ってログを記録。
ログからシステム1のコールグラフを生成。
システム1とシステム2のファイル差分表を生成。
支援システムの使い方(2)
システム1
M2
M3
ファイル差分表
システム1、2で
M2は内容が異
なる
システム2
M2
M3
システム2で
M3は未定義
 実装: システム2でM3を定義して、M2を変更する。
コールグラフ複雑化の問題
 機能に関係するメソッド数が増えると、コールグラフが複
雑化して、理解が困難になる。
 追加したい機能に関係する変更点は、少ない場合が多い。
有効グラフの任意のノードの近傍表示
深さ優先探索
あるノードから移動で
きる全方向に、探索を
行い、一定距離で探
索を打ち切る。
探索結果を保存(1)
有効グラフの転置
有効グラフは二次元の行列に
より表されている。
行列の転置行列を逆向きの有効
グラフを作成することができる。
逆方向深さ優先探索
転置により逆向きに
なった有効グラフを深さ優
先探索を行うことにより、
任意のノードより逆方向
グラフを求めることができ
る。
探索結果を保存する(2)
探索を打ち切ったノードを
記録しておく。
有効グラフの任意のノードの近傍表示
(1)と(2)の結果を合わせる
評価方法
1. システムを開発する。
2. 完成したシステムの一部を変更する。
3. 一部の機能を実装開始から単体テストが
合格するまでの時間を計る。
支援システムを使った場合と使わない場合の開発時間の
差比較する。
評価システム
出力
入力
コントローラ
処理
機能
・中値記法の式の計算。
・逆ポーランド記法の計算。
・プログラムリストの表示。
・時刻の表示。
・日付の表示。
・ホスト名の表示。
・ディレクトリのファイル数を表示。
クラス数:
8
メソッド数: 54
総行数: 663
評価システムに追加する機能
1. 1970年からのマイクロ秒を日付に変更 。 (メソッド数1)
2. プログラムリストに行番号を表示させる。 (メソッド数1)
3. ホスト名を取得。 (メソッド数1)
4. ディレクトリのファイルの表示する。 (メソッド数2)
5. 中値記法に関するエラー処理をつける。(メソッド数3)
結果
実験者数4人
機能1
121
131
(単位 秒)
支援システム使用
機能2
機能3
機能4
153 131
120 129
453
531
機能5
合計
651 1509
713 1614
支援システム未使用
機能1
189
203
機能2
機能3
機能4
162 154
202 195
720
818
機能5
903
1036
合計
2128
2454
まとめ
 機能の異なるシステム追加する支援システム
を構築した。
 評価を行い、有効性を確認した。
今後の課題
 大規模なシステムの適応した場合の検証を
行う。
 機能追加による影響解析を行う。
コールグラフの遠近表示
org.apache.log4j.Layout.getFooter
org.apache.log4j.Logger.trace
org.apache.log4j.Layout.format
 グラフのノードはクラス名とメソッド名で構成されている。
 クラスとメソッドの関係がわかりにくい。
コールグラフの遠近表示
Sample.Level.info
Sample.log.trace
Sample.log.getLog
Sample.log.getLog
Sample.log.isTrace
 あるノードから一定以上にある、ノードをクラスとしてまとめる。
新しいグラフの生成(深さ優先探索)
Sample.log
0 1 0 0
Sample.log
0 0 0 0
0 1 0 1
Sample.log.getLog
1 0 0 0
Sample.log
 新しくノードを追加しながら、グラフを作成
 あるノードから一定以上にある、ノードをクラスとしてまとめる。