類似するコーディングパターンの 利用状況調査ツールの提案

Slides:



Advertisements
Similar presentations
API 呼び出し列の差分を利用した Android アプリケーション比較ツールの 試作 井上研究室 神田 哲也.
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 保守支援を目的とした コードクローン情報検索ツール.
シーケンス図の生成のための実行履歴圧縮手法
情報理工学部 情報システム工学科 ラシキアゼミ 3年 H 井奈波 和也
XHTML構文検証手法における スクリプト要素の静的解析アルゴリズム
シーケンシャルパターンマイニングに基づくオブジェクト指向プログラムのための 欠陥検出手法
メソッド周辺の識別子と メソッド本体のAPI利用実績に基づいたAPI集合推薦手法
ソースコードの編集内容を入力とした ソフトウェア部品の自動検索
プログラミング基礎I(再) 山元進.
Myoungkyu Song and Eli Tilevich 発表者: 石尾 隆(大阪大学)
情報伝播によるオブジェクト指向プログラム理解支援の提案
リファクタリングのための 変更波及解析を利用した テスト支援ツールの提案
メソッド名とその周辺の識別子の 相関ルールに基づくメソッド名変更支援手法
分散処理を用いた大規模ソフトウェアに対するコーディングパターン検出ツール
川口真司 松下誠 井上克郎 大阪大学大学院情報科学研究科
Java ソフトウェア部品検索システム SPARS-J のための リポジトリ自動更新機能の実現
プログラム実行履歴を用いたトランザクションファンクション抽出手法
プログラム実行時情報を用いたトランザクションファンクション抽出手法
11.6 ランダムアクセスファイル 11.7 StreamTokenizerクラス
ギャップを含むコードクローンの フィルタリング手法の提案
コーディングパターンと キーワードを用いて生成したコードスニペットの推薦
Javaクラスの利用関係を用いた ソフトウェア部品のカテゴリ階層構築法
コードクローンに含まれるメソッド呼び出しの 変更度合の分析
コードクローンに含まれるメソッド呼び出しの 変更度合の調査
識別子の命名支援を目的とした動詞-目的語関係の辞書構築
ソードコードの編集に基づいた コードクローンの分類とその分析システム
動的依存グラフの3-gramを用いた 実行トレースの比較手法
オブジェクト指向プログラムにおける エイリアス解析手法の提案と実現
変数のデータフローを考慮した API利用コード例の検索 井上研究室 竹之内 啓太.
利用関係に基づく類似度を用いたJavaコンポーネント分類ツールの作成
コードクローン検出ツールを用いた ソースコード分析システムの試作と プログラミング演習への適用
リファクタリング支援のための コードクローンに含まれる識別子の対応関係分析
ソースコードの特徴量を用いた機械学習による メソッド抽出リファクタリング推薦手法
オープンソース開発支援のための リビジョン情報と電子メールの検索システム
コードクローンの動作を比較するためのコードクローン周辺コードの解析
コードクローン検出に基づくデザイン パターン適用支援手法の提案と実現
Parallel Setsによるライブラリの 組み合わせと利用状況の可視化
プログラム理解におけるThin sliceの 統計的調査による有用性評価
バイトコードを単位とするJavaスライスシステムの試作
コード片に共通した特性を自動抽出する ソースコード閲覧ツールの試作
Javaソフトウェア部品検索システムSPARS-Jの実験的評価
○ 後藤 祥1,吉田 則裕2 ,井岡 正和1 ,井上 克郎1 1大阪大学 2奈良先端科学技術大学院大学
ソフトウェア保守のための コードクローン情報検索ツール
パターンマイニング技術を 用いた実時間プログラムの コーディングパターン検出
コードクローンの理解支援を目的としたコードクローン周辺コードの解析
dcNavi: デバッグ方法をアドバイス する関心事指向リポジトリナビゲータ
コードクローン分類の詳細化に基づく 集約パターンの提案と評価
既存ソフトウェア中の 頻出コード片を用いた コード補完手法の提案
コーディングパターンの あいまい検索の提案と実装
JAVAバイトコードにおける データ依存解析手法の提案と実装
インスタンスの型を考慮したJavaプログラムの実行経路の列挙手法の提案
JavaScriptを含んだHTML文書に対する データフロー解析を用いた構文検証手法の提案
プログラムスライスを用いた凝集度メトリクスに基づく 類似メソッド集約候補の順位付け手法
設計情報の再利用を目的とした UML図の自動推薦ツール
dcNavi:デバッグ支援のための グラフベース推薦システム
クローン検出ツールを用いた ソフトウェアシステムの類似度調査
オープンソースソフトウェアに対する コーディングパターン分析の適用
メソッドの同時更新履歴を用いたクラスの機能別分類法
分散処理を用いたコーディングパターン検出ツールの実装
ソースコードの編集状況に応じた ソフトウェア部品の自動推薦システム
欠陥検出を目的とした類似コード検索法 吉田則裕,石尾隆,松下誠,井上克郎 大阪大学 大学院情報科学研究科
ソフトウェア理解支援を目的とした 辞書の作成法
エイリアス関係を考慮した Javaプログラム用静的スライシングツール
プログラムの一時停止時に 将来の実行情報を提供するデバッガ
コードクローン解析に基づく デザインパターン適用候補の検出手法
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
プログラム理解のための 付加注釈 DocumentTag の提案
Presentation transcript:

類似するコーディングパターンの 利用状況調査ツールの提案  〇小笠原康貴 神田哲也 井上克郎 大阪大学

コーディングパターン ソースコード中に分散して出現する定型的なコード片のこと 特定の処理を実装するイディオムなどが当てはまる イディオムの抽出 こちらの図がコーディングパターンの例になります。この図はjavaのIteratorクラスを用いた繰り返し処理の実装になります。 こちらの実装はあらゆるソースコードで用いられ、一種のイディオムとなっております。実際にはこれらの下線が引かれている記述が イディオムとして使われており、これらのイディオム部分を抽出することで、右図のようなコーディングパターンを形成することができます。 java.util.Iteratorクラスによる イディオム的実装 形成されるコーディングパターン

コーディングパターンの利用 処理の実装方法の理解 ソフトウェア保守 APIの実装 ソフトウェア固有の処理 実装ルールの確認 同時修正の検討 コーディングパターンには次のような利用方法が有ります。 1つは処理の実装方法の理解です。開発者がAPIを用いた処理の実装方法を調べる際には、インターネット検索を行ってドキュメントなどを 参照することが一般的です。しかし、一部のAPIは複雑化しており、ドキュメントを確認するだけでは、どのメソッドを組み合わせて使えば よいか理解できない場合があります。そのような場合に、ソフトウェア中にコーディングパターンとしてAPIの実装があれば、それを確認することで実装方法を理解することができます。 同様に、ソフトウェア中のコーディングパターンを調べることで、ソフトウェア中で定義されたメソッドを用いた、ソフトウェア固有の処理の実装方法を理解できる場合があります。 2つ目の利用方法として、コーディングパターンをソフトウェア保守に用いることができます。 例えば、ソフトウェア中のコーディングパターンを検出することで、あるメソッドを呼び出した後はロギング処理を行う、といった実装ルールを確認できる場合があります。 また、そのような実装ルールに変更を加える場合に、コーディングパターンに属するコード片の同時修正を検討することができます。 これらのことから、コーディングパターンの検出がソフトウェア開発に有用であると言えます。 コーディングパターンの検出がソフトウェア開発に有用

関連研究 シーケンシャルパターンマイニングを用いたコーディングパターン検出[1] API利用例検索ツール[2] ソースコード中のコーディングパターンを自動で一括検出 API利用例検索ツール[2] 特殊な検索クエリを用いて,ソースコードからAPIの 利用例を検出 検出された利用例は一種のコーディングパターン [1]石尾 隆,伊達 浩典,三宅 達也,井上 克郎.シーケンシャルパターンマイニングを用いたコーディングパターン抽出.情報処理学会論文誌, Vol. 50, No. 2, pp. 860-871,2009. [2]竹之内 啓太,石尾 隆,井上 克郎.変数のデータフローによるAPI利用コード例の検索.コンピュータソフトウェア, Vol.34, No.4, pp.68--74,2017

再利用の問題点 検出結果には類似するコーディングパターンが存在 開発者は再利用すべきパターンを判断しなければならない 使用する制御構造の違い APIの処理のバリエーション 実装ルールのバリエーション このような関連研究により、コーディングパターンの検出を行うことができますが、検出されたコーディングパターンを再利用することには 問題点もあります。 関連研究の検出結果には類似するコーディングパターンが存在する可能性があります。例えば同じ処理でも、使用する制御構造がfor分やwhile文などで違う場合や、同じAPIに関するコーディングパターンであっても、行う処理の違いによって一部の記述が異なります。 また、ソフトウェアによっては、類似した実装ルールが複数あり、条件によって使い分けられている可能性もあります。 そのため、開発者が検出されたコーディングパターンを再利用するためには、状況に応じた最適なコーディングパターンを判断する必要があると言えます。 開発者は再利用すべきパターンを判断しなければならない

類似するパターンの例 この二つの実装は,どちらを使えばよいか? br = new BufferedReader(); while(br.ready()){ String line = br.readLine(); System.out.println(line); } br = new BufferedReader(); while((line = br.readLine()) != null){ System.out.println(line); } BufferedReader/ready/readLine BufferedReader/readLine 類似するコーディングパターンの利用例を用いて説明します。 これらはjavaのBufferedReaderクラスを用いた、文字列を一列ずつ読み込む処理を行う実装になっており、それぞれ別の類似するコーディングパターンに属しています。 これらの類似するコーディングパターンには、大きな違いとして、readyメソッドを使用するか否かという違いがありますが、利用例を見ただけではどちらを使ってもよさそうに見えます。 しかし、実際にはこれらの実装は、与えるデータの型や内容によって挙動が変わるので、これらの実装は使い分ける必要があります。 このように、類似する実装に対して、開発者が利用するパターンを判断しなければならない場合があります。 また、この例はよく知られた実装であり、ネット検索をすれば利用方法を判断することができますが、ソフトウェア固有のコーディングパターンなど、情報が少なくなるほどその利用方法の判断は難しいと言えます。  この二つの実装は,どちらを使えばよいか?

研究動機 開発者は類似するコーディングパターンから利用すべき ものを判断する必要がある 類似するコーディングパターンの利用例を検出して 確認するだけでは,その判断は難しい ⇒類似するコーディングパターンを調査するツールの提案 ここまでで、開発者がコーディングパターンを再利用するためには、類似するコーディングパターンから再利用すべきものを判断する必要があること、 また、類似するコーディングパターンの利用例を検出して確認するだけではその判断が難しいことが問題点であることを説明しました。 今回の研究では、この問題点を解決するために、類似するコーディングパターンを調査するツールの提案を行います。

ツールの方針 コーディングパターンの利用方法を判断するために, 類似するコーディングパターンをそれぞれ分別 利用されている場所,利用回数を提示 関心のあるコーディングパターンだけを調査 ⇒検索クエリを用いて類似するコーディングパターンを  分別するツールを実装 ツールの方針として、類似するコーディングパターンの利用方法を判断するためには、~を行えることが必要であると考えました。 これらの方針を実現するために、検索クエリを用いて、類似するコーディングパターンを分別するツールを実装しました。

提案ツールのアイデア これらのコーディングパターンは,br.ready()の有無を調べることで分別可能 br = new BufferedReader(); while(br.ready()){ String line = br.readLine(); System.out.println(line); } br = new BufferedReader(); while((line = br.readLine()) != null){ System.out.println(line); } これらのコーディングパターンは,br.ready()の有無を調べることで分別可能 キーワード検索を応用した検索手法を利用 提案するツールでは、類似するコーディングパターンを分別するために、パターンに含まれるキーワードの違いを利用します。 例えば、これらの類似するコーディングパターンは、br.readyの有無を調べることで分別可能です。 提案ツールでは、この処理をキーワード検索を応用した検索手法を利用して実現します。

提案ツールの手法 キーワード検索の不一致結果を利用 コードブロック中の複数のキーワードの有無を用いて, 記述されているコーディングパターンを判別 BufferedReader:有 ready:有 readLine:有 br = new BufferedReader(); while(br.ready()){ String line = br.readLine(); } BufferedReader:有 ready:無 readLine:有 提案ツールでは、キーワードの有無を調べるために、キーワード検索の不一致結果を利用します。 そして、コードブロック中の複数のキーワードの有無を調べて、記述されているコーディングパターンを判別します。 例えばこの例では、BufferedReader,ready,readLineという三つのキーワード検索をコードブロックに対し行うと、その検索結果の組み合わせによってこれらのコードブロックを分別することができます。 br = new BufferedReader(); while((line = br.readLine()) != null){ }

提案ツール 既知のコーディングパターンについて,類似するコーディングパターンをリポジトリから分別して提示するツール 利用者が記述した検索クエリに応じて, リポジトリ中のコーディングパターンを分別する Eclipse Plugin として実装 Javaで記述されたソースコードが対象 それでは提案ツールについて具体的に説明します。

提案ツールの概要 10% 90% ツール 利用者 検索クエリを記述 検索クエリ 入力 出力 コードブロックのグループ 調査したいコーディングパターン BufferedReader ready readLine close br = new BufferedReader(); while(br.ready()){ String line = br.readLine(); } br.close(); 利用者 10% 検索クエリを記述 BufferedReader readLine close 検索クエリ 90% こちらがツールの概要図です。 まず利用者は、調査したいコーディングパターンをもとに、いくつかのキーワードを検索クエリに記述します。 記述した検索クエリを入力としてツールはリポジトリのソースコードに対して検索をおこない結果を出力します。 出力されるのは、検索によって分別されたコードブロックのグループです。 出力結果では、各グループ内のコードブロックを参照できるとともに、それぞれのグループに含まれるコードブロックの割合を確認することができます。 入力 出力 リポジトリ コードブロックのグループ ツール

手法の手順 STEP1:検索クエリの記述 STEP2:コードブロックの抽出 STEP3:検索クエリによるコードブロックの分別 ツールの手法を実現するために、次の、~の3つのステップをおこないます。 これらのステップを順番に説明していきます。

STEP1:検索クエリの記述 既知のコーディングパターンから注目したいキーワードを複数選んで記述 特殊な入力については後述 キーワード間はセミコロンで区切る 特殊な入力については後述 br = new BufferedReader(); while(br.ready()){ String line = br.readLine(); } br.close(); BufferedReader; ready; readLine; close; まず始めに、利用者は検索クエリを記述します。 調査したい既知のコーディングパターンから、注目したいキーワードを複数選んで記述します。 この例であれば、BufferedReaderクラスのコーディングパターンを調べたいので、BufferedReaderクラスのメソッド呼び出しをキーワードに して記述します。キーワード間はこのようにセミコロンで区切ります。 提案する検索クエリでは、これに加えて幾つかの特殊な入力を行えますが、それについては後に説明します。 検索クエリの記述 既知のコーディングパターン

STEP2:コードブロックの抽出 検索対象となるコードブロックの抽出を行う 構文解析による抽出 次に検索対象となるコードブロックの抽出を行います。 こちらは構文解析を用いて実現します。 javaのソースコードに対して構文解析を行うことで、このようにメソッド宣言などの特定の構文構造を抽出することができます。

STEP3:コードブロックの分別 最後に先ほど抽出したコードブロックに対して検索を行っていきます。

同名メソッドの区別 トークンを用いてインスタンス名を置換 同名メソッドを区別できる インスタンス名が異なるため,検索に一致しない $aにbrが割り当てられる File file = new File(“~"); FileReader fr = new FileReader(file); BufferedReader br = new BufferedReader(fr); String str = br.readLine(); fr.close(); $a=BufferedReader; $a.readLine; $a.close; 検索クエリ ここで、検索クエリで使用できる特殊な入力について説明します。 まず一つ目は、トークンを用いてインスタンス名を置換することができます。 記述する際にはこのような$マークを用います。この例を用いて動作を説明します。 インスタンス名が異なるため,検索に一致しない

必須条件の指定 〇 × × 必須条件を指定する-eオプション入力 関心の無い検索対象を除外できる $a=BufferedReader;-e br = new BufferedReader(fr); br.readLine(); br.close(); 〇 $a=BufferedReader;-e $a.readLine;-e $a.close; br = new BufferedReader(fr); br.close(); × 次に、必須条件を指定する-eというオプション入力を行うことができます。 記述する際にはこのように、キーワードの入力後に-eと記述します。 -eが記述された場合、そのキーワード検索に一致しなかった場合は、そのコードブロックを検索の対象外にします。 例えばこの例だと、~ このように関心の無い検索対象を除外することができます。 br.close(); ×

提案ツールの入力画面

ケーススタディ 提案手法により,類似するコーディングパターンを分別して提示できるか確認 対象は6つのオープンソースソフトウェア 総行数:約112万行 構文解析時間:約1分 既存研究により上記のソースコード中で確認されている,java.sql.ResultSetクラスに関するコーディングパターンに加え,類似するパターンを分別して提示できるか調査 こちらの提案ツールを用いて次のようなケーススタディを行いました。 そうファイル数:5726 総行数:1119959 apach ant 1196,256039 roller 689,135206 tomcat 1404,370373 jwebmail 111,18074 velocity 371,70804 struts 1955,269490

検索クエリの記述 ResultSetクラスに関するメソッド呼び出しをキーワードに設定 executeQueryに-eオプションを追加 トークンを用いてインスタンス名を置換 例では$aにrsを置換する $a=executeQuery ;−e $a.next ; $a.getString; $a.close; まず検索クエリの記述を行います。こちらの図がResultSetクラスに関するコーディングパターンになります。 今回調査したいのはResultSetクラスに関するコーディングパターンだけですので、~ 記述した検索クエリ

ツールの出力結果 キーワード列 グループの割合 コードブロック

コードブロックの分別結果 A B C D C D 類似するコーディングパターンを分別して提示することができた executeQuery() next() close() D executeQuery() next() 5個 9個 2個 1個 類似するコーディングパターンを分別して提示することができた グループC,Dは少数派であったが,確認した所getStringの記述の代わりにgetInt,getBooleanの記述があった

利用状況の確認 AとBは同一の処理だが異なる実装 Aはtomcat,Bはwebloggerから検出 ⇒ソフトウェアによって実装が統一されている また、AとBの違いはcloseメソッドがあるかないかの違いで、同一の処理ですが実装が異なります。 こちらの検出結果を確認したところ~

まとめと今後の課題 特殊な検索クエリを用いて類似するコーディングパターンの分別を行うツールを提案した 従来では確認できなかった,類似コーディングパターンごとの出現回数などの情報が確認できた 今後の課題 検索クエリの記述能力の改善 制御構造やキーワードの順番を考慮できるようにする 分別結果に対する解析方法を検討 今後の課題としては、検索クエリの記述能力の改善が必要です。 コーディングパターンには制御構造、キーワードの順番などが考慮されるべきなので、それらを扱えるように検索クエリを改善する必要があります。 また、今回はキーワードの違いを利用して分別を行いましたが、その分別結果に対して、利用方法を判断するための解析方法を検討することが 必要です。