リファクタリング中に生じる コンパイルエラーの自動解消手法 井上研究室 譜久島 亮 修士論文発表会 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
© Copyright 2025 ExpyDoc