リファクタリング中に生じる コンパイルエラーの自動解消手法

Slides:



Advertisements
Similar presentations
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University メソッド呼び出しパターンとして 現れる 横断的関心事の特徴評価 井上研究室 B4 三宅達也.
Advertisements

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 保守支援を目的とした コードクローン情報検索ツール.
シーケンス図の生成のための実行履歴圧縮手法
シーケンシャルパターンマイニングに基づくオブジェクト指向プログラムのための 欠陥検出手法
背景 我々の研究室で開発しているJavaプログラム解析フレ ームワークでは,解析情報はメモリ上に保持される 問題点
組み合わせて実施された リファクタリングの調査
ソースコードの編集内容を入力とした ソフトウェア部品の自動検索
Myoungkyu Song and Eli Tilevich 発表者: 石尾 隆(大阪大学)
情報伝播によるオブジェクト指向プログラム理解支援の提案
Object Group ANalizer Graduate School of Information Science and Technology, Osaka University OGAN visualizes representative interactions between a pair.
リファクタリングのための 変更波及解析を利用した テスト支援ツールの提案
メソッド名とその周辺の識別子の 相関ルールに基づくメソッド名変更支援手法
データ構造と アルゴリズム 第四回 知能情報学部 新田直也.
Java ソフトウェア部品検索システム SPARS-J のための リポジトリ自動更新機能の実現
ソースコードに対する適用可能な修正手順を 可視化するリファクタリング支援手法の提案
CKメトリクスを用いてリファクタリングの 効果を予測する手法の提案
~手続き指向からオブジェクト指向へ[Ⅱ]~
ソースコードの変更履歴における メトリクス値の変化を用いた ソフトウェアの特性分析
細かい粒度でコードの再利用を可能とするメソッド内メソッドのJava言語への導入
識別子の命名支援を目的とした動詞-目的語関係の辞書構築
細かい粒度で コードの再利用を可能とする メソッド内メソッドと その効率の良い実装方法の提案
ソードコードの編集に基づいた コードクローンの分類とその分析システム
独習JAVA 6.8 コンストラクタの修飾子 6.9 メソッドの修飾子 6.10 ObjectクラスとClassクラス 11月28日(金)
暗黙的に型付けされる構造体の Java言語への導入
コードクローンの分類に基づいた メソッド引き上げ手順の提案とその有効性評価
CKメトリクスに基づくリファクタリングの 効果予測手法の提案と実装
卒論の書き方: 参考文献について 2017年9月27日 小尻智子.
Javaプログラムの変更を支援する 影響波及解析システム
社会シミュレーションのための モデル作成環境
リファクタリング支援のための コードクローンに含まれる識別子の対応関係分析
プログラム動作理解支援を目的とした オブジェクトの振舞いの同値分割手法
ソースコードの特徴量を用いた機械学習による メソッド抽出リファクタリング推薦手法
UMLモデルを対象とした リファクタリング候補検出の試み
コードクローン検出に基づくデザイン パターン適用支援手法の提案と実現
コードスメルの深刻度がリファクタリングの実施に与える影響の実証的研究
コード片に共通した特性を自動抽出する ソースコード閲覧ツールの試作
○ 後藤 祥1,吉田 則裕2 ,井岡 正和1 ,井上 克郎1 1大阪大学 2奈良先端科学技術大学院大学
コードクローンの理解支援を目的としたコードクローン周辺コードの解析
dcNavi: デバッグ方法をアドバイス する関心事指向リポジトリナビゲータ
コードクローン分類の詳細化に基づく 集約パターンの提案と評価
プログラムの織り込み関係を可視化するアウトラインビューの提案と実装
コーディングパターンの あいまい検索の提案と実装
コードクローン間の依存関係に基づく リファクタリング支援環境の実装
プログラミング言語論 第十三回 理工学部 情報システム工学科 新田直也.
プログラムスライスを用いた凝集度メトリクスに基づく 類似メソッド集約候補の順位付け手法
設計情報の再利用を目的とした UML図の自動推薦ツール
dcNavi:デバッグ支援のための グラフベース推薦システム
コードクローン間の依存関係に基づく リファクタリング支援手法の提案と実現
プログラムの差分記述を 容易に行うための レイヤー機構付きIDEの提案
サブゼミ第7回 実装編① オブジェクト型とキャスト.
オープンソースソフトウェアに対する コーディングパターン分析の適用
蓄積されたオブジェクトの動作履歴を用いた 実行履歴削減手法の提案
コードクローン間の依存関係に基づく リファクタリング支援手法の提案と実現
ソースコードの編集状況に応じた ソフトウェア部品の自動推薦システム
UMLモデルを対象とした リファクタリング候補検出手法の提案と実現
統合開発環境のための プログラミング言語拡張 フレームワーク
JAVA入門⑥ クラスとインスタンス.
エイリアス関係を考慮した Javaプログラム用静的スライシングツール
プログラムの一時停止時に 将来の実行情報を提供するデバッガ
コードクローン解析に基づく デザインパターン適用候補の検出手法
回帰テストにおける実行系列の差分の効率的な検出手法
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
メソッド抽出リファクタリングが 行われるメソッドの特徴調査
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
識別子の読解を目的とした名詞辞書の作成方法の一試案
オブジェクト指向メトリクスを用いた 開発支援に関する研究 --- VC++とMFCを用いた開発を対象として ---
プログラム理解のための 付加注釈 DocumentTag の提案
Josh : バイトコードレベルでのJava用 Aspect Weaver
Presentation transcript:

リファクタリング中に生じる コンパイルエラーの自動解消手法 井上研究室 譜久島 亮 同一の 探索空間が有限であることを言う タイトルに合わせて発表を変えるべき コンパイルエラーが発生したときに、エラーをなくすような編集をなくすように手順を計算していく ⇒探索木を見せないほうがいいのでは コンパイルエラーが起こることで問題 リファクタリング⇒メンバの移動 コンパイルエラー⇒参照切れ メンバの移動によって、 コンパイルエラー⇒エラーと口頭で簡単にしたほうがいいかも 参照切れ スライド中でコンパイルエラーという単語を減らすと口頭でも減るかも Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

発表の概要 リファクタリング メンバの移動により生じるコンパイルエラーについて リファクタリング支援機能の問題点 メンバの移動リファクタリングについて メンバの移動により生じるコンパイルエラーについて 参照切れコンパイルエラーが生じる例 リファクタリング支援機能の問題点 編集手順を探索するリファクタリング支援手法 探索の例 提案手法の処理概要 ケーススタディ まとめと今後の課題 リファクタリングとはプロセスである 発表13分、質疑4分 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

リファクタリング リファクタリングの定義 リファクタリングの目的 典型的なリファクタリングがまとめられている[1] 開発者が頻繁に行う 外部から見たプログラムの振る舞いを変えずにプログラムの内部の構造を改善する作業[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

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

メンバの移動に必要な検討 移動するメンバと参照関係のあるメンバの移動を検討 関連するメンバも移動しクラスの責任をより明確にする 移動先クラス 移動元クラス 移動先クラス class Customer{ public List mList ; ・・・ public int count( );  ・・・  } 関連するメンバ class Rental{ public List mList ; public int count( ); ・・・ } 移動するメンバ ・・・ mList.length( ); 内部 一般的なメンバの移動を説明する 関連するメンバの移動が必要であることを押す <わかりやすい意味のある例> スタックとスタック、使うクラス 図形を描画するクラス、 銀行の口座を出力、口座を操作 amount( ) Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

メンバの移動でコンパイルエラーが起こる場合 privateメンバの移動 privateメンバを参照しているメンバの移動 参照切れを解消するメンバの移動や参照方法の変更が必要である 被参照メンバ class A{  private Type memberA ;  memberB; } class B{ 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

メンバの移動による コンパイルエラーを解消する編集 移動先クラスへメンバを 移動する class A{ private Type memberA ; … } ; class B{ 修飾子の変更 被参照メンバの修飾子を変更する private Type memberA ; public Type memberA ; フィールドのカプセル化 フィールドが所属するクラスにgetterメソッドとsetterメソッドを作成する class A{ private Type memberA ; } public void set(Type t) { memberA = t; } public Type get( ) { return memberA; 文字サイズは小さくしない、入らないときは改ページ それぞれの編集ステップを「提案します」はおかしい 編集ステップの適用を提案はオッケイ 解消の手順は簡単に示すべき(15)の図は複雑 コンパイルエラーが存在するソースコードに適用 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

コンパイルエラーを解決する編集例 ソースコードや開発者の意図より編集手順が複数存在する 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( ); class Customer { } class Retanl { private List mLIst; public void count( ); public void print();   他のメンバの 移動 被参照メンバの カプセル化 class Customer { private List mLIst; public void print(); public List get( ); public void set(List list); } class Rental { public void count( ); class Customer { public void print(); } class Rental { public List mLIst; public void count( ); 被参照メンバの移動 修飾子の変更 ソースコードや開発者の意図より編集手順が複数存在する Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

メンバの移動より生じたコンパイルエラーを解消する リファクタリング支援機能の問題点 統合開発環境Eclipseのリファクタリング支援機能ではメンバの移動が支援されている 参照切れコンパイルエラーはメンバの修飾子の変更のみ解消が可能 メンバの移動より生じたコンパイルエラーを解消する 複数の編集手順を提示できるものがない 編集手順が選択できない⇒開発者は編集ステップを選択できるが、編集手順を把握できない 編集ステップの組み立てができない、手順を探せない、 わからない⇒困難だ、理解するのが難しい ふぁウラーのパターン ここで、コンパイルエラーが起こることで、 パターンに基づくリファクタリングでは、簡単に可視性を上げるだけでなく、 メンバの移動によって発生したコンパイルエラーを解消する編集手順を提示できるものがない 複数の手順の中でpublicにする リファクタリング経験の少ないユーザは  目的のソースコードを得る編集手順の理解が困難 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

研究の目的 リファクタリングを行う際に生じる コンパイルエラーを解消する編集手順を探索する コンパイルエラーを解消したソースコードを リファクタリング完了までの適用可能な編集手順の集合 編集手順を適用したソースコード コンパイルエラーを解消したソースコードを ユーザに提示しリファクタリング結果である ソースコードの選択を支援する 編集のミスでバグを埋め込むのを防ぐ、を追加する 安全にリファクタリングをする Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

コンパイルエラーを解消する 編集手順の探索結果の例 「メソッドの移動」リファクタリングの編集手順探索の例 コンパイル可能なソースコード コンパイルエラーを含むソースコード Customer. countを Rentalへ移動 Customer.mList の修飾子を publicに変更 をRentalへ移動 のカプセル化 Customer.print をBへ移動 Rental.mList 図が先⇒これを作るために Eclipseプラグインと言ってるのに以後出てこない Eclipseプラグイン 木の具体的な説明、9のグラフをなくした場合必要である SESの定義を盛り込む コンパイル可能なソースコード 参照切れソースコードの絵を差し込む 矢印の太さ統一 Eclipseのプラグインとして実装 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

コンパイルエラーを解消する編集ステップ コンパイルエラーが存在するソースコードに適用 フィールドのカプセル化 メンバの移動 修飾子の変更 移動先クラスへメンバを 移動する class A{ private Type value ; … } ; class B{ 修飾子の変更 被参照メンバの修飾子を変更する private Type value ; public Type value ; フィールドのカプセル化 フィールドが所属するクラスにgetterメソッドとsetterメソッドを作成する class A{ private Type value ; } public void set(Type t) { this.value = t; } public Type get( ) { return value; 文字サイズは小さくしない、入らないときは改ページ それぞれの編集ステップを「提案します」はおかしい 編集ステップの適用を提案はオッケイ 解消の手順は簡単に示すべき(15)の図は複雑 コンパイルエラーの余計な出現を減らす コンパイルエラーが存在するソースコードに適用 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

提案手法の処理概要 編集ステップ導出のための情報を取得 コンパイルエラーを解決する編集ステップを導出 コンパイルエラーを含むソースコードに各編集ステップを適用 編集ステップを適用したソースコードでコンパイルエラーを含むソースコードについて1~3の処理を行う ・情報取得⇒ステップ導出⇒適用⇒ソースコードが3つ、 ・同じソースコードに戻さない工夫 ・繰り返し処理 ・コンパイルエラーがなくなり、 10から、手順の説明を聞きたいのに、木構造、編集ステップと枝 ・ツールは作っている状態 1、2の間で、どういうエラーが起きたらどういう編集ステップを導出するのか説明する 提案手法を絵を用いて説明、入りきれなかったらわける スライド、とスライドの間のつなぎ文句 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

編集ステップ導出のための情報取得 適用したメンバの移動より情報を取得 コンパイルエラーより情報を取得 移動元クラス 移動先クラス class A{  private Type memberA ;  memberB; } class B{ 被参照メンバ 参照メンバ 適用したメンバの移動より情報を取得 移動元クラス 移動先クラス コンパイルエラーより情報を取得 被参照メンバとその所属クラス 参照メンバとその所属クラス メンバの移動 移動元クラス 移動元クラス A 移動先クラス B 被参照メンバ memberA 被参照メンバの所属クラス 参照メンバ memberB 参照メンバの所属クラス 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

提案手法の処理概要 編集ステップ導出のために以下の情報を取得 コンパイルエラーを解決する編集ステップを導出 コンパイルエラーを含むソースコードに各編集ステップを適用 編集ステップを適用したソースコードで参照切れを含むソースコードについて1~3の処理を行う 10から、手順の説明を聞きたいのに、木構造、編集ステップと枝 ・ツールは作っている状態 1、2の間で、どういうエラーが起きたらどういう編集ステップを導出するのか説明する 提案手法を絵を用いて説明、入りきれなかったらわける スライド、とスライドの間のつなぎ文句 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

編集ステップの導出(1/3) memberAの修飾子をpublicに変更 被参照メンバの修飾子の変更 被参照メンバ 編集ステップ class A{  private Type memberA ; } class B{ memberB; 移動元クラス A 移動先クラス B 被参照メンバ memberA 被参照メンバの所属クラス 参照メンバ 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

編集ステップの導出(2/3) 移動元クラスから移動先クラスへメンバの移動 移動元クラスであるAに所属している class A{  private Type memberA ; } class B{ memberB; 移動元クラス A 移動先クラス B 被参照メンバ memberA 被参照メンバの所属クラス 参照メンバ 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

編集ステップの導出(3/3) memberAのgetter,setterを Aに追加 被参照メンバのカプセル化 (被参照メンバがフィールドの場合) class A{  private Type memberA ; } class B{ memberB; 被参照メンバ memberA 被参照メンバの所属クラス A 参照メンバ memberB 参照メンバの所属クラス B 移動元クラス 移動先クラス 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

提案手法の処理概要 編集ステップ導出のために以下の情報を取得 コンパイルエラーを解決する編集ステップを導出 コンパイルエラーを含むソースコードに各編集ステップを適用 編集ステップを適用したソースコードの参照切れが解決されるまで1~3の処理を行う 10から、手順の説明を聞きたいのに、木構造、編集ステップと枝 ・ツールは作っている状態 1、2の間で、どういうエラーが起きたらどういう編集ステップを導出するのか説明する 提案手法を絵を用いて説明、入りきれなかったらわける スライド、とスライドの間のつなぎ文句 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

ケーススタディの概要 右の例に対して提案手法を適用 Customer.count,Customer.printはprivateフィールドCustomer.mListを参照 Customer.countを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 int count( ){ … mList.length( ); } public void print( ) { mList[i].getName( ); class Rental{ メソッドの移動 被参照メンバ Customer.mList 被参照メンバの所属クラス Customer 参照メンバ Rental.count 参照メンバの所属クラス Rental 移動元クラス 移動先クラス 問題点のページの例で説明がそろうと説得力うp Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

編集ステップ導出・適用の繰り返し処理 編集ステップを適用したソースコードでコンパイルエラーコンパイルエラーを含むソースコードについて繰り返し編集ステップの導出・適用を繰り返す 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

実験 メンバの移動で生じるコンパイルエラーの解消作業 目的:コンパイルエラー解消作業の結果を収集し正解集合を構築する 内容: 指定したメンバを移動 メンバの移動により生じるコンパイルエラーを解消したソースコードを複数導出してもらう 被験者の人数:6人 課題数:1 いい結果なのか悪い結果なのか 実験の目的が書いていない 課題の問題数 なんで残念な結果だったのか、だめの理由 事前条件、事後条件の制約について Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

実験結果 提案手法で導出するソースコードに被験者が導出したソースコードが多く含まれていた 自動でソースコードを導出できる提案手法は有用 6人の被験者:10のソースコードを導出 提案手法で導出可能な9のソースコードを含む 提案手法:30のソースコードを導出 自動でソースコードを導出できる提案手法は有用 提案手法が導出した ソースコード:要素数30 被験者が導出した ソースコード:要素数10 提案手法で導出できない ソースコード:要素数1 提案手法で導出可能な ソースコード:要素数9 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

まとめと今後の課題 メンバの移動により生じるコンパイルエラーを解消する編集手順と編集手順を適用したソースコードを導出した 以下の編集ステップで編集手順を構成 メンバの移動 修飾子の変更 フィールドのカプセル化 既存の技術では自動的に導出できない編集手順を導出することができた 導出したソースコードをユーザが選択するインターフェースを用意してソースコードを選択を支援する必要がある 既存の技術は導出しようとしてないのに、導出することができた 導出することによる嬉しさを示す Publicの Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University