オブジェクト指向プログラム変更時の 影響波及解析手法の提案 近藤 大畑 井上 大阪大学大学院 2015/11/6 和弘 文明 克郎 基礎工学研究科 ソフトウェアサイエンス研究会 発表内容    オブジェクト指向プログラムに対する影響波及解析 メンバオーバーライドグラフ (MOG), メンバアクセスグラフ(MAG) による影響波及解析 Java影響波及解析ツール (JCIA) 2015/11/6 ソフトウェアサイエンス研究会 OOプログラムに対する影響波及解析  目次     影響波及解析 影響波及解析の分類 既存手法の問題点 提案する手法 2015/11/6 ソフトウェアサイエンス研究会 影響波及解析   プログラムに対する変更において, 変更の影響を受け る部分(被影響部分)を識別するための手法 適用分野  プログラム修正時の再テスト(回帰テスト)への利用 1. 被影響部分の識別 2. 修正コンポーネントの再テスト方法の決定 3.

Download Report

Transcript オブジェクト指向プログラム変更時の 影響波及解析手法の提案 近藤 大畑 井上 大阪大学大学院 2015/11/6 和弘 文明 克郎 基礎工学研究科 ソフトウェアサイエンス研究会 発表内容    オブジェクト指向プログラムに対する影響波及解析 メンバオーバーライドグラフ (MOG), メンバアクセスグラフ(MAG) による影響波及解析 Java影響波及解析ツール (JCIA) 2015/11/6 ソフトウェアサイエンス研究会 OOプログラムに対する影響波及解析  目次     影響波及解析 影響波及解析の分類 既存手法の問題点 提案する手法 2015/11/6 ソフトウェアサイエンス研究会 影響波及解析   プログラムに対する変更において, 変更の影響を受け る部分(被影響部分)を識別するための手法 適用分野  プログラム修正時の再テスト(回帰テスト)への利用 1. 被影響部分の識別 2. 修正コンポーネントの再テスト方法の決定 3.

オブジェクト指向プログラム変更時の
影響波及解析手法の提案
近藤
大畑
井上
大阪大学大学院
2015/11/6
和弘
文明
克郎
基礎工学研究科
ソフトウェアサイエンス研究会
1
発表内容



オブジェクト指向プログラムに対する影響波及解析
メンバオーバーライドグラフ (MOG),
メンバアクセスグラフ(MAG) による影響波及解析
Java影響波及解析ツール (JCIA)
2015/11/6
ソフトウェアサイエンス研究会
2
OOプログラムに対する影響波及解析

目次




影響波及解析
影響波及解析の分類
既存手法の問題点
提案する手法
2015/11/6
ソフトウェアサイエンス研究会
3
影響波及解析


プログラムに対する変更において, 変更の影響を受け
る部分(被影響部分)を識別するための手法
適用分野

プログラム修正時の再テスト(回帰テスト)への利用
1. 被影響部分の識別
2. 修正コンポーネントの再テスト方法の決定
3. 再テストによる補償範囲の認識
4. テストケースの選択, 再利用, 修正, 新規作成


解析結果に基づいてテスト対象を限定することで,
適用テストケースを必要最小限に抑えることができる
プログラム理解, 保守といったより広い範囲での利用
2015/11/6
ソフトウェアサイエンス研究会
4
OOプログラムに対する影響波及解析

オブジェクト指向プログラムでは, 従来の手続き型プロ
グラムに比べ, 変更行った箇所以外に影響を及ぼすよ
うな変更が数多く考えられる


プログラム中のあるモジュールの修正が, 他のモジュールでの
バグの原因となることもある
メンバ単位の変更(メソッドの追加, 削除等)が行われると,
メソッドのオーバーライド, フィールドの隠蔽といったオブジェク
ト指向特有の概念により様々な影響が引き起こされる[1]
[1] D. Kung, J. Gao, P. Hsia, and F. Wen, ``Change Impact Identification in Object Oriented Software
Maintenance,'' in Proceedings of the International Conference on Software Maintenance, pp.202-211,
Victoria, Canada, September 1994.
2015/11/6
ソフトウェアサイエンス研究会
5
メソッド追加による影響波及(例)
class Student extends Person {
int id;
Collection friends;
Student(String n, int id){ ... }
void addFriend(Person p){ ... }
int getFriendCount(){ ... }
}
String toString(){ ... }
class StudentData {
Map data;
}
void add(Student s){
data.put(s.toString(), ... );
}
void output(){ ... }
実行結果の変化
2015/11/6
class Person {
String name;
}
Person(String n){ ... }
String toString(){ ... }
オーバーライド
関係の変化
推移的な
実行結果の変化
class Test {
void test1(){
Student s = new Student(“Tom”, 8);
System.out.println(s.toString());
}
void test2(){ ... }
void test3(){
StudentData data = new StudentData();
Student s = new Student(“Sam”, 19);
data.add(s);
}
}
ソフトウェアサイエンス研究会
6
影響波及解析の分類(解析の粒度)

クラス単位



メンバ単位


大規模ソフトウェアにおいて有効であり, 解析も容易
クラス内のどの部分が影響を受けているのかを特定できず,
影響の予測として効果が薄い
オブジェクトの構成要素であるメンバ(メソッド, フィールド)が
解析結果となり, 直感的に理解しやすい
文単位


プログラムスライスに基づき, ある変数に影響を及ぼす文/あ
る変数が影響を及ぼす文を抽出可能
制御依存関係, データ依存関係など多くの解析が前提とな
り, 解析コストは膨大なものとなる
2015/11/6
ソフトウェアサイエンス研究会
7
影響波及解析の分類(適用分野)



回帰テスト
プログラム保守
プログラム理解
etc …
2015/11/6
ソフトウェアサイエンス研究会
8
1. 回帰テストへの適用

テストドライバの選択



プログラムの機能の一部を実行させるためのテスト用モジュー
ル (テストドライバ) を選択することで, 実際に適用するテスト
ケースを決定することができる[1]
変更後に再実行が必要なテストドライバ[2]
a) 変更, 削除されたメソッドをテストするドライバ
b) オーバーライド関係の変化したメソッドへの呼び出しを
テストするドライバ
影響波及解析により再実行テストドライバを限定する
[1] B. G. Ryder and F. Tip, ``Change Impact Analysis for Object-oriented Programs,'' in Proceedings
of the Workshop on Program Analysis for Software Tools and Engineering (PASTE 2001), pp.46-53,
Snowbird, USA, June, 2001.
[2] G. Rothermel and M. J. Harrold, ``A Safe, Efficient Regression Test Selection Technique,'‘ ACM
Transactions on Software Engineering and Methodology, Vol. 6, No. 2, pp.173-210, April 1997.
2015/11/6
ソフトウェアサイエンス研究会
9
1. 回帰テストへの適用(例)
class Student extends Person {
int id;
Collection friends;
Student(String n, int id){ ... }
void addFriend(Person p){ ... }
int getFriendCount(){ ... }
}
String toString(){ ... }
class StudentData {
Map data;
}
void add(Student s){
data.put(s.toString(), ... );
}
void output(){ ... }
実行結果の変化
2015/11/6
class Person {
String name;
}
Person(String n){ ... }
String toString(){ ... }
オーバーライド
関係の変化
推移的な
実行結果の変化
class Test {
void test1(){
Student s = new Student(“Tom”, 8);
System.out.println(s.toString());
}
void test2(){ ... }
void test3(){
StudentData data = new StudentData();
Student s = new Student(“Sam”, 19);
data.add(s);
}
}
ソフトウェアサイエンス研究会
10
2. プログラム保守への適用

変更に対応するための修正個所の特定



構文的に正しい変更を行った場合, コンパイルエラーとならな
い影響(メソッド呼び出し先の変化等)が発生することがある
変更によるメソッド呼び出し先の変化は, オーバーライド関係
の変化によるもの
変更によってオーバーライド関係の変化するメンバを特
定し, それによる呼び出し先の変化を把握することは,
プログラム修正を行おうとするユーザにとって有用
2015/11/6
ソフトウェアサイエンス研究会
11
2. プログラム保守への適用(例)
class Student extends Person {
int id;
Collection friends;
Student(String n, int id){ ... }
void addFriend(Person p){ ... }
int getFriendCount(){ ... }
}
String toString(){ ... }
class StudentData {
Map data;
}
void add(Student s){
data.put(s.toString(), ... );
}
void output(){ ... }
実行結果の変化
2015/11/6
class Person {
String name;
}
Person(String n){ ... }
String toString(){ ... }
オーバーライド
関係の変化
推移的な
実行結果の変化
class Test {
void test1(){
Student s = new Student(“Tom”, 8);
System.out.println(s.toString());
}
void test2(){ ... }
void test3(){
StudentData data = new StudentData();
Student s = new Student(“Sam”, 19);
data.add(s);
}
}
ソフトウェアサイエンス研究会
12
既存手法の問題点




オブジェクト指向プログラムで発生し得る影響は複雑
で, 変更の影響をユーザが把握することは難しい
既存の手法は回帰テストへの利用を目的としているた
め, 影響の定義が回帰テスト用に固定されている
プログラム理解, 保守といったより広い範囲での利用を
考えると, 影響の定義はユーザごとに様々で, 一意に
決定するべきものではない
手法の実装例が少ない
2015/11/6
ソフトウェアサイエンス研究会
13
提案する手法


クラスのメンバ間の関係を表現する2つのグラフ(MOG,
MAG)を利用した影響波及解析手法の提案を行う
メソッドのオーバーライド, フィールドの隠蔽を考慮した
影響波及解析の実現, およびユーザの様々な目的に
対応可能な影響の定義, 抽出を行うことができる


ソフトウェアの開発, 保守, 改良に影響波及解析を
有効利用できるシステムとして実装
対象言語Java
2015/11/6
ソフトウェアサイエンス研究会
14
MOG, MAGによる影響波及解析

目次



方針
MOG, MAGの定義
被影響部分の分類



直接被影響節点
間接被影響節点
探索ルールの定義とその適用例


2015/11/6
アクセス発生メンバ抽出
関係変化メンバ抽出
ソフトウェアサイエンス研究会
15
方針

様々な影響発生検出と波及のパターンを組み合わせ
て適用できる枠組みを実現するため, グラフを使用



影響の発生 ⇔ 節点, 辺の発生, 消失といったグラフの変化
影響の波及 ⇔ 様々なルールに基づくグラフ探索
メンバ間の関係を表現するグラフ


メンバオーバーライドグラフ(MOG)
メンバアクセスグラフ(MAG)
2015/11/6
ソフトウェアサイエンス研究会
16
メンバオーバーライドグラフ(MOG)

メンバ間のオーバーライド
関係を表現



メソッドオーバーライド
抽象メソッドの実装
フィールドの隠蔽
MOG節点
MOG辺
メソッド
override辺
フィールド
implement辺
hide辺
interface Life {
boolean
isAlive();
boolean
isAlive()
}
implement
class Animal
Life {
int ximplements
int x;
boolean isAlive()
boolean isAlive(){ … }
void move(int
x){ … }
void move(int)
hide
void eat(Animal x){ ... }
void eat(Animal)
}
override
class Human extends Animal {
x
dobledouble
x;
}
2015/11/6
void move(int
x){ ... }
void move(int)
ソフトウェアサイエンス研究会
17
メンバアクセスグラフ(MAG)

メンバ間のアクセス関係
を表現


class Human extends Animal {
doublex;x
doble
メソッド, コンストラクタの use Human(){ …Human()
}
void move(int x){ this.x = x }
呼び出し
void move(int)
}
フィールドの参照
MAG節点
MAG辺
メソッド
call辺
フィールド
use辺
コンストラクタ
2015/11/6
call
class World {
Human makeHuman(){
call
return
new
Human();
Human
makeHuman()
}
call
void testHuman(){
Human h = this.makeHuman();
void testHuman()
h.move(10);
}
}
ソフトウェアサイエンス研究会
18
MOG, MAGによる影響波及解析

目次



方針
MOG, MAGの構築
被影響部分の分類



直接被影響節点
間接被影響節点
探索ルールの定義とその適用例


2015/11/6
アクセス発生メンバ抽出
関係変化メンバ抽出
ソフトウェアサイエンス研究会
19
被影響部分の分類

被影響部分の抽出

MOG, MAG の変化を調査



変更によって何らかの変化が生じたMOG節点,MAG節点
を検出し, その節点からMOG辺, MAG辺をたどることで, 被
影響部分の抽出を行う
抽出される被影響部分の単位は, プログラム上ではメンバ
(被影響メンバ), MOG,MAG上では節点(被影響節点)と
なる
ユーザの目的に応じた被影響メンバの抽出

グラフ探索の対象となる節点を分類


直接被影響節点
間接被影響節点
2015/11/6
ソフトウェアサイエンス研究会
20
直接被影響節点
直接被影響節点
D-E1 : 影響の発生元の節点

D-E2 : 辺の発生先の節点
D-E3 : 辺の発生元の節点
新たな呼び出し先が発生し,
実行結果が変化し得るメソッド
D-E4 : 辺の消失先の節点

D-E5 : 辺の消失元の節点
MOG
MAG
M5
M2
M1
M3
M7
M1
M10
F2
M9
M7
M4
M8
2015/11/6
F1
M6
M9
M4
M5
M2
F1
M6
M3
新たにオーバーライド
されるメソッド
M10
F2
M8
ソフトウェアサイエンス研究会
21
間接被影響節点
オーバーライド先のメンバを修正
した場合に, オーバーライド関係が
変化し得るメソッド

間接被影響節点
I-E1 : 順方向の推移的な
影響波及がある節点
実行結果が変化し得るメソッドを
呼び出していることで, 推移的に
実行結果が変化し得るメソッド

I-E2 : 逆方向の推移的な
影響波及がある節点
MOG
MAG
M5
M2
F1
M6
M3
M1
M3
M7
M1
M10
F2
M9
M7
M4
M8
2015/11/6
F1
M6
M9
M4
M5
M2
M10
F2
M8
ソフトウェアサイエンス研究会
22
MOG, MAGによる影響波及解析

目次



方針
MOG, MAGの構築
被影響部分の分類



直接被影響節点
間接被影響節点
探索ルールの定義とその適用例


2015/11/6
アクセス発生メンバ抽出
関係変化メンバ抽出
ソフトウェアサイエンス研究会
23
探索ルールの定義とその適用例


各被影響節点の抽出の有無を組み合わせることによ
り, ユーザの目的に応じた被影響メンバの抽出が可能
となる
グラフ探索ルールの例
R1 :
R2 :
R3 :
・・・
Rn :
2015/11/6
アクセス発生メンバ抽出
関係変化メンバ抽出
間接アクセスメンバ抽出
ユーザ定義の抽出ルール
ソフトウェアサイエンス研究会
24
R1 : アクセス発生メンバ抽出


変更により発生した新たな実行経路上に存在する部
分を抽出する
既存の影響波及解析手法が対象としている, 回帰テ
ストでの利用を考慮した抽出パターン
直接被影響節点
D-E1 : 影響の発生元の節点
D-E2 : 辺の発生先の節点
D-E3 : 辺の発生元の節点
D-E4 : 辺の消失先の節点
D-E5 : 辺の消失元の節点
2015/11/6

MOGの探索ルール
MAGの探索ルール
間接被影響節点
I-E1 : 順方向の推移的な
影響波及がある節点
I-E2 : 逆方向の推移的な
影響波及がある節点
ソフトウェアサイエンス研究会
25
メソッド追加による影響波及(例)
class Student extends Person {
int id;
Collection friends;
Student(String n, int id){ ... }
void addFriend(Person p){ ... }
int getFriendCount(){ ... }
}
String toString(){ ... }
class StudentData {
Map data;
}
void add(Student s){
data.put(s.toString(), ... );
}
void output(){ ... }
2015/11/6
class Person {
String name;
}
Person(String n){ ... }
String toString(){ ... }
class Test {
void test1(){
Student s = new Student(“Tom”, 8);
System.out.println(s.toString());
}
void test2(){ ... }
void test3(){
StudentData data = new StudentData();
Student s = new Student(“Sam”, 19);
data.add(s);
}
}
ソフトウェアサイエンス研究会
26
R1 : アクセス発生メンバ抽出 (MAGの探
索)
MAG
Person
Person()
Student
String toString()
Test
Student()
void test1()
void addFriend(Person)
void test2()
int getFriendCount()
String toString()
StudentData
void test3()
StudentData()
void add(Student)
void output()
2015/11/6
ソフトウェアサイエンス研究会
27
R2 : 関係変化メンバ抽出


オーバライド関係の変化, およびそれに伴うアクセス関
係の変化が発生するメンバを全て抽出する
プログラム変更によるメンバ間の関係変化を把握し,
変更に対応するべき修正個所を識別するために有効
直接被影響節点
D-E1 : 影響の発生元の節点
D-E2 : 辺の発生先の節点
D-E3 : 辺の発生元の節点
D-E4 : 辺の消失先の節点
D-E5 : 辺の消失元の節点
2015/11/6

MOGの探索ルール
MAGの探索ルール
間接被影響節点
I-E1 : 順方向の推移的な
影響波及がある節点
I-E2 : 逆方向の推移的な
影響波及がある節点
ソフトウェアサイエンス研究会
28
R2 : 関係変化メンバ抽出 (MOGの探
索)
MAG
MOG
Person
Person()
Student
String toString()
Test
Student()
void test1()
void addFriend(Person)
void test2()
int getFriendCount()
String toString()
StudentData
void test3()
StudentData()
void add(Student)
void output()
2015/11/6
ソフトウェアサイエンス研究会
29
R2 : 関係変化メンバ抽出 (MAGの探索)
MAG
Person
Person()
Student
String toString()
Test
Student()
void test1()
void addFriend(Person)
void test2()
int getFriendCount()
String toString()
StudentData
void test3()
StudentData()
void add(Student)
void output()
2015/11/6
ソフトウェアサイエンス研究会
30
Java影響波及解析ツール (JCIA)



ツールの機能
ツール構成
ツール使用例
2015/11/6
ソフトウェアサイエンス研究会
31
ツールの機能

被影響メンバの抽出, 表示


抽出結果のフィルタリング


ユーザによって指定された探索ルールを適用し, 被影響メン
バの抽出および表示を行う
複数の探索ルールの組み合わせによる被影響メンバの抽出
を行う場合, ルールごとにフィルタリングして抽出結果の表示
を行う
アクセス関係の表示


指定メンバに関し, アクセスする可能性のあるメンバ, アクセ
スされる可能性のあるメンバを表示する
間接的なアクセスに関しては, その深さを指定できる
2015/11/6
ソフトウェアサイエンス研究会
32
ツール構成
解析
グラフ管理部
意味解析部
構文解析部
構築
グラフ
ソースファイル
変更頂点取得
走査
変更
変更管理部
変更解析部
変更取得
グラフ走査部
結果取得
影響波及情報取得 / 解析要求
2015/11/6
UI
ソフトウェアサイエンス研究会
33
ツール使用例
JCIA
ソースファイル

ソースファイルを解析し
 変更のあったソースファイルを
グラフを構築する
解析しグラフを再構築
 指定探索ルールに従って
被影響メンバを抽出する

ソースファイルを変更する
 被影響メンバを表示する
グラフ

グラフ探索ルールを指定し
グラフ構築を要求する
解析の実行を要求する
2015/11/6
ソフトウェアサイエンス研究会
34
まとめと今後の課題

まとめ



Javaを対象言語とした影響波及解析手法の提案と,
開発中のJava影響波及解析ツールの紹介を行った
グラフに基づいて, 変更の検出および被影響部分の探索を
行うことで, ユーザの目的に応じた様々な解析結果を取得
することができる
今後の課題



GUIの実装によるシステム構築
対応可能な変更の種類の拡張
ツールの有効性評価
2015/11/6
ソフトウェアサイエンス研究会
35