コーディングパターンに基づくコード補完ツールの試作
大阪大学 大学院情報科学研究科 ○ 伊達 浩典 関山 太朗 石尾 隆 井上 克郎 2010/03/29 1 名阪和ソフトウェア工学ミニワークショップ2010
目次
コーディングパターン 構成要素 抽出方法 コード補完ツール コーディングパターンの検索 補完コード生成手法 まとめ 2010/03/29 2 名阪和ソフトウェア工学ミニワークショップ2010
コーディングパターン~メソッド呼び出しに関するパターン~
2010/03/29 3 名阪和ソフトウェア工学ミニワークショップ2010
‹#›
背景
同時に利用されるメソッドとその順序 特定条件下で処理を実行 パターンの利用 プログラム作成時 パターンに従ったコーディング ソフトウェア保守 パターンに対する一貫した変更 2010/03/29 4 名阪和ソフトウェア工学ミニワークショップ2010
コーディングパターンの抽出手順
ソースコードをメソッドに分割 各メソッドから特徴列の抽出 正規化 パターンマイニング 名阪和ソフトウェア工学ミニワークショップ2010 2010/03/29 5
メソッド内の正規化(1/2)
メソッド中から特徴列を抽出する処理 1つのメソッドから1つの特徴列を抽出 メソッド中の特徴とは? メソッド呼び出し 制御構造 条件分岐 繰り返し処理 名阪和ソフトウェア工学ミニワークショップ2010 2010/03/29 6 int sampleMethod(int x, int y) { int result = x * y; while ( result < 100 ) { methodCall(); result = result * 2; } if ( isDebugMode() ) { printVerbose(result); } else { printSimple(result); } return result; }
‹#›
メソッド内の正規化(2/2)
メソッド呼び出し → 戻り値型,メソッド名,引数の型のリスト メソッド名に関しては,パッケージ名,クラス名を無視 制御構造 条件分岐 → IF,ELSE,END-IF 繰り返し → LOOP,END-LOOP 名阪和ソフトウェア工学ミニワークショップ2010 2010/03/29 7 制御構造正規化ルール
‹#›
メソッド内の正規化の例
名阪和ソフトウェア工学ミニワークショップ2010 2010/03/29 8 LOOP void methodCall() END-LOOP boolean isDebugMode() IF void printVerbose(int) ELSE void printSimple(int) END-IF int sampleMethod(int x, int y) { int result = x * y; while ( result < 100 ) { methodCall(); result = result * 2; } if ( isDebugMode() ) { printVerbose(result); } else { printSimple(result); } return result; } 正規化 特徴列 メソッド
パターンマイニング
シーケンシャルパターンマイニング PrefixSpanアルゴリズム マイニング例 条件 パターン長: 4以上,サポート値: 2以上 名阪和ソフトウェア工学ミニワークショップ2010 2010/03/29 9 isDebugMode() IF printVerbose() ELSE printSimple() END-IF isDebugMode() IF printVerbose() END-IF methodCall1() methodCall1() IF printVerbose() END-IF methodCall2() isDebugMode() methodCall3() printVerbose() LOOP print() END-LOOP 特徴列A 特徴列C 特徴列B 特徴列D
パターンマイニング(結果)
抽出されたコーディングパターン 名阪和ソフトウェア工学ミニワークショップ2010 2010/03/29 10 isDebugMode() IF printVerbose() ELSE printSimple() END-IF isDebugMode() IF printVerbose() END-IF methodCall1() methodCall1() IF printVerbose() END-IF methodCall2() isDebugMode() IF printVerbose() END-IF isDebugMode() methodCall3() printVerbose() LOOP print() END-LOOP パターン長:4 サポート値:2 instanceof 特徴列A 特徴列C 特徴列B 特徴列D
‹#›
コーディングパターンに基づくコード補完ツール
2010/03/29 11 名阪和ソフトウェア工学ミニワークショップ2010
背景
既存のコード補完 キーワードを展開し,コードのひな型を生成 問題 使用できるパターンが限定されている コード補完の実装であらかじめ用意されている 対象のプログラミング言語でよく使用される 2010/03/29 12 名阪和ソフトウェア工学ミニワークショップ2010 Eclipseコード補完の例 foreach for ([iterable type] [iterable element] : [iterable]) { }
13
提案手法 既存のコード補完の問題点を解決 ソフトウェア固有のパターンと類似した処理を再度記述することを防ぐ コーディングパターンに基づくコード補完手法の提案 ソフトウェア固有のパターンはコーディングパターンとして得られる 2010/03/29 名阪和ソフトウェア工学ミニワークショップ2010
14
提案手法:コーディングパターンに基づくコード補完手法 1.パターンの検索 2.コード片の生成 3.ソースコード へ挿入 開発者が入力 した単語(キーワード) 開発者が編集して いるソースコード キーワードに 関連したパターン パターンから 生成したコード片 パターン データベース 2010/03/29 名阪和ソフトウェア工学ミニワークショップ2010
15
パターン データベースの構築 コーディングパターンを保存したデータベースをパターン検索の前に構築 コーディングパターン JEditBuffer.isEditable() IF JComponent.getToolkit() Toolkit.beep() END-IF if (!buffer.isEditable()) { getToolkit().beep(); return ; } ... jEditに頻出するコード片 コーディング パターンの抽出 2010/03/29 名阪和ソフトウェア工学ミニワークショップ2010
16
パターンの検索 入力キーワードに関連したパターン パターンに入力キーワードと一致する単語が多く出現 一致する単語のうち,重みの大きい単語が多い 単語の重みは自然言語検索で利用されているTF-IDF[Salton,1987]で決定 検索結果 入力キーワード関連が高いパターン [Salton,1987] Term Frequency – Inverse Document Frequency, Salton G. and Buckley, C. 1987 Term Weighting Approaches in Automatic Text Retrieval. Technical Report. UMI Order Number: TR87-881., Cornell University. 2010/03/29 名阪和ソフトウェア工学ミニワークショップ2010
17
パターンの各要素をコード片へ変換 このステップでは参照する変数は未定とする コード片の生成: パターン要素の変換 パターン コード片 JEditBuffer.isEditable() END-IF Toolkit.beep() JComponent.getToolkit() IF if (???) { ???.isEditable(); ???.beep(); ???.getToolkit(); } 2010/03/29 名阪和ソフトウェア工学ミニワークショップ2010
18
???.beep(); ???.getToolkit(); if (???) { ???.isEditable(); 挿入箇所の直前で宣言した変数を使用 メソッド呼び出しの戻り値は新しく宣言した変数へ代入 コード片の生成: 参照変数の決定 コード片 boolean var0 = buf.isEditable(); if (var0) { JComponent var1; Toolkit var2 = var1.getToolkit(); var2.beep(); } ソースコードへ挿入するコード片 JEditBuffer buf = ...; 編集中のソースコード } 2010/03/29 名阪和ソフトウェア工学ミニワークショップ2010
19
boolean var0; if (var0) { this.extendSelection(newCaret, newCaret); } else { this.selectNone(); } コード片の生成(失敗例) 変数の使用方法が異なるパターンの特徴 GUIの設定 同じ型の引数を複数とるメソッド呼び出しが出現 基本データ型が出現 int 型など int caret, newCaret; ... { if (...) this.extendSelection(caret, newCaret); else { ... this.selectNone(); } } ... 2010/03/29 名阪和ソフトウェア工学ミニワークショップ2010 同じ型の引数を複数とるメソッド呼び出しが出現する例
20
ソースコードへの挿入 生成したコード片を開発者が編集しているソースコードへ挿入 挿入後のソースコードを開発者へ提示 開発者は必要に応じて提示されたソースコードを編集 2010/03/29 名阪和ソフトウェア工学ミニワークショップ2010
Description:
コーディングパターンに基づくコード補完ツールの試作大阪大学 大学院情報科学研究科 ○ 伊達 浩典 関山 太朗 石尾 隆 井上 克郎 2010/03/29 1 名阪和ソフトウェア工学ミニワークショップ2010
Tags:
2010 | end | result | int | printverbose | isdebugmode | else | loop
Created:
3/28/2010 10:41:23 AM
>
Share this presentation
|
Copy the following code to your webpage or blog to embed this presentation:
<a href="http://www.slidefinder.net/7/797/33002997" class="slidefinder">797</a>
<script type="text/javascript" src="http://www.slidefinder.net/scripts/embedded.js"></script>
<a href="http://www.slidefinder.net/7/797/33002997" class="slidefinder">797</a>
Det3
<script type="text/javascript" src="http://www.slidefinder.net/scripts/embedded.js"></script>
Share this presentation:
Comments