プログラムで多用される 動詞と目的語の関係を利用した メソッド名提案ツール

Slides:



Advertisements
Similar presentations
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 1 ソフトウェア部品推薦のための.
Advertisements

シーケンス図の生成のための実行履歴圧縮手法
メソッド周辺の識別子と メソッド本体のAPI利用実績に基づいたAPI集合推薦手法
6-2 データベース 1.SQLite SQLを単純化した SQLite を使ってデータベースを操作 表「fruit」
JavaによるCAI学習ソフトウェアの開発
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.
変数間データフローグラフを用いた ソースコード間の移動支援
動詞に着目した相関ルールを利用するメソッド名の命名支援手法の評価
JSFによるWebアプリケーション開発 第6回
リファクタリングのための 変更波及解析を利用した テスト支援ツールの提案
メソッド名とその周辺の識別子の 相関ルールに基づくメソッド名変更支援手法
プログラム実行履歴を用いたトランザクションファンクション抽出手法
相関ルールマイニングを用いた メソッドの命名方法の分析
細かい粒度でコードの再利用を可能とするメソッド内メソッドのJava言語への導入
オブジェクト指向プログラムのための 動的結合メトリクスの評価
プログラミング言語入門 手続き型言語としてのJava
ソースコード中に出現する 動詞-目的語関係を利用した メソッド名の命名支援手法
コーディングパターンと キーワードを用いて生成したコードスニペットの推薦
Javaクラスの利用関係を用いた ソフトウェア部品のカテゴリ階層構築法
コードクローンに含まれるメソッド呼び出しの 変更度合の分析
コードクローンに含まれるメソッド呼び出しの 変更度合の調査
識別子の命名支援を目的とした動詞-目的語関係の辞書構築
細かい粒度で コードの再利用を可能とする メソッド内メソッドと その効率の良い実装方法の提案
暗黙的に型付けされる構造体の Java言語への導入
コードクローンの分類に基づいた メソッド引き上げ手順の提案とその有効性評価
理学部 情報科学科 指導教官 千葉 滋 助教授 学籍番号 03_03686 内河 綾
リファクタリング中に生じる コンパイルエラーの自動解消手法
ポインタ解析におけるライブラリの スタブコードへの置換の効果
オブジェクト指向プログラムにおける エイリアス解析手法の提案と実現
変数のデータフローを考慮した API利用コード例の検索 井上研究室 竹之内 啓太.
利用関係に基づく類似度を用いたJavaコンポーネント分類ツールの作成
Javaプログラムの変更を支援する 影響波及解析システム
Jakarta Struts (2) ソフトウェア特論 第11回.
リファクタリング支援のための コードクローンに含まれる識別子の対応関係分析
プログラム動作理解支援を目的とした オブジェクトの振舞いの同値分割手法
ソースコードの特徴量を用いた機械学習による メソッド抽出リファクタリング推薦手法
コードクローンの動作を比較するためのコードクローン周辺コードの解析
UMLモデルを対象とした リファクタリング候補検出の試み
コードクローン検出に基づくデザイン パターン適用支援手法の提案と実現
プログラム理解におけるThin sliceの 統計的調査による有用性評価
○ 後藤 祥1,吉田 則裕2 ,井岡 正和1 ,井上 克郎1 1大阪大学 2奈良先端科学技術大学院大学
ソフトウェア保守のための コードクローン情報検索ツール
コードクローンの理解支援を目的としたコードクローン周辺コードの解析
コードクローン分類の詳細化に基づく 集約パターンの提案と評価
既存ソフトウェア中の 頻出コード片を用いた コード補完手法の提案
コーディングパターンの あいまい検索の提案と実装
JavaScriptを含んだHTML文書に対する データフロー解析を用いた構文検証手法の提案
メソッドに用いられる 動詞-目的語関係を収録した 辞書構築手法の提案
C#プログラミング実習 第3回.
プログラムスライスを用いた凝集度メトリクスに基づく 類似メソッド集約候補の順位付け手法
設計情報の再利用を目的とした UML図の自動推薦ツール
プログラムの差分記述を 容易に行うための レイヤー機構付きIDEの提案
オープンソースソフトウェアに対する コーディングパターン分析の適用
メソッドの同時更新履歴を用いたクラスの機能別分類法
蓄積されたオブジェクトの動作履歴を用いた 実行履歴削減手法の提案
ソースコードの編集状況に応じた ソフトウェア部品の自動推薦システム
ソフトウェア理解支援を目的とした 辞書の作成法
複雑度メトリクスを用いた JAVAプログラム品質特性の実験的評価
プログラムの一時停止時に 将来の実行情報を提供するデバッガ
コードクローン解析に基づく デザインパターン適用候補の検出手法
回帰テストにおける実行系列の差分の効率的な検出手法
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
メソッド抽出リファクタリングが 行われるメソッドの特徴調査
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
識別子の読解を目的とした名詞辞書の作成方法の一試案
プログラム理解のための 付加注釈 DocumentTag の提案
Presentation transcript:

プログラムで多用される 動詞と目的語の関係を利用した メソッド名提案ツール 井上研究室 鬼塚 勇弥

識別子に不適切な命名がされていると プログラムの理解に時間がかかる[1] 適切な名前をつけることが求められる 背景 識別子に不適切な命名がされていると プログラムの理解に時間がかかる[1] 適切な名前をつけることが求められる 本研究ではメソッド名の命名に着目する [1] D. Lawrie, C. Morrell, H. Feild, and D. Binkley, What's in a name? a study of identiers, Proceedings of the 14th IEEE International Conference on Program Comprehension(ICPC '06), pp.312, 2006.

メソッド名の構造 複数の単語を組み合わせて振る舞いを表現 プログラム中には,オブジェクトに対してある操作を行うという処理が多数存在 Ex1. Stock クラスの addProduct(Product) → Product を Stock に add する このプログラム中の動詞-目的語関係を利用

動詞-目的語関係の辞書生成手法 動詞-目的語関係をソースコード中のメソッドから取り出す[2] 出力は<動詞(V), 直接目的語(DO), 間接目的語(IO)>の三つ組 事前に定義された三つ組抽出パターンに従う (v1,v2,…: 動詞 n1,n2,…: 名詞) No. return method arg class 抽出三つ組 1 void v1 + n2 n3 n4 <v1,n3,n4> ・・・ 動詞-目的語関係辞書 過去の研究[2]に,既存プログラム中の動詞-目的語関係を収録した辞書生成手法がある V DO IO add product stock close database - ・・・ 三つ組抽出パターン Javaソースコード集合 [2] Y. Hayase, Y. Kashima, Y. Manabe, and K. Inoue, “Building domain specific dictionaries of verb-object relation from source code”, Proceedings of the 15th European Conference on Software Maintenance and Reengineering(CSMR '11), pp.93-100, 2011.

メソッド名を入力できる場面でツールを起動 提案手法 メソッド名の候補を提示することでメソッドの命名を支援する 候補の生成に動詞-目的語関係の辞書を利用 提案手法に基づいたツールを実装 メソッド名を入力できる場面でツールを起動 (返り値の型あり / なし の2通り) 動詞-目的語 関係 悪いメソッド名がつけられることでプログラム理解に時間がかかることを解決するため 「以後メソッド名として説明する」 返り値があるときと無いときで… まずはツールの処理内容の詳細,次にインタラクション,最後に実装について説明する メソッド名候補リスト 絞り込み条件 動詞-目的語 関係を収録した 辞書 開発者 ツール 絞り込まれた メソッド名候補リスト

ツールの処理の流れ Step1: 目的語の 候補を抽出 Step2: 辞書検索 V DO IO add product stock public class hoge { String huga; public void … クラス名: hoge フィールド: String, huga 返り値の型: void … ソースコード中の 目的語候補 辞書検索で得られた情報 記述中のソースコード V DO IO DO条件 IO条件 add product stock フィールド クラス delete … Step2: 辞書検索 V DO IO add product stock close database - … 動詞 – 目的語関係の辞書 Step3: メソッド名生成 メソッド名候補リスト deleteProduct() … addProduct() ソースコード記述中にツール起動ボタンを押したら開始 addProduct() deleteProduct() … Step4: 並び替え 生成されたメソッド名の集合 提示するメソッド名候補リスト

Step1. 目的語の候補を抽出 カーソルがある場所から参照可能な名詞を目的語の候補として抽出 インポートクラス名と その親クラス名 インポートクラス名と その親クラス名 定義クラス名と その親クラス名 フィールド変数の 型名と名前 返り値の型名 package test.codeassist; import java.util.ArrayList; public class Stock extends AbstractStock { Product p; void setProduct(Product arg) { p = arg; } public static void ① ② ③ カーソル位置 ④ I クラス名: Stock フィールド: Product 返り値の型: void …

Step2. 辞書検索 Step1.で得た情報で辞書を検索し,ヒットした三つ組と,三つ組のDO,IOと一致した識別子の種類を取得 検索方法は三つ組抽出パターンを基に自分で定義 パターンに従って 複数の組み合わせ で検索 V DO IO add product stock close database - delete … クラス名: Stock フィールド: Product 返り値の型: void ソースコードの情報 下の図は一例 クラス名とフィールドをそれぞれDO,IOで検索する例 動詞 - 目的語辞書 V DO DOの種類 IO IOの種類 add product フィールド stock クラス名 delete … 検索結果

Step3. メソッド名生成 Step2.で得た情報からメソッド名の集合を生成 ルールに従い三つ組を組み合わせてメソッド名生成 生成ルールは各検索条件に対して自分で定義 V DO DOの種類 IO IOの種類 add product フィールド stock クラス名 delete … addProduct() 辞書検索で得られた情報 deleteProduct() … DOの種類 IOの種類 生成メソッド フィールド クラス名 V + DO () … 生成された メソッド名の集合 メソッド名生成ルール

Step4. 並び替え メソッド名として適切だと考えられる順に並び替える 以下のような並び替え基準を組み合わせて使用 辞書に複数含まれる三つ組で生成したメソッドが上位 三つ組を元の形に復元する組み合わせのメソッドが上位 組み合わせ方は辞書生成と別のソースコードで調整 各ファイルで定義されているメソッドが上位に来るように 以上がツールの詳細.次はツールとのインタラクションを メソッド名候補リスト deleteProduct() ・・・ addProduct() addProduct() deleteProduct() … 生成されたメソッド名の集合 並び替えられたメソッド名リスト

ツールとのインタラクション 繰り返し リストをヒントに メソッド名を記述 (メソッド名を 記述する位置で起動) リスト閲覧 リスト閲覧 リストの メソッド名 を選択 ツール 起動 文字列 開発者 メソッド名候補 リスト メソッドを 挿入した 編集画面 絞り込んだ リスト 文字列で リストの 絞り込み メソッド名候補 リスト生成 選択した メソッド候補 を挿入 ツール

実装 提案手法は統合開発環境Eclipse上に実装 Eclipseのコード補完機能を利用

実験 目的 方法 評価基準 本ツールで適切なメソッドの命名を行えるか調査 広く使われているアプリケーションのソースコードからメソッド名などを削除 削除したメソッド名を被験者が推測し解答 評価基準 ツールの有無で正解率に変化があるか比較 アンケートで被験者の主観的な意見を収集 本ツールを使用することで,開発者が適切なメソッドの命名を行えるかを調査

課題作成方法 課題の動詞を含んだ コメントを削除 完成 課題とするメソッドの名前 とそのコメントを削除 public class Stock extends AbstractStock { ProductList products; /** This method is ... */ public static void initialize() { // initialize list for (Product p : products) { p.delete(); } /** this method is ... */ public static void deleteProduct(String id) { Product product = myProductList.findById(id); product.delete(); public class Stock extends AbstractStock { ProductList products; public static void { for (Product p : products) { p.delete(); } /** This method is ... */ initialize() // initialize list 課題の動詞を含んだ コメントを削除 完成 課題とするメソッドの名前 とそのコメントを削除 課題以外のメソッドとそのコメントを削除 /** this method is ... */ public static void deleteProduct(String id) { Product product = myProductList.findById(id); product.delete(); }

課題に用いたソースコード 辞書を作成するために使用したコードとは別 課題の内容が偏らないように,4種類の異なるアプリケーションドメインのソースコードから課題を作成 全44問 動詞の種類は31個 Getter, Setter は不使用

被験者と課題の割り当て 被験者 課題の割り当て 井上研究室の学生8人 課題をランダムに割り当てた 各課題をツールありで2人,ツールなしで2人 各被験者にツールありで11問,ツールなしで11問 半分の被験者はツールあり11問を先に解答,残りの被験者はツールなし11問を先に解答

正解基準 正解基準を2通り用意 メソッド名全体が一致 メソッド名のうち動詞が一致 処理内容を表す動詞部分が重要なため

実験結果 ツールありの方がツールなしより正解数が多い フィッシャーの正確確率検定 片側検定の結果 有意水準0.05で有意な差はなかった 正解 完全に一致した解答数 動詞が一致した解答数 正解 不正解 ツールあり 2 86 ツールなし 1 87 合計 3 173 正解 不正解 ツールあり 16 72 ツールなし 9 79 合計 25 151 ツールありの方がツールなしより正解数が多い フィッシャーの正確確率検定 片側検定の結果 完全一致: p値 = 0.500 / 動詞の一致: p値 = 0.097 有意水準0.05で有意な差はなかった

アンケート結果(抜粋) 被験者の意見(要約) + 良さそうな候補が多数あり便利だと思った + リストが命名の参考になった 選択肢 プログラム記述中に 本ツールを使用したいか リストは実際にそのクラスで使用されそうな名前か とてもそう思う 1人 13問 そう思う 4人 32問 どちらとも言えない 15問 あまりそう思わない 22問 全くそう思わない 6問 被験者の意見(要約) + 良さそうな候補が多数あり便利だと思った + リストが命名の参考になった - ツールの実行速度が遅い - 適切に並び替えられていない場合があった

考察 正解数に差はあったが有意な差ではなかった メソッド名候補の提示は命名支援として有効 改善すべきツールの問題 課題が難しすぎたなどの実験の問題 適切なメソッドが見つからないなどのツールの問題 メソッド名候補の提示は命名支援として有効 アンケートの結果より 改善すべきツールの問題 実行速度 並び替えの手法 このような改善を行えば命名支援として使用できると考えられる

まとめと今後の課題 まとめ 今後の課題 メソッド名の候補を提示することで命名を支援する手法を提案し,ツールとして実装 ツールの有効性を評価した結果,被験者から好意的な評価を得られた 今後の課題 実行速度,並び替えなどの問題改善 ツールの有効性の再評価 既存メソッドの改名などのツールの機能追加