Software Engineering Laboratory Department of Computer Science Graduate
リファクタリング中に生じる コンパイルエラーの自動解消手法 井上研究室 譜久島 亮 修士論文発表会 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 1
リファクタリング n リファクタリングの定義 l 外部から見たプログラムの振る舞いを変えずにプログラムの 内部の構造を改善する作業[1] n リファクタリングの目的 l 欠陥の発見を容易にする l プログラムの読みやすくする l 機能追加をしやすくする n 典型的なリファクタリングがまとめられている[1] l メソッドの抽出 l フィールドの移動 l メソッドの移動 開発者が頻繁に行う リファクタリング[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
メンバの移動に必要な検討 n 移動するメンバと参照関係のあるメンバの移動を検討 l 関連するメンバも移動しクラスの責任をより明確にする 移動先クラス 移動元クラス class Customer{ public List m. List ; ・・・ public int count( ); ・・・ 内部 }・・・ 関連するメンバ 移動するメンバ class Rental{ public List m. List ; public int count( ); ・・・ } m. List. length( ); ・・・ 修士論文発表会 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 5
メンバの移動でコンパイルエラーが起こる場合 n privateメンバの移動 n privateメンバを参照しているメンバの移動 参照切れを解消するメンバの移動や参照方法の変更が必要である 被参照メンバ class A{ private Type member. A ; member. B; } class B{ 参照メンバ } (a) メンバの移動前 ソースコード class A{ private Type member. A ; } class B{ member. B; } class A{ member. B; } class B{ private Type member. A ; } (b) member. BをBへ移動 (c) member. AをBへ移動 したソースコード 修士論文発表会 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 6
メンバの移動による コンパイルエラーを解消する編集 メンバの移動 修飾子の変更 移動先クラスへメンバを 移動する 被参照メンバの修飾子 を変更する class A{ private Type member. A ; … }; class B{ }; private Type member. A ; フィールドのカプセル化 フィールドが所属するクラ スにgetterメソッドとsetter メソッドを作成する class A{ private Type member. A ; public void set(Type t) { member. A = t; } public Type get( ) { return member. A; } public Type member. A ; } コンパイルエラーが存在するソースコードに適用 修士論文発表会 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 7
コンパイルエラーを解決する編集例 class Customer { private List m. List ; public void print( ) { public int count( ){ … … m. List[i]. get. Name( ); m. List. length( ); … … } } } public void print( ) { class Rental{ … public int m. List[i]. get. Name( ); count(Customer C){ … … } c. m. List. length( ); } … class Rental{ } } } class Customer { 他のメンバの } 移動 class Retanl { private List m. LIst; public void count( ); public void print(); } class Customer { 被参照メンバの移動 public void print(); 修飾子の変更 } class Rental { public List m. LIst; public void count( ); } 被参照メンバの カプセル化 class Customer { private List m. LIst; 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
コンパイルエラーを解消する 編集手順の探索結果の例 「メソッドの移動」リファクタリングの編集手順探索の例 Customer. countを Rentalへ移動 Customer. m. List の修飾子を publicに変更 Rental. m. List の修飾子を publicに変更 Customer. m. List をRentalへ移動 Customer. m. List のカプセル化 Customer. print をBへ移動 Rental. m. List のカプセル化 コンパイル可能なソースコード コンパイルエラーを含むソースコード 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/3) n 被参照メンバの修飾子の変更 移動元クラス A 移動先クラス B 被参照メンバ member. A 被参照メンバの所属クラ ス A 参照メンバ member. B 参照メンバの所属クラス B 編集ステップ 被参照メンバ class A{ private Type member. A ; } class B{ member. B; } class A{ public Type member. A ; } class B{ member. B; } member. Aの修飾子をpublicに変更 修士論文発表会 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 16
編集ステップの導出(2/3) n 移動元クラスから移動先クラスへメンバの移動 移動元クラス A 移動先クラス B 被参照メンバ member. A 被参照メンバの所属クラ ス A 参照メンバ member. B 参照メンバの所属クラス B 編集ステップ class A{ private Type member. A ; } class B{ 移動先クラス member. B; } class A{ } class B{ private Type member. A ; member. B; } 移動元クラスであるAに所属している member. Aを移動先クラスであるBへ移動 修士論文発表会 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 17
編集ステップの導出(3/3) n 被参照メンバのカプセル化 (被参照メンバがフィールドの場合) 被参照メンバ member. A 被参照メンバの所属クラ ス A 参照メンバ member. B 参照メンバの所属クラス B 移動元クラス A 移動先クラス B 編集ステップ member. Aのgetter,setterを Aに追加 被参照メンバ class A{ private Type member. A ; } class B{ member. B; } class A{ private Type member. A ; public void set(Type type){ member. A = type; } public Type get( ){ return member. A; } } class B{ member. B; } 修士論文発表会 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 18
ケーススタディの概要 n 右の例に対して提案手法を適用 l Customer. count,Customer. print はprivateフィールド Customer. m. Listを参照 l Customer. countをRentalへ移動 被参照メンバ Customer. m. List 被参照メンバの所属クラス Customer 参照メンバ Rental. count 参照メンバの所属クラス Rental 移動元クラス Customer 移動先クラス Rental class Customer { private List m. List ; public void print( ) { public int count( ){ … … m. List[i]. get. Name( ); m. List. length( ); … … } } } public void print( ) { class Rental{ … public int m. List[i]. get. Name( ); count(Customer C){ … … } メソッドの移動 c. m. List. length( ); } … class Rental{ } } } 修士論文発表会 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 20
- Slides: 24