オブジェクト指向型言語での

リファクタリング中に生じる
コンパイルエラーの自動解消手法
井上研究室 譜久島 亮
修士論文発表会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
1
発表の概要
 リファクタリング
 メンバの移動リファクタリングについて
 メンバの移動により生じるコンパイルエラーについて
 参照切れコンパイルエラーが生じる例
 リファクタリング支援機能の問題点
 編集手順を探索するリファクタリング支援手法
 探索の例
 提案手法の処理概要
 ケーススタディ
 まとめと今後の課題
修士論文発表会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
2
リファクタリング
 リファクタリングの定義
 外部から見たプログラムの振る舞いを変えずにプログラムの
内部の構造を改善する作業[1]
 リファクタリングの目的
 欠陥の発見を容易にする
 プログラムの読みやすくする
 機能追加をしやすくする
 典型的なリファクタリングがまとめられている[1]
 メソッドの抽出
 フィールドの移動
 メソッドの移動
開発者が頻繁に行う
リファクタリング[2]
[1] M. Fowler : Refactoring: improving the design of existing code, Addison Wesley (1999).
[2] G. C. Murphy, M. Kersten and L. Findlater: “How Are Java Software Developers Using the
Eclipse IDE?’’, IEEE Softw.,23, 4, pp. 76-83(2006)
修士論文発表会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
3
メンバ(フィールド,メソッド)の移動
 動機
 適切なクラスにメンバを移動し
クラスの機能を明確にする
 他のリファクタリングにも利用
 クラスの抽出
 クラスのインライン化
処理内容がClassAに
に不適切なメソッド
ClassA{
….
method( ){
….
}
}
移動されたメソッド
ClassB{
method( ){
} ….
}
}
修士論文発表会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
4
メンバの移動に必要な検討
 移動するメンバと参照関係のあるメンバの移動を検討
 関連するメンバも移動しクラスの責任をより明確にする
移動先クラス
移動元クラス
class Customer{
public List mList ;
・・・
public int count( );
・・・
内部
}・・・
関連するメンバ
移動するメンバ
class Rental{
public List mList ;
public int count( );
・・・
}
mList.length( );
・・・
修士論文発表会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
5
メンバの移動でコンパイルエラーが起こる場合
 privateメンバの移動
 privateメンバを参照しているメンバの移動
参照切れを解消するメンバの移動や参照方法の変更が必要である
被参照メンバ
class A{
private Type memberA ;
memberB;
}
class B{
参照メンバ
}
(a) メンバの移動前
ソースコード
class A{
private Type memberA ;
}
class B{
memberB;
}
class A{
memberB;
}
class B{
private Type memberA ;
}
(b) memberBをBへ移動 (c) memberAをBへ移動
したソースコード
したソースコード
修士論文発表会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
6
メンバの移動による
コンパイルエラーを解消する編集
メンバの移動
修飾子の変更
移動先クラスへメンバを
移動する
被参照メンバの修飾子
を変更する
class A{
private Type memberA ;
…
};
class B{
};
private Type memberA ;
フィールドのカプセル化
フィールドが所属するクラ
スにgetterメソッドとsetter
メソッドを作成する
class A{
private Type memberA ;
public void
set(Type t) {
memberA = t;
}
public Type get( ) {
return memberA;
}
public Type memberA ;
}
コンパイルエラーが存在するソースコードに適用
修士論文発表会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
7
コンパイルエラーを解決する編集例
class Customer {
class Customer {
private List mList ;
private List mList ;
public void print( ) {
public int count( ){
…
…
mList[i].getName( );
mList.length( );
…
…
}
}
}
public void print( ) {
class Rental{
…
public int
mList[i].getName( );
count(Customer C){
…
…
}
c.mList.length( );
}
…
class Rental{
}
}
}
class Customer
{
他のメンバの
移動
}
class Retanl {
private List mLIst;
public void count( );
public void print();
}
class Customer {
被参照メンバの移動
public
void print();
修飾子の変更
}
class Rental {
public List mLIst;
public void count( );
}
被参照メンバの
カプセル化
class Customer {
private List mLIst;
public void print();
public List get( );
public void
set(List list);
}
class Rental {
public void count( );
}
ソースコードや開発者の意図より編集手順が複数存在する
修士論文発表会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
8
リファクタリング支援機能の問題点
 統合開発環境Eclipseのリファクタリング支援機能では
メンバの移動が支援されている
 参照切れコンパイルエラーはメンバの修飾子の変更の
み解消が可能
メンバの移動より生じたコンパイルエラーを解消する
複数の編集手順を提示できるものがない

リファクタリング経験の少ないユーザは
目的のソースコードを得る編集手順の理解が困難
修士論文発表会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
9
研究の目的
リファクタリングを行う際に生じる
コンパイルエラーを解消する編集手順を探索する


リファクタリング完了までの適用可能な
編集手順の集合
編集手順を適用したソースコード
コンパイルエラーを解消したソースコードを
ユーザに提示しリファクタリング結果である
ソースコードの選択を支援する
修士論文発表会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
10
コンパイルエラーを解消する
編集手順の探索結果の例
「メソッドの移動」リファクタリングの編集手順探索の例
Customer.
countを
Rentalへ移動
Customer.mList
の修飾子を
publicに変更
Rental.mList
の修飾子を
publicに変更
Customer.mList
をRentalへ移動
Customer.mList
のカプセル化
Customer.print
をBへ移動
Rental.mList
のカプセル化
コンパイル可能なソースコード
コンパイルエラーを含むソースコード
Eclipseのプラグインとして実装
修士論文発表会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
11
コンパイルエラーを解消する編集ステップ
メンバの移動
修飾子の変更
移動先クラスへメンバを
移動する
被参照メンバの修飾子
を変更する
class A{
private Type value ;
…
};
class B{
};
private Type value ;
フィールドのカプセル化
フィールドが所属するクラ
スにgetterメソッドとsetter
メソッドを作成する
class A{
private Type value ;
public void
set(Type t) {
this.value = t;
}
public Type get( ) {
return value;
}
public Type value ;
}
コンパイルエラーが存在するソースコードに適用
修士論文発表会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
12
提案手法の処理概要
1. 編集ステップ導出のための情報を取得
2. コンパイルエラーを解決する編集ステップを導出
3. コンパイルエラーを含むソースコードに各編集ステップ
を適用
4. 編集ステップを適用したソースコードでコンパイルエ
ラーを含むソースコードについて1~3の処理を行う
修士論文発表会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
13
編集ステップ導出のための情報取得
 適用したメンバの移動より情報を取得
 移動元クラス
 移動先クラス
被参照メンバ
class A{
private Type memberA ;
memberB;
 コンパイルエラーより情報を取得
 被参照メンバとその所属クラス
 参照メンバとその所属クラス
}
class B{
参照メンバ
メンバの移動
}
移動元クラス
移動元クラス
A
移動先クラス
B
被参照メンバ
memberA
被参照メンバの所属クラス
A
参照メンバ
memberB
参照メンバの所属クラス
B
class A{
private Type memberA ;
}
移動先クラス
class B{
memberB;
}
A.memberAは不可視
修士論文発表会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
14
提案手法の処理概要
1. 編集ステップ導出のために以下の情報を取得
2. コンパイルエラーを解決する編集ステップを導出
3. コンパイルエラーを含むソースコードに各編集ステップ
を適用
4. 編集ステップを適用したソースコードで参照切れを含
むソースコードについて1~3の処理を行う
修士論文発表会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
15
編集ステップの導出(1/3)
 被参照メンバの修飾子の変更
被参照メンバ
移動元クラス
A
移動先クラス
B
被参照メンバ
memberA
被参照メンバの所属クラス
A
参照メンバ
memberB
参照メンバの所属クラス
B
編集ステップ
class A{
private Type memberA ;
}
class B{
memberB;
}
class A{
public Type memberA ;
}
class B{
memberB;
}
memberAの修飾子をpublicに変更
修士論文発表会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
16
編集ステップの導出(2/3)
 移動元クラスから移動先クラスへメンバの移動
移動元クラス
移動元クラス
A
移動先クラス
B
被参照メンバ
memberA
被参照メンバの所属クラス
A
参照メンバ
memberB
参照メンバの所属クラス
B
class A{
private Type memberA ;
}
class B{ 移動先クラス
memberB;
}
class A{
}
class B{
private Type memberA ;
memberB;
}
編集ステップ
移動元クラスであるAに所属している
memberAを移動先クラスであるBへ移動
修士論文発表会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
17
編集ステップの導出(3/3)
 被参照メンバのカプセル化
(被参照メンバがフィールドの場合)
被参照メンバ
memberA
被参照メンバの所属クラス
A
参照メンバ
memberB
参照メンバの所属クラス
B
移動元クラス
A
移動先クラス
B
編集ステップ
memberAのgetter,setterを
Aに追加
被参照メンバ
class A{
private Type memberA ;
}
class B{
memberB;
}
class A{
private Type memberA ;
public void set(Type type){
memberA = type;
}
public Type get( ){
return memberA;
}
}
class B{
memberB;
}
修士論文発表会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
18
提案手法の処理概要
1. 編集ステップ導出のために以下の情報を取得
2. コンパイルエラーを解決する編集ステップを導出
3. コンパイルエラーを含むソースコードに各編集ステップ
を適用
4. 編集ステップを適用したソースコードの参照切れが解
決されるまで1~3の処理を行う
修士論文発表会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
19
ケーススタディの概要
 右の例に対して提案手法を適用
 Customer.count,Customer.print
はprivateフィールド
Customer.mListを参照
 Customer.countをRentalへ移動
被参照メンバ
Customer.mList
被参照メンバの所属クラス
Customer
参照メンバ
Rental.count
参照メンバの所属クラス
Rental
移動元クラス
Customer
移動先クラス
Rental
class Customer {
class Customer {
private List mList ;
private List mList ;
public void print( ) {
public int count( ){
…
…
mList[i].getName( );
mList.length( );
…
…
}
}
}
public void print( ) {
class Rental{
…
public int
mList[i].getName( );
count(Customer C){
…
…
}
メソッドの移動
c.mList.length(
);
}
…
class Rental{
}
}
}
修士論文発表会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
20
編集ステップ導出・適用の繰り返し処理
 編集ステップを適用したソースコードでコンパイルエラーコンパ
イルエラーを含むソースコードについて繰り返し編集ステップの
導出・適用を繰り返す
Customer.
countを
Rentalへ移動
Customer.mList
の修飾子を
publicに変更
Rental.mList
の修飾子を
publicに変更
Customer.mList
をRentalへ移動
Customer.mList
のカプセル化
Customer.print
をBへ移動
Rental.mList
のカプセル化
ソースコードから以下を得ることができた
Customer.countを移動した際の適用可能な編集手順
コンパイル可能なソースコード
修士論文発表会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
21
実験
 メンバの移動で生じるコンパイルエラーの解消作業
 目的:コンパイルエラー解消作業の結果を収集し正解
集合を構築する
 内容:
• 指定したメンバを移動
• メンバの移動により生じるコンパイルエラーを解消した
ソースコードを複数導出してもらう
 被験者の人数:6人
 課題数:1
修士論文発表会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
22
実験結果
 提案手法で導出するソースコードに被験者が導出した
ソースコードが多く含まれていた
 6人の被験者:10のソースコードを導出
• 提案手法で導出可能な9のソースコードを含む
 提案手法:30のソースコードを導出
 自動でソースコードを導出できる提案手法は有用
提案手法が導出した
ソースコード:要素数30
被験者が導出した
ソースコード:要素数10
提案手法で導出可能な
ソースコード:要素数9
提案手法で導出できない
ソースコード:要素数1
修士論文発表会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
23
まとめと今後の課題
 メンバの移動により生じるコンパイルエラーを解消する
編集手順と編集手順を適用したソースコードを導出した
 以下の編集ステップで編集手順を構成
• メンバの移動
• 修飾子の変更
• フィールドのカプセル化
 既存の技術では自動的に導出できない編集手順を導出
することができた
 導出したソースコードをユーザが選択するインター
フェースを用意してソースコードを選択を支援する必要
がある
修士論文発表会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
24