28
SIGSS ソソソソソソソソソソ ソソソソソソソソソソソソソソ ソソソソソソソソソソソソソソソ ソソソソ ソソソソソ ソソソソ ソソソソ ,,, ソソソソ ソソソソソソソソソソ 1 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

ソースコードに対して 適用可能な編集手順を探索する リファクタリング支援手法の提案

  • Upload
    miriam

  • View
    46

  • Download
    4

Embed Size (px)

DESCRIPTION

ソースコードに対して 適用可能な編集手順を探索する リファクタリング支援手法の提案. 譜 久島亮,吉田則裕,松下誠,井上克郎 大阪 大学 大学院情報科学研究科. 発表の概要. リファクタリングとは メンバの移動 リファクタリング支援機能の問題点 編集手順を探索するリファクタリング支援手法 探索の例 提案手法の処理概要 ケーススタディ まとめと今後の課題. リファクタリング. リファクタリングの定義 外部 から見たプログラムの振る舞いを変えずにプログラムの内部の構造を改善する作業 [1] リファクタリングの目的 欠陥の発見を容易にする - PowerPoint PPT Presentation

Citation preview

Page 1: ソースコードに対して 適用可能な編集手順を探索する リファクタリング支援手法の提案

SIGSS

ソースコードに対して適用可能な編集手順を探索するリファクタリング支援手法の提

譜久島亮,吉田則裕,松下誠,井上克郎大阪大学大学院情報科学研究科

1Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

Page 2: ソースコードに対して 適用可能な編集手順を探索する リファクタリング支援手法の提案

SIGSS

発表の概要

リファクタリングとは メンバの移動 リファクタリング支援機能の問題点 編集手順を探索するリファクタリング支援手法

探索の例提案手法の処理概要ケーススタディ

まとめと今後の課題

2Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

Page 3: ソースコードに対して 適用可能な編集手順を探索する リファクタリング支援手法の提案

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

Page 4: ソースコードに対して 適用可能な編集手順を探索する リファクタリング支援手法の提案

SIGSS

メンバ(フィールド,メソッド)の移動

ClassA{  … . method( ){ …. }}

処理内容が ClassA にに不適切なメソッド

移動されたメソッドClassB{

}

ClassB{ method( ){ …. }}

動機適切なクラスにメンバを移

動しクラスの機能を明確にする

他のリファクタリングにも利用クラスの抽出クラスのインライン化

4Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

Page 5: ソースコードに対して 適用可能な編集手順を探索する リファクタリング支援手法の提案

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( );・・・

内部

Page 6: ソースコードに対して 適用可能な編集手順を探索する リファクタリング支援手法の提案

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 へ移動 したソースコード

Page 7: ソースコードに対して 適用可能な編集手順を探索する リファクタリング支援手法の提案

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 { }

移動

Page 8: ソースコードに対して 適用可能な編集手順を探索する リファクタリング支援手法の提案

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);}

移動

Page 9: ソースコードに対して 適用可能な編集手順を探索する リファクタリング支援手法の提案

SIGSS

リファクタリング支援機能 統合開発環境 Eclipse ではリファクタリング支援機

能が提供されているメソッドの移動 → 選択されたメソッドの他クラ

スへの移動を支援親クラスの抽出 → 選択されたソースコードの親

クラスの作成を支援

既存のリファクタリング支援機能にはリファクタリングに伴なう複数の編集手順を提示できるものが確認できない

目的のソースコードを得るための編集手順が選択が困難である

編集の適用や取消を繰り返すことにより編集作業に時間がかかる 9Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

Page 10: ソースコードに対して 適用可能な編集手順を探索する リファクタリング支援手法の提案

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( );

Page 11: ソースコードに対して 適用可能な編集手順を探索する リファクタリング支援手法の提案

SIGSS

研究の目的について

リファクタリングを行う際に適用可能な編集手順を探索する

リファクタリング完了までの編集手順 編集手順を適用したソースコード

編集の取り消しを防ぎ、作業時間が短縮

11Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

Page 12: ソースコードに対して 適用可能な編集手順を探索する リファクタリング支援手法の提案

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 のカプセル化

Page 13: ソースコードに対して 適用可能な編集手順を探索する リファクタリング支援手法の提案

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

Page 14: ソースコードに対して 適用可能な編集手順を探索する リファクタリング支援手法の提案

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

Page 15: ソースコードに対して 適用可能な編集手順を探索する リファクタリング支援手法の提案

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 は不可視

Page 16: ソースコードに対して 適用可能な編集手順を探索する リファクタリング支援手法の提案

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

Page 17: ソースコードに対して 適用可能な編集手順を探索する リファクタリング支援手法の提案

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

Page 18: ソースコードに対して 適用可能な編集手順を探索する リファクタリング支援手法の提案

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 へ移動

編集ステップ

移動元クラス

移動先クラス

Page 19: ソースコードに対して 適用可能な編集手順を探索する リファクタリング支援手法の提案

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 に追加

編集ステップ

被参照メンバ

Page 20: ソースコードに対して 適用可能な編集手順を探索する リファクタリング支援手法の提案

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

Page 21: ソースコードに対して 適用可能な編集手順を探索する リファクタリング支援手法の提案

SIGSS

編集ステップの適用と繰り返し処理

Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 21

ソースコード

参照切れを含むソースコー

参照切れの情報

適用済編集ステップ

適用可能な編集ステッ

編集ステップを適用したソース

コード

編集ステップ

ソースコード

編集ステップを有効辺ソースコードを頂点とす

る木

メンバの移動 取得

情報の抽出

編集ステップの適用

導出

履歴の取得 履歴の保持

構築

Page 22: ソースコードに対して 適用可能な編集手順を探索する リファクタリング支援手法の提案

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

Page 23: ソースコードに対して 適用可能な編集手順を探索する リファクタリング支援手法の提案

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

編集ステップ

Page 24: ソースコードに対して 適用可能な編集手順を探索する リファクタリング支援手法の提案

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編集ステップ

Page 25: ソースコードに対して 適用可能な編集手順を探索する リファクタリング支援手法の提案

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

編集ステップ

Page 26: ソースコードに対して 適用可能な編集手順を探索する リファクタリング支援手法の提案

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 のカプセル化

Page 27: ソースコードに対して 適用可能な編集手順を探索する リファクタリング支援手法の提案

SIGSS

ケーススタディの考察 適用可能な編集手順とコンパイル可能なソースコー

ドを得ることができた開発者が参照切れを解決する編集作業を行わなくて

すむので有用と言える 開発者が複数のソースコードから目的のソースコー

ドを選択するためのユーザーインターフェースが必要である

提案手法で探索した編集手順は「メンバの移動」リファクタリングの編集手順の部分的な編集手順である参照切れを解決する編集手順のみを探索している

27Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

Page 28: ソースコードに対して 適用可能な編集手順を探索する リファクタリング支援手法の提案

SIGSS

まとめと今後の課題 まとめ

参照切れが発生するメンバの移動に伴なう適用可能な編集手順の探索を行った

• 適用可能な編集手順とコンパイル可能なソースコードを得ることができた

今後の課題開発者にコンパイル可能な複数のソースコードの差異を示し、目

的のソースコードの選択を支援するようなインターフェースが必要

探索できる編集手順を増やす• 移動するメンバと参照関係のある public メンバの移動など

提案手法の評価• 提案手法を用いた場合と用いなかった場合のリファクタリング作業

時間の測定 

28Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University