ソースコードに対して 適用可能な編集手順を探索する...
DESCRIPTION
ソースコードに対して 適用可能な編集手順を探索する リファクタリング支援手法の提案. 譜 久島亮,吉田則裕,松下誠,井上克郎 大阪 大学 大学院情報科学研究科. 発表の概要. リファクタリングとは メンバの移動 リファクタリング支援機能の問題点 編集手順を探索するリファクタリング支援手法 探索の例 提案手法の処理概要 ケーススタディ まとめと今後の課題. リファクタリング. リファクタリングの定義 外部 から見たプログラムの振る舞いを変えずにプログラムの内部の構造を改善する作業 [1] リファクタリングの目的 欠陥の発見を容易にする - PowerPoint PPT PresentationTRANSCRIPT
SIGSS
ソースコードに対して適用可能な編集手順を探索するリファクタリング支援手法の提
案
譜久島亮,吉田則裕,松下誠,井上克郎大阪大学大学院情報科学研究科
1Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
SIGSS
発表の概要
リファクタリングとは メンバの移動 リファクタリング支援機能の問題点 編集手順を探索するリファクタリング支援手法
探索の例提案手法の処理概要ケーススタディ
まとめと今後の課題
2Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
SIGSS
リファクタリング
[1] M. Fowler : Refactoring: improving the design of existing code, Addison Wesley (1999).
開発者が頻繁に行うリファクタリング [2]
[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)
リファクタリングの定義外部から見たプログラムの振る舞いを変えずにプログラ
ムの内部の構造を改善する作業 [1] リファクタリングの目的
欠陥の発見を容易にするプログラムの可読性を上げる機能追加をしやすくする
典型的なリファクタリングがまとめられている [1]メソッドの抽出フィールドの移動メソッドの移動
3Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
SIGSS
メンバ(フィールド,メソッド)の移動
ClassA{ … . method( ){ …. }}
処理内容が ClassA にに不適切なメソッド
移動されたメソッドClassB{
}
ClassB{ method( ){ …. }}
動機適切なクラスにメンバを移
動しクラスの機能を明確にする
他のリファクタリングにも利用クラスの抽出クラスのインライン化
4Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
SIGSS
class Customer{ public List mList ; public void print( ); public int count( );}
メンバの移動に必要な検討の目的 移動するメンバと関連があるメンバの移動
関連があるメンバも移動しクラスの機能をより明確にする 移動先クラスと移動元クラス間の参照方法の変更の検討
メンバの移動後もメンバ間で参照関係を保つことで振る舞いを保存する
class Rental{ public void print(Customer c); public int count(Customer c);}
移動するメンバ
移動元クラス 移動先クラス
5Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
・・・c.mList.length( );・・・
内部
関連するメンバ
・・・mList.length( );・・・
内部・・・mList[i].getName( );・・・
内部・・・c.mList[i]. getName( );・・・
内部
SIGSS
メンバの移動により参照切れが起こる場合
private メンバの移動 private メンバを参照しているメンバの移動
class A{ private Type memberA ;} class B{ memberB;}
class A{ memberB;} class B{ private Type memberA ;}
class A{ private Type memberA ;
memberB;} class B{ }
(b) memberB を B へ移動 したソースコード
(a) メンバの移動前 ソースコード
被参照メンバ
参照メンバ
プログラムの振る舞いの保存のために参照切れを解消するメンバの移動や参照方法の検討が必要である
6Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
(c) memberA を B へ移動 したソースコード
SIGSS
参照切れを解決する編集例 (1/2)
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 7
class Customer { private List mList; Rental rental; public void print( );
} class Rental { public int count(Customer c);}
移動
(a) メンバの移動後の 参照切れを含むソースコード
class Customer { Rental rental; private List mList; public void print( ); public List getMovie( ); public void setMovie(List m);}class Rental { public int count(Customer c);}
被参照メンバの
カプセル化
(b) 被参照メンバの カプセル化を行ったソースコード
class Customer { private List mList; Rental rental; public void print( ); public int count( );} class Rental { }
移動
SIGSS
参照切れを解決する編集例 (2/2)
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 8
ソースコードや開発者の意図より編集手順が複数存在する
(a) メンバの移動後の 参照切れを含むソースコード
class Customer { Rental rental;}class Rental { private List mList; public void print( ); public int count( ); }
(b) メンバの移動を 行ったソースコード
フィールドの移動
メソッドの移動
class Customer { private List mList; Rental rental; public void print( );
} class Rental { public int count(Customer c);}
移動
SIGSS
リファクタリング支援機能 統合開発環境 Eclipse ではリファクタリング支援機
能が提供されているメソッドの移動 → 選択されたメソッドの他クラ
スへの移動を支援親クラスの抽出 → 選択されたソースコードの親
クラスの作成を支援
既存のリファクタリング支援機能にはリファクタリングに伴なう複数の編集手順を提示できるものが確認できない
目的のソースコードを得るための編集手順が選択が困難である
編集の適用や取消を繰り返すことにより編集作業に時間がかかる 9Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
SIGSS
参照切れが発生するメンバの移動例
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 10
class Customer { private List mList ; Rental rental; public int count( ){ … mList.length( ); } public void print( ) { … mList[i].getName( ); }}
class Rental { private List mList;
}
移動 public int count(Customer c){ …. c.mList.length( ); }
移動
public int count( ){ …. mList.length( ); }
元に戻すカプセル化
public void setMovie(List m) { mList = m;}public List getMovie() { return mList;}public void print( ){…getMovie( ).getName( );}
public int count(Customer c){ …. c.getMovie .length( ); }
ソースコードの遷移
メソッドを移動
フィールドを移動
元に戻す
カプセル化
Eclipse でのメンバの移動の例
手戻りにより作業時間がかかる 目的とするソースコードが得にくい
問題点rental.mList[i].getName( );
SIGSS
研究の目的について
リファクタリングを行う際に適用可能な編集手順を探索する
リファクタリング完了までの編集手順 編集手順を適用したソースコード
編集の取り消しを防ぎ、作業時間が短縮
11Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
SIGSS
提案手法適用可能な編集手順の探索結果の例
「メソッドの移動」リファクタリングの編集手順探索の例
12Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
コンパイル可能なソースコード
コンパイルエラーを含むソースコード
Customer.count をRental へ移動
Customer.mList の修飾子をpublic に変更
Customer.mList を Rental へ移動
Customer.mList のカプセル化
Customer.printを B へ移動
Rental.mList の修飾子をpublic に変更
Rental.mList のカプセル化
SIGSS
適用可能な編集ステップ参照切れコンパイルエラーを解決する編集ステップ
修飾子の変更 メンバの移動 フィールドのカプセル化
被参照メンバの修飾子を変更する
移動先クラスへメンバを移動する
フィールドが所属するクラスに getter メソッドと setter メソッドを作成する
private Type value ;
public Type value ;
class A{private Type value ;…} ; class B{
} ;
class A{private Type value ;
}
public void set(Type t) { this.value = t;}public Type get( ) { return value;}
コンパイルエラーが存在するソースコードに適用13Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
SIGSS
提案手法の処理概要1. 編集ステップ導出のために以下の情報を取得
移動元クラスと移動先クラス被参照メンバとその所属クラス参照メンバとその所属クラス
2. 参照切れを解決する編集ステップを導出被参照メンバの修飾子の変更移動先クラスへのメンバの移動被参照メンバのカプセル化
3. 参照切れを含むソースコードに各編集ステップを適用4. 編集ステップを適用したソースコードで参照切れを含む
ソースコードについて 1 ~ 3 の処理を行う5. ソースコードと適用した編集ステップを木構造で構築
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 14
SIGSS
編集ステップ導出のための情報取得 適用したメンバの移動より情報を取得
移動元クラス移動先クラス
参照切れより情報を取得被参照メンバとその所属クラス参照メンバとその所属クラス
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 15
class A{ private Type memberA ;
memberB;} class B{ }
被参照メンバ
参照メンバ
class A{ private Type memberA ;} class B{ memberB;}
移動元クラス A
移動先クラス B
被参照メンバ memberA
被参照メンバの所属クラス
A
参照メンバ memberB
参照メンバの所属クラス B
メンバの移動
移動元クラス
移動先クラス
A.memberA は不可視
SIGSS
提案手法の処理概要1. 編集ステップ導出のために以下の情報を取得
移動元クラスと移動先クラス被参照メンバとその所属クラス参照メンバとその所属クラス
2. 参照切れを解決する編集ステップを導出被参照メンバの修飾子の変更移動先クラスへのメンバの移動被参照メンバのカプセル化
3. 参照切れを含むソースコードに各編集ステップを適用4. 編集ステップを適用したソースコードで参照切れを含む
ソースコードについて 1 ~ 3 の処理を行う5. ソースコードと適用した編集ステップを木構造で構築
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 16
SIGSS
編集ステップの導出( 1/3 ) 被参照メンバの修飾子の変更
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 17
class A{ private Type memberA ;} class B{ memberB;}
class A{ public Type memberA ;} class B{ memberB;}
memberA の修飾子を public に変更編集ステップ
被参照メンバ
移動元クラス A
移動先クラス B
被参照メンバ memberA
被参照メンバの所属クラス
A
参照メンバ memberB
参照メンバの所属クラス B
SIGSS
移動元クラス A
移動先クラス B
被参照メンバ memberA
被参照メンバの所属クラス
A
参照メンバ memberB
参照メンバの所属クラス B
編集ステップの導出( 2/3 ) 移動元クラスから移動先クラスへメンバの移動
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 18
class A{ private Type memberA ;} class B{ memberB;}
class A{ } class B{ private Type memberA ; memberB;} 移動元クラスである A に所属している
memberA を移動先クラスである B へ移動
編集ステップ
移動元クラス
移動先クラス
SIGSS
編集ステップの導出( 3/3 ) 被参照メンバのカプセル化
(被参照メンバがフィールドの場合)
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 19
被参照メンバ memberA
被参照メンバの所属クラス
A
参照メンバ memberB
参照メンバの所属クラス B
移動元クラス A
移動先クラス B
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;}
memberA の getter , setter をA に追加
編集ステップ
被参照メンバ
SIGSS
提案手法の処理概要1. 編集ステップ導出のために以下の情報を取得
移動元クラスと移動先クラス被参照メンバとその所属クラス参照メンバとその所属クラス
2. 参照切れを解決する編集ステップを導出被参照メンバの修飾子の変更移動先クラスへのメンバの移動被参照メンバのカプセル化
3. 参照切れを含むソースコードに各編集ステップを適用4. 編集ステップを適用したソースコードの参照切れが解決
されるまで 1 ~ 3 の処理を行う5. ソースコードと適用した編集ステップを木構造で構築
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 20
SIGSS
編集ステップの適用と繰り返し処理
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 21
ソースコード
参照切れを含むソースコー
ド
参照切れの情報
適用済編集ステップ
適用可能な編集ステッ
プ
編集ステップを適用したソース
コード
編集ステップ
ソースコード
編集ステップを有効辺ソースコードを頂点とす
る木
メンバの移動 取得
情報の抽出
編集ステップの適用
導出
履歴の取得 履歴の保持
構築
SIGSS
メソッドの移動
ケーススタディの概要
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 22
右の例に対して提案手法を適用Customer.count , Customer.prin
t は private フィールドCustomer.mList を参照
Customer.count を Rental へ移動する
class Customer { private List mList ; public int count( ){ … mList.length( ); … } public void print( ) { … mList[i].getName( ); … }}class Rental{ }
class Customer { private List mList ; public void print( ) { … mList[i].getName( ); … }}class Rental{ public int count(Customer C){ … c.mList.length( ); … }}
被参照メンバ Customer.mList
被参照メンバの所属クラス Customer
参照メンバ Rental.count
参照メンバの所属クラス Rental
移動元クラス Customer
移動先クラス Rental
SIGSS
編集ステップの導出(修飾子の変更)
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 23
Customer.mList の修飾子を public に変更
編集手順とソースコードを保持
class Customer { private List mList ; public void print( ) { … mList[i].getName( ); … }}class Rental{ public int count(Customer C){ … c.mList.length( ); … }}
class Customer { public List mList ; public void print( ) { … mList[i].getName( ); … }}class Rental{ public int count(Customer C){ … c.mList.length( ); … }}
Customer.count をRental へ移動
Customer.mList の修飾子をpublic に変更
被参照メンバ Customer.mList
編集ステップ
SIGSS
編集ステップの導出(メンバの移動)
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 24
Customer.mList を Rental へ移動
編集手順とソースコードを保持
class Customer { private List mList ; public void print( ) { … mList[i].getName( ); … }}class Rental{ public int count(Customer c){ … c.mList.length( ); … }}
class Customer { private List mList ; public void print( ) { … mList[i].getName( ); … }}class Rental{ private List mList ; public int count(Customer c){ … c.mList.length( ); … }}
Customer.count をRental へ移動
Customer.mList の修飾子をpublic に変更
Customer.mList を Rental へ移動
被参照メンバ Customer.mList
被参照メンバの所属クラス
Customer
移動元クラス Customer
移動先クラス Rental編集ステップ
SIGSS
編集ステップの導出(カプセル化)
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 25
Customer.mList の getter , setter を追加
編集手順とソースコードを保持
class Customer { private List mList ; public void print( ) { … mList[i].getName( ); … }}class Rental{ public int count(Customer c){ … c.mList.length( ); … }}
Customer.count をRental へ移動
Customer.mList の修飾子をpublic に変更
Customer.mList を Rental へ移動
Customer.mList のカプセル化
class Customer { private List mList ; public void setMovie(List m){ mList = m; } public List getMovie( ){ return mList; } public void print( ) { …getMovie( ).getName( ); …}}class Rental{ public int count(Customer c){ …c.getMovie( ).length( ); … } }
被参照メンバ Customer.mList
被参照メンバの所属クラス
Customer
編集ステップ
SIGSS
編集ステップ導出・適用の繰り返し処理
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 26
編集ステップを適用したソースコードで参照切れコンパイルエラーを含むソースコードについて繰り返し編集ステップの導出・適用を繰り返す
ソースコードから以下を得ることができたCustomer.count を移動した際の適用可能な編集手
順コンパイル可能なソースコード
Customer.count をRental へ移動
Customer.mList の修飾子をpublic に変更
Customer.mList を Rental へ移動
Customer.mList のカプセル化
Customer.printを B へ移動
Rental.mList の修飾子をpublic に変更
Rental.mList のカプセル化
SIGSS
ケーススタディの考察 適用可能な編集手順とコンパイル可能なソースコー
ドを得ることができた開発者が参照切れを解決する編集作業を行わなくて
すむので有用と言える 開発者が複数のソースコードから目的のソースコー
ドを選択するためのユーザーインターフェースが必要である
提案手法で探索した編集手順は「メンバの移動」リファクタリングの編集手順の部分的な編集手順である参照切れを解決する編集手順のみを探索している
27Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
SIGSS
まとめと今後の課題 まとめ
参照切れが発生するメンバの移動に伴なう適用可能な編集手順の探索を行った
• 適用可能な編集手順とコンパイル可能なソースコードを得ることができた
今後の課題開発者にコンパイル可能な複数のソースコードの差異を示し、目
的のソースコードの選択を支援するようなインターフェースが必要
探索できる編集手順を増やす• 移動するメンバと参照関係のある public メンバの移動など
提案手法の評価• 提案手法を用いた場合と用いなかった場合のリファクタリング作業
時間の測定
28Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University