1 / 28

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

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

miriam
Download Presentation

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

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. ソースコードに対して適用可能な編集手順を探索するリファクタリング支援手法の提案ソースコードに対して適用可能な編集手順を探索するリファクタリング支援手法の提案 譜久島亮,吉田則裕,松下誠,井上克郎 大阪大学 大学院情報科学研究科 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

  2. 発表の概要 • リファクタリングとは • メンバの移動 • リファクタリング支援機能の問題点 • 編集手順を探索するリファクタリング支援手法 • 探索の例 • 提案手法の処理概要 • ケーススタディ • まとめと今後の課題 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

  3. リファクタリング • リファクタリングの定義 • 外部から見たプログラムの振る舞いを変えずにプログラムの内部の構造を改善する作業[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

  4. メンバ(フィールド,メソッド)の移動 • 動機 • 適切なクラスにメンバを移動しクラスの機能を明確にする • 他のリファクタリングにも利用 • クラスの抽出 • クラスのインライン化 処理内容がClassAに に不適切なメソッド ClassA{ …. method( ){ …. } } ClassB{ } ClassB{ method( ){ …. } } 移動されたメソッド Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

  5. メンバの移動に必要な検討の目的 • 移動するメンバと関連があるメンバの移動 • 関連があるメンバも移動しクラスの機能をより明確にする • 移動先クラスと移動元クラス間の参照方法の変更の検討 • メンバの移動後もメンバ間で参照関係を保つことで振る舞いを保存する 内部 ・・・ c.mList[i]. getName( ); ・・・ 移動先クラス 移動元クラス class Customer{ public List mList; public void print( ); public intcount( ); } class Rental{ public void print(Customer c); public int count(Customer c); } 関連するメンバ 移動するメンバ 内部 内部 内部 ・・・ mList.length( ); ・・・ ・・・ mList[i].getName( ); ・・・ ・・・ c.mList.length( ); ・・・ Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

  6. メンバの移動により参照切れが起こる場合 • privateメンバの移動 • privateメンバを参照しているメンバの移動 プログラムの振る舞いの保存のために 参照切れを解消するメンバの移動や参照方法の検討が必要である 被参照メンバ class A{ private Type memberA ; memberB; } class B{ } class A{ memberB; } class B{ private Type memberA ; } class A{ private Type memberA ; } class B{ memberB; } 参照メンバ • メンバの移動前 •    ソースコード (b) memberBをBへ移動 したソースコード (c) memberAをBへ移動 したソースコード Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

  7. 参照切れを解決する編集例(1/2) 被参照メンバの カプセル化 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); } class Customer { private List mList; Rental rental; public void print( ); } class Rental { public int count(Customer c); } class Customer { private List mList; Rental rental; public void print( ); public intcount( ); } class Rental { } 移動 移動 • メンバの移動後の • 参照切れを含むソースコード (b) 被参照メンバの    カプセル化を行ったソースコード Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

  8. 参照切れを解決する編集例(2/2) class Customer { private List mList; Rental rental; public void print( ); } class Rental { public int count(Customer c); } class Customer { Rental rental; } class Rental { private List mList; public voidprint( ); public int count( ); } フィールドの移動 メソッドの移動 移動 • メンバの移動後の • 参照切れを含むソースコード (b) メンバの移動を    行ったソースコード ソースコードや開発者の意図より編集手順が複数存在する Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

  9. リファクタリング支援機能 • 統合開発環境Eclipseではリファクタリング支援機能が提供されている • メソッドの移動 → 選択されたメソッドの他クラスへの移動を支援 • 親クラスの抽出 → 選択されたソースコードの親クラスの作成を支援 既存のリファクタリング支援機能にはリファクタリングに伴なう 複数の編集手順を提示できるものが確認できない • 目的のソースコードを得るための編集手順が選択が困難である • 編集の適用や取消を繰り返すことにより編集作業に時間がかかる Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

  10. 参照切れが発生するメンバの移動例 ソースコードの遷移 Eclipseでのメンバの移動の例 カプセル化 元に戻す class Customer { privateList mList; Rental rental; public int count( ){ … mList.length( ); } publicvoidprint( ) { … mList[i].getName( ); } } class Rental { private List mList; } メソッドを 移動 移動 publicint count(Customer c){ …. c.mList.length( ); } public void setMovie(List m) { mList= m; } public List getMovie() { return mList; } public void print( ){ …getMovie( ).getName( ); } 元に 戻す 移動 カプセル化 フィールド を移動 publicint count( ){ …. mList.length( ); } publicint count(Customer c){ …. c.getMovie .length( ); } 問題点 rental.mList[i].getName( ); • 手戻りにより作業時間がかかる • 目的とするソースコードが得にくい Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

  11. 研究の目的について リファクタリングを行う際に 適用可能な編集手順を探索する • リファクタリング完了までの編集手順 • 編集手順を適用したソースコード 編集の取り消しを防ぎ、作業時間が短縮 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

  12. 提案手法適用可能な編集手順の探索結果の例 「メソッドの移動」リファクタリングの編集手順探索の例 Customer.mList の修飾子を publicに変更 Rental.mList の修飾子を publicに変更 Customer. countを Rentalへ移動 Customer.mList をRentalへ移動 Customer.print をBへ移動 Customer.mList のカプセル化 Rental.mList のカプセル化 コンパイル可能なソースコード コンパイルエラーを含むソースコード Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

  13. 適用可能な編集ステップ 参照切れコンパイルエラーを解決する編集ステップ 修飾子の変更 メンバの移動 フィールドのカプセル化 被参照メンバの修飾子を変更する 移動先クラスへメンバを 移動する フィールドが所属するクラスにgetterメソッドとsetterメソッドを作成する privateType value ; class A{ privateType value ; } class A{ privateType value ; … } ; publicvoid set(Type t) { this.value= t; } publicType get( ) { return value; } class B{ } ; publicType value ; コンパイルエラーが存在するソースコードに適用 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

  14. 提案手法の処理概要 • 編集ステップ導出のために以下の情報を取得 • 移動元クラスと移動先クラス • 被参照メンバとその所属クラス • 参照メンバとその所属クラス • 参照切れを解決する編集ステップを導出 • 被参照メンバの修飾子の変更 • 移動先クラスへのメンバの移動 • 被参照メンバのカプセル化 • 参照切れを含むソースコードに各編集ステップを適用 • 編集ステップを適用したソースコードで参照切れを含むソースコードについて1~3の処理を行う • ソースコードと適用した編集ステップを木構造で構築 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.memberAは不可視 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

  16. 提案手法の処理概要 • 編集ステップ導出のために以下の情報を取得 • 移動元クラスと移動先クラス • 被参照メンバとその所属クラス • 参照メンバとその所属クラス • 参照切れを解決する編集ステップを導出 • 被参照メンバの修飾子の変更 • 移動先クラスへのメンバの移動 • 被参照メンバのカプセル化 • 参照切れを含むソースコードに各編集ステップを適用 • 編集ステップを適用したソースコードで参照切れを含むソースコードについて1~3の処理を行う • ソースコードと適用した編集ステップを木構造で構築 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

  17. 編集ステップの導出(1/3) • 被参照メンバの修飾子の変更 被参照メンバ class A{ privateType memberA ; } class B{ memberB; } class A{ publicType memberA ; } class B{ memberB; } 編集ステップ memberAの修飾子をpublicに変更 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

  18. 編集ステップの導出(2/3) • 移動元クラスから移動先クラスへメンバの移動 移動元クラス 移動先クラス class A{ private Type memberA ; } class B{ memberB; } class A{ } class B{ privateType memberA ; memberB; } 編集ステップ 移動元クラスであるAに所属している memberAを移動先クラスであるBへ移動 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

  19. 編集ステップの導出(3/3) 被参照メンバ • 被参照メンバのカプセル化 (被参照メンバがフィールドの場合) 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に追加 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

  20. 提案手法の処理概要 • 編集ステップ導出のために以下の情報を取得 • 移動元クラスと移動先クラス • 被参照メンバとその所属クラス • 参照メンバとその所属クラス • 参照切れを解決する編集ステップを導出 • 被参照メンバの修飾子の変更 • 移動先クラスへのメンバの移動 • 被参照メンバのカプセル化 • 参照切れを含むソースコードに各編集ステップを適用 • 編集ステップを適用したソースコードの参照切れが解決されるまで1~3の処理を行う • ソースコードと適用した編集ステップを木構造で構築 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

  21. 編集ステップの適用と繰り返し処理 メンバの移動 取得 ソースコード 参照切れを含むソースコード 情報の抽出 編集ステップを適用したソースコード 編集ステップ の適用 参照切れの情報 導出 構築 適用済 編集ステップ 適用可能な編集ステップ 履歴の保持 履歴の取得 編集ステップ ソースコード 編集ステップを有効辺 ソースコードを頂点とする木 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

  22. ケーススタディの概要 • 右の例に対して提案手法を適用 • Customer.count,Customer.printはprivateフィールドCustomer.mListを参照 • Customer.countをRentalへ移動する class Customer { privateList mList; publicvoidprint( ) { … mList[i].getName( ); … } } class Rental{ public int count(Customer C){ … c.mList.length( ); … } } class Customer { privateList mList; public int count( ){ … mList.length( ); … } publicvoidprint( ) { … mList[i].getName( ); … } } class Rental{ } メソッドの移動 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

  23. 編集ステップの導出(修飾子の変更) class Customer { privateList mList; publicvoidprint( ) { … mList[i].getName( ); … } } class Rental{ public int count(Customer C){ … c.mList.length( ); … } } class Customer { public List mList; publicvoidprint( ) { … mList[i].getName( ); … } } class Rental{ public int count(Customer C){ … c.mList.length( ); … } } 編集ステップ Customer.mListの修飾子をpublicに変更 Customer.mList の修飾子を publicに変更 Customer. countを Rentalへ移動 • 編集手順とソースコードを保持 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

  24. 編集ステップの導出(メンバの移動) class Customer { private List mList; publicvoidprint( ) { … mList[i].getName( ); … } } class Rental{ private List mList; public int count(Customer c){ … c.mList.length( ); … } } class Customer { privateList mList; publicvoidprint( ) { … mList[i].getName( ); … } } class Rental{ public int count(Customer c){ … c.mList.length( ); … } } 編集ステップ Customer.mListをRentalへ移動 Customer.mList の修飾子を publicに変更 Customer. countを Rentalへ移動 Customer.mList をRentalへ移動 • 編集手順とソースコードを保持 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

  25. 編集ステップの導出(カプセル化) class Customer { privateList mList; public void setMovie(List m){ mList= m; } public List getMovie( ){ return mList; } publicvoidprint( ) { …getMovie( ).getName( ); …} } class Rental{ public int count(Customer c){ …c.getMovie( ).length( ); … } } class Customer { privateList mList; publicvoidprint( ) { … mList[i].getName( ); … } } class Rental{ public int count(Customer c){ … c.mList.length( ); … } } 編集ステップ Customer.mListのgetter,setterを追加 Customer.mList の修飾子を publicに変更 Customer. countを Rentalへ移動 Customer.mList をRentalへ移動 Customer.mList のカプセル化 • 編集手順とソースコードを保持 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

  26. 編集ステップ導出・適用の繰り返し処理 • 編集ステップを適用したソースコードで参照切れコンパイルエラーを含むソースコードについて繰り返し編集ステップの導出・適用を繰り返す Customer.mList の修飾子を publicに変更 Rental.mList の修飾子を publicに変更 Customer. countを Rentalへ移動 Customer.mList をRentalへ移動 Customer.print をBへ移動 Customer.mList のカプセル化 Rental.mList のカプセル化 • ソースコードから以下を得ることができた • Customer.countを移動した際の適用可能な編集手順 • コンパイル可能なソースコード Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

  27. ケーススタディの考察 • 適用可能な編集手順とコンパイル可能なソースコードを得ることができた • 開発者が参照切れを解決する編集作業を行わなくてすむので有用と言える • 開発者が複数のソースコードから目的のソースコードを選択するためのユーザーインターフェースが必要である • 提案手法で探索した編集手順は「メンバの移動」リファクタリングの編集手順の部分的な編集手順である • 参照切れを解決する編集手順のみを探索している Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

  28. まとめと今後の課題 • まとめ • 参照切れが発生するメンバの移動に伴なう適用可能な編集手順の探索を行った • 適用可能な編集手順とコンパイル可能なソースコードを得ることができた • 今後の課題 • 開発者にコンパイル可能な複数のソースコードの差異を示し、目的のソースコードの選択を支援するようなインターフェースが必要 • 探索できる編集手順を増やす • 移動するメンバと参照関係のあるpublicメンバの移動など • 提案手法の評価 • 提案手法を用いた場合と用いなかった場合のリファクタリング作業時間の測定  Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

More Related