コーディングパターンと...
DESCRIPTION
コーディングパターンと キーワードを用いて生成したコードスニペットの推薦. 大阪大学 ○関山 太朗,伊達 浩典,石尾 隆,井上 克郎. プログラム上のパターン. 何度も書かかれた類似したソースコードの断片 ソースコードの断片:コード片,コードスニペット. ...for (String s : strs) { ... }. ...for (Object o : collection) { ... }. for ([iterable type] [iterable element] : [iterable]) { }. - PowerPoint PPT PresentationTRANSCRIPT
1
コーディングパターンとキーワードを用いて生成したコードスニペットの推薦大阪大学○ 関山 太朗,伊達 浩典,石尾 隆,井上 克郎
2
何度も書かかれた類似したソースコードの断片 ソースコードの断片:コード片,コードスニペット
プログラム上のパターン
...for (String s : strs) { ...}...
...for (Object o : collection) { ...}...
for ([iterable type] [iterable element] : [iterable]) {}
3
開発環境におけるコード補完 キーワードからよく使うコード片を生成
よく使うコード片を素早く利用できる 知らない機能を発見することがある
例: Eclipse のコード補完 “foreach” キーワードからコレクションの各要素を順に
処理するコード片を生成
Eclipse コード補完の例foreach
for ([iterable type] [iterable element] : [iterable]) {}
4
既存のコード補完の問題 使用できるパターンが限定されている
コード補完の実装であらかじめ用意されている 対象のプログラミング言語でよく使用される
ソフトウェア固有のパターンを用いたコード片の生成を行うことができない 既存のパターンと類似した処理を再度記述することに
欠陥の混入と開発コストの増大につながる
5
ソフトウェア固有の機能が含まれているパターンソフトウェア固有のパターン (1/2)
if (!buffer.isEditable()) { getToolkit().beep(); return ;} ...
jEdit に頻出するコード片
テキストが編集できなければ音を鳴らして終了する処理
jEdit の機能である編集の可否をチェックするメソッド isEditable が含まれている
6
ソフトウェア固有のパターン (2/2)
再利用可能だが 1 つにまとめられないパターンが存在void exitUnlessEditable() { if (!buffer.isEditable()) { getToolkit().beep(); return ; } }
関数関数化
void inputChar(char c) { exitUnlessEditable(); ... }
関数適用時のコード片
関数の適用exitUnlessEditable メソッドの呼び出し後にinputChar メソッドの実行を終了できない
if (!buffer.isEditable()) { getToolkit().beep(); return ;} ...
jEdit に頻出するコード片
7
コーディングパターン 我々の研究グループではソフトウェア固有のパター
ンを得るための手法を提案してきた [Ishio, 2008] コーディングパターンとは
ソフトウェアに頻出するコード片 メソッド呼び出しと制御文の開始と終了の列
コーディングパターンJEditBuffer.isEditable()
IF
JComponent.getToolkit()
Toolkit.beep()
END-IF
if (!buffer.isEditable()) { getToolkit().beep(); return ;} ...
jEdit に頻出するコード片 コーディングパターンの抽出
[Ishio, 2008] Ishio, T., Date, H., Miyake, T. and Inoue, K.:Mining Coding Patterns to Detect Crosscutting Concerns in Java Programs. Inproceedings of 15th Working Conference on Reverse Engineering, pp.123-132 (2008).
8
提案手法 既存のコード補完の問題点を解決
ソフトウェア固有のパターンと類似した処理を再度記述することを防ぐ コーディングパターンに基づくコード補完手法の提案
ソフトウェア固有のパターンはコーディングパターンとして得られる
9
提案手法:コーディングパターンに基づくコード補完手法
1. パターンの検索 2. コード片の生成 3. ソースコードへ挿入
開発者が入力した単語 ( キーワード )開発者が編集しているソースコード
キーワードに関連したパターン パターンから生成したコード片パターンデータベース
10
パターン データベースの構築 コーディングパターンの取得には既存手法を使用 コーディングパターンを保存したデータベースをパターン検索の前に構築
コーディングパターンJEditBuffer.isEditable()
IF
JComponent.getToolkit()
Toolkit.beep()
END-IF
if (!buffer.isEditable()) { getToolkit().beep(); return ;} ...
jEdit に頻出するコード片 コーディングパターンの抽出
11
パターンの検索 入力キーワードに関連したパターン
パターンに入力キーワードと一致する単語が多く出現 一致する単語のうち,重みの大きい単語が多い
単語の重みは自然言語検索で利用されている TF-IDF[Salton,1987] で決定
検索結果: 入力キーワードに最も関連している k 個のパターン
実装したツールでは k = 3[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.
12
パターンの各要素をコード片へ変換 このステップでは参照する変数は未定とする
コード片の生成: パターン要素の変換
パターン コード片JEditBuffer.isEditable()
END-IF
Toolkit.beep()
JComponent.getToolkit()
IF if (???) {
???.isEditable();
???.beep();
???.getToolkit();
}
13
???.beep();???.getToolkit();
if (???) {???.isEditable();
挿入箇所の直前で宣言した変数を使用 メソッド呼び出しの戻り値は新しく宣言した変数へ代入
コード片の生成: 参照変数の決定
コード片boolean var0 = buf.isEditable();
if (var0) {
JComponent var1;
Toolkit var2 = var1.getToolkit();
var2.beep();
}
ソースコードへ挿入するコード片JEditBuffer buf = ...;
編集中のソースコード
}
14
ソースコードへの挿入 生成したコード片を開発者が編集しているソースコードへ挿入 挿入後のソースコードを開発者へ提示 開発者は必要に応じて提示されたソースコードを編集
15
実装: Eclipse プラグイン
入力キーワードコード片
16
実験: 妥当性の検証1. パターンの検索2. コード片の生成
1. パターンの検索 2. コード片の生成 3. ソースコードへ挿入
開発者が入力した単語 ( キーワード )開発者が編集しているソースコード
キーワードに関連したパターン パターンから生成したコード片パターンデータベース
17
妥当性の検証: パターンの検索 対象
Pa : jEdit4.3 から取得したパターン集合 Pb : Pa のうち重みの大きい単語が出現するパターン集合
方法 パターン自身に出現する単語をキーワードとして検索し,順位を調査
結果パターンが上位 3 位以内に含まれる確率 Pa : 0.4371 Pb : 0.9775
考察 目的のパターンを得るためには複数回の検索が必要な場合もある 実装ツールでは 1 回の実行時間は約 1 秒
18
妥当性の検証: コード片の生成
...;if (!buffer.isEditable()) { getToolkit().beep();}...;
...;
生成したコード片...;比較
コード片の生成・置換
1. パターンが出現する既存ソースコードを 1 つ選び,削除2. パターンと削除後のソースコードからコード片を生成3. 削除した部分と生成したコード片の変数の使用方法を比較
対象 jEdit4.3 のパターンからランダムに選んだ 11 個のパターン
パターンの総数: 7559
方法
19
boolean var0;
while (var0) {
java.lang.String var1 =
st.nextToken();
boolean var2 =
st.hasMoreTokens();
}
変数名の rename
{ StringTokenizer st = ...; while (...) { String keyCodeStr = st.nextToken(); ... ... (st.hasMoreTokens()) ... }}
妥当性の検証結果 (1/2) : コード片の生成変数の使用方法が
一致するケース変数の使用方法が
異なるケース7 4
変数の初期化 変数の使用方法が一致するケース
生成したコード片既存のソースコード
20
boolean var0;
if (var0) {
this.extendSelection(newCaret,
newCaret);
} else {
this.selectNone();
}
妥当性の検証結果 (2/2) : コード片の生成 変数の使用方法が異なるパターンの特徴
GUI の設定 同じ型の引数を複数とるメソッド呼び出しが出現 基本データ型が出現
int 型など
int caret, newCaret; ...{ if (...) this.extendSelection(caret, newCaret); else { ... this.selectNone(); }} ...
同じ型の引数を複数とるメソッド呼び出しが出現する例
21
考察: コード片の生成 変数の使用方法が一致した理由
パターンの要素間にはコード片がほとんど含まれない 同一の型が同時に使用されることはほとんどない
例外: GUI で使用するクラスや基本型など 変数の使用方法が異なるケースの解決案
パターンが出現するソースコードの利用 データフロー情報
22
まとめと今後の課題 まとめ
コーディングパターンに基づくコード補完手法を提案 提案手法に対する評価実験を行い,次の妥当性を検証
パターンの検索 コード片の生成
今後の課題 データフロー情報を利用したコード片の生成 実際のソフトウェア開発における評価