コーディングパターンと...

22
1 コココココココココココ ココココココココココココココココココココ ココココ 大大大大 ○ 大大 大大 大大 大大 大大 大 大大 大大

Upload: micah-ross

Post on 15-Mar-2016

46 views

Category:

Documents


2 download

DESCRIPTION

コーディングパターンと キーワードを用いて生成したコードスニペットの推薦. 大阪大学 ○関山 太朗,伊達 浩典,石尾 隆,井上 克郎. プログラム上のパターン. 何度も書かかれた類似したソースコードの断片 ソースコードの断片:コード片,コードスニペット. ...for (String s : strs) { ... }. ...for (Object o : collection) { ... }. for ([iterable type] [iterable element] : [iterable]) { }. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: コーディングパターンと キーワードを用いて生成したコードスニペットの推薦

1

コーディングパターンとキーワードを用いて生成したコードスニペットの推薦大阪大学○ 関山 太朗,伊達 浩典,石尾 隆,井上 克郎

Page 2: コーディングパターンと キーワードを用いて生成したコードスニペットの推薦

2

何度も書かかれた類似したソースコードの断片 ソースコードの断片:コード片,コードスニペット

プログラム上のパターン

...for (String s : strs) { ...}...

...for (Object o : collection) { ...}...

for ([iterable type] [iterable element] : [iterable]) {}

Page 3: コーディングパターンと キーワードを用いて生成したコードスニペットの推薦

3

開発環境におけるコード補完 キーワードからよく使うコード片を生成

よく使うコード片を素早く利用できる 知らない機能を発見することがある

例: Eclipse のコード補完 “foreach” キーワードからコレクションの各要素を順に

処理するコード片を生成

Eclipse コード補完の例foreach

for ([iterable type] [iterable element] : [iterable]) {}

Page 4: コーディングパターンと キーワードを用いて生成したコードスニペットの推薦

4

既存のコード補完の問題 使用できるパターンが限定されている

コード補完の実装であらかじめ用意されている 対象のプログラミング言語でよく使用される

ソフトウェア固有のパターンを用いたコード片の生成を行うことができない 既存のパターンと類似した処理を再度記述することに

欠陥の混入と開発コストの増大につながる

Page 5: コーディングパターンと キーワードを用いて生成したコードスニペットの推薦

5

ソフトウェア固有の機能が含まれているパターンソフトウェア固有のパターン (1/2)

if (!buffer.isEditable()) { getToolkit().beep(); return ;} ...

jEdit に頻出するコード片

テキストが編集できなければ音を鳴らして終了する処理

jEdit の機能である編集の可否をチェックするメソッド isEditable が含まれている

Page 6: コーディングパターンと キーワードを用いて生成したコードスニペットの推薦

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 に頻出するコード片

Page 7: コーディングパターンと キーワードを用いて生成したコードスニペットの推薦

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).

Page 8: コーディングパターンと キーワードを用いて生成したコードスニペットの推薦

8

提案手法 既存のコード補完の問題点を解決

ソフトウェア固有のパターンと類似した処理を再度記述することを防ぐ コーディングパターンに基づくコード補完手法の提案

ソフトウェア固有のパターンはコーディングパターンとして得られる

Page 9: コーディングパターンと キーワードを用いて生成したコードスニペットの推薦

9

提案手法:コーディングパターンに基づくコード補完手法

1. パターンの検索 2. コード片の生成 3. ソースコードへ挿入

開発者が入力した単語 ( キーワード )開発者が編集しているソースコード

キーワードに関連したパターン パターンから生成したコード片パターンデータベース

Page 10: コーディングパターンと キーワードを用いて生成したコードスニペットの推薦

10

パターン データベースの構築 コーディングパターンの取得には既存手法を使用 コーディングパターンを保存したデータベースをパターン検索の前に構築

コーディングパターンJEditBuffer.isEditable()

IF

JComponent.getToolkit()

Toolkit.beep()

END-IF

if (!buffer.isEditable()) { getToolkit().beep(); return ;} ...

jEdit に頻出するコード片 コーディングパターンの抽出

Page 11: コーディングパターンと キーワードを用いて生成したコードスニペットの推薦

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.

Page 12: コーディングパターンと キーワードを用いて生成したコードスニペットの推薦

12

パターンの各要素をコード片へ変換 このステップでは参照する変数は未定とする

コード片の生成: パターン要素の変換

パターン コード片JEditBuffer.isEditable()

END-IF

Toolkit.beep()

JComponent.getToolkit()

IF if (???) {

???.isEditable();

???.beep();

???.getToolkit();

}

Page 13: コーディングパターンと キーワードを用いて生成したコードスニペットの推薦

13

???.beep();???.getToolkit();

if (???) {???.isEditable();

挿入箇所の直前で宣言した変数を使用 メソッド呼び出しの戻り値は新しく宣言した変数へ代入

コード片の生成: 参照変数の決定

コード片boolean var0 = buf.isEditable();

if (var0) {

JComponent var1;

Toolkit var2 = var1.getToolkit();

var2.beep();

}

ソースコードへ挿入するコード片JEditBuffer buf = ...;

編集中のソースコード

}

Page 14: コーディングパターンと キーワードを用いて生成したコードスニペットの推薦

14

ソースコードへの挿入 生成したコード片を開発者が編集しているソースコードへ挿入 挿入後のソースコードを開発者へ提示 開発者は必要に応じて提示されたソースコードを編集

Page 15: コーディングパターンと キーワードを用いて生成したコードスニペットの推薦

15

実装: Eclipse プラグイン

入力キーワードコード片

Page 16: コーディングパターンと キーワードを用いて生成したコードスニペットの推薦

16

実験: 妥当性の検証1. パターンの検索2. コード片の生成

1. パターンの検索 2. コード片の生成 3. ソースコードへ挿入

開発者が入力した単語 ( キーワード )開発者が編集しているソースコード

キーワードに関連したパターン パターンから生成したコード片パターンデータベース

Page 17: コーディングパターンと キーワードを用いて生成したコードスニペットの推薦

17

妥当性の検証: パターンの検索 対象

Pa : jEdit4.3 から取得したパターン集合 Pb : Pa のうち重みの大きい単語が出現するパターン集合

方法 パターン自身に出現する単語をキーワードとして検索し,順位を調査

結果パターンが上位 3 位以内に含まれる確率 Pa : 0.4371 Pb : 0.9775

考察 目的のパターンを得るためには複数回の検索が必要な場合もある 実装ツールでは 1 回の実行時間は約 1 秒

Page 18: コーディングパターンと キーワードを用いて生成したコードスニペットの推薦

18

妥当性の検証: コード片の生成

...;if (!buffer.isEditable()) { getToolkit().beep();}...;

...;

生成したコード片...;比較

コード片の生成・置換

1. パターンが出現する既存ソースコードを 1 つ選び,削除2. パターンと削除後のソースコードからコード片を生成3. 削除した部分と生成したコード片の変数の使用方法を比較

対象 jEdit4.3 のパターンからランダムに選んだ 11 個のパターン

パターンの総数: 7559

方法

Page 19: コーディングパターンと キーワードを用いて生成したコードスニペットの推薦

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

変数の初期化 変数の使用方法が一致するケース

生成したコード片既存のソースコード

Page 20: コーディングパターンと キーワードを用いて生成したコードスニペットの推薦

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(); }} ...

同じ型の引数を複数とるメソッド呼び出しが出現する例

Page 21: コーディングパターンと キーワードを用いて生成したコードスニペットの推薦

21

考察: コード片の生成 変数の使用方法が一致した理由

パターンの要素間にはコード片がほとんど含まれない 同一の型が同時に使用されることはほとんどない

例外: GUI で使用するクラスや基本型など 変数の使用方法が異なるケースの解決案

パターンが出現するソースコードの利用 データフロー情報

Page 22: コーディングパターンと キーワードを用いて生成したコードスニペットの推薦

22

まとめと今後の課題 まとめ

コーディングパターンに基づくコード補完手法を提案 提案手法に対する評価実験を行い,次の妥当性を検証

パターンの検索 コード片の生成

今後の課題 データフロー情報を利用したコード片の生成 実際のソフトウェア開発における評価