オープンソースソフトウェアに対する コーディングパターン分析の適用

Slides:



Advertisements
Similar presentations
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University メソッド呼び出しパターンとして 現れる 横断的関心事の特徴評価 井上研究室 B4 三宅達也.
Advertisements

Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 保守支援を目的とした コードクローン情報検索ツール.
シーケンス図の生成のための実行履歴圧縮手法
XHTML構文検証手法における スクリプト要素の静的解析アルゴリズム
シーケンシャルパターンマイニングに基づくオブジェクト指向プログラムのための 欠陥検出手法
メソッド周辺の識別子と メソッド本体のAPI利用実績に基づいたAPI集合推薦手法
Myoungkyu Song and Eli Tilevich 発表者: 石尾 隆(大阪大学)
研究の背景 コードクローン ソースコード中に存在する一致または類似したコード片
変数間データフローグラフを用いた ソースコード間の移動支援
複数のモジュールに共通する ソースコード片の検出と活用
メソッド名とその周辺の識別子の 相関ルールに基づくメソッド名変更支援手法
分散処理を用いた大規模ソフトウェアに対するコーディングパターン検出ツール
ソースコードに対する適用可能な修正手順を 可視化するリファクタリング支援手法の提案
プログラム実行履歴を用いたトランザクションファンクション抽出手法
アイテムセットマイニングを利用した コードクローン分析作業の効率向上
プログラム実行時情報を用いたトランザクションファンクション抽出手法
パターンマイニング技術を 用いたC言語プログラムからの コーディングパターン抽出
ソースコードの変更履歴における メトリクス値の変化を用いた ソフトウェアの特性分析
コードクローンの分布情報を用いた特徴抽出手法の提案
ギャップを含むコードクローンの フィルタリング手法の提案
類似するコーディングパターンの 利用状況調査ツールの提案
コーディングパターンと キーワードを用いて生成したコードスニペットの推薦
コードクローンに含まれるメソッド呼び出しの 変更度合の分析
コードクローンに含まれるメソッド呼び出しの 変更度合の調査
ソードコードの編集に基づいた コードクローンの分類とその分析システム
第3回 2007年4月27日 応用Java (Java/XML).
動的依存グラフの3-gramを用いた 実行トレースの比較手法
ポインタ解析におけるライブラリの スタブコードへの置換の効果
動的スライスを用いたバグ修正前後の実行系列の差分検出手法
利用関係に基づく類似度を用いたJavaコンポーネント分類ツールの作成
リファクタリング支援のための コードクローンに含まれる識別子の対応関係分析
ソースコードの特徴量を用いた機械学習による メソッド抽出リファクタリング推薦手法
コードクローンの動作を比較するためのコードクローン周辺コードの解析
ソースコード縮退による ソースコード理解 神谷年洋 科学技術振興事業団 さきがけ研究21 オブジェクト指向シンポジウム2003.
コードクローン検出に基づくデザイン パターン適用支援手法の提案と実現
プログラム理解におけるThin sliceの 統計的調査による有用性評価
コード片に共通した特性を自動抽出する ソースコード閲覧ツールの試作
○ 後藤 祥1,吉田 則裕2 ,井岡 正和1 ,井上 克郎1 1大阪大学 2奈良先端科学技術大学院大学
ソフトウェア保守のための コードクローン情報検索ツール
パターンマイニング技術を 用いた実時間プログラムの コーディングパターン検出
コードクローンの理解支援を目的としたコードクローン周辺コードの解析
コードクローン分類の詳細化に基づく 集約パターンの提案と評価
既存ソフトウェア中の 頻出コード片を用いた コード補完手法の提案
コーディングパターンの あいまい検索の提案と実装
JAVAバイトコードにおける データ依存解析手法の提案と実装
インスタンスの型を考慮したJavaプログラムの実行経路の列挙手法の提案
JavaScriptを含んだHTML文書に対する データフロー解析を用いた構文検証手法の提案
コードクローン間の依存関係に基づく リファクタリング支援環境の実装
コードクローンの分布情報を用いた特徴抽出手法の提案
オブジェクトの協調動作を用いた オブジェクト指向プログラム実行履歴分割手法
メソッド呼び出しパターンとして現れる横断的関心事の検出
同期処理のモジュール化を 可能にする アスペクト指向言語
プログラムスライスを用いた凝集度メトリクスに基づく 類似メソッド集約候補の順位付け手法
保守請負時を対象とした 労力見積のためのメトリクスの提案
コードクローン間の依存関係に基づく リファクタリング支援手法の提案と実現
メソッドの同時更新履歴を用いたクラスの機能別分類法
分散処理を用いたコーディングパターン検出ツールの実装
プログラム依存グラフの一貫性検査に基づく欠陥候補の検出手法
状況に応じて適切な 例外処理が行なえる アスペクト指向分散環境実験の 支援ツール
統合開発環境のための プログラミング言語拡張 フレームワーク
欠陥検出を目的とした類似コード検索法 吉田則裕,石尾隆,松下誠,井上克郎 大阪大学 大学院情報科学研究科
ソフトウェア理解支援を目的とした 辞書の作成法
エイリアス関係を考慮した Javaプログラム用静的スライシングツール
コードクローン解析に基づく デザインパターン適用候補の検出手法
回帰テストにおける実行系列の差分の効率的な検出手法
メソッド抽出リファクタリングが 行われるメソッドの特徴調査
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
識別子の読解を目的とした名詞辞書の作成方法の一試案
プログラム依存グラフを用いた ソースコードのパターン違反検出法
Presentation transcript:

オープンソースソフトウェアに対する コーディングパターン分析の適用 大阪大学 大学院情報科学研究科 ○ 伊達 浩典 石尾 隆 井上 克郎

目次 コーディングパターン コーディングパターン分析 メトリクスの測定結果の考察 抽出手法 種類(例) 6種類のメトリクス 4つのオープンソースソフトウェア SES2009 2009/09/09

背景 同時に利用されるメソッド群 メソッドの呼び出し順序 メソッド呼び出しと制御構造 パターンの活用法 パターンの違反検出 open() → close() メソッド呼び出しと制御構造 if文 debugモードのときだけ処理を実行 for,while文 iteratorを利用して同じ処理を繰り返す パターンの活用法 パターンの違反検出 ライブラリの使い方の提示 プログラムの理解の手掛かり パターン部分を明示的に管理 SES2009 2009/09/09

コーディングパターン抽出処理 ソースコードの正規化 メソッドに分割 ソースコード (*.java) メソッド集合 メソッド内の正規化 public class A { public B m1() { } public B m2() { 入力 メソッドに分割 ソースコード (*.java) public B m1() { … } メソッド集合 メソッド内の正規化 A.m1 IF B.m2 LOOP A.m2 END-LOOP END-IF 要素データベース 出力 シーケンシャル パターンマイニング SES2009 コーディングパターン 2009/09/09 コーディングパターン検出ツール 4

メソッド内の正規化(1/2) メソッド中から特徴列を抽出する処理 特徴とは? 1つのメソッドから1つの特徴列を抽出 メソッド呼び出し 制御構造 条件分岐 繰り返し処理 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; SES2009 2009/09/09

メソッド内の正規化(2/2) メソッド呼び出し 制御構造 → 戻り値型,メソッド名,引数の型のリスト 条件分岐 繰り返し → 戻り値型,メソッド名,引数の型のリスト メソッド名に関しては,パッケージ名,クラス名を無視 制御構造 条件分岐 → IF,ELSE,END-IF 繰り返し → LOOP,END-LOOP SES2009 2009/09/09

パターンマイニング シーケンシャルパターンマイニング マイニング例 条件 パターン長: 4以上,サポート値: 2以上 isDebugMode() IF printVerbose() ELSE printSimple() END-IF methodCall1() IF printVerbose() END-IF methodCall2() isDebugMode() IF printVerbose() END-IF methodCall1() isDebugMode() methodCall3() printVerbose() LOOP print() END-LOOP 特徴列A 特徴列B 特徴列C 特徴列D SES2009 2009/09/09

パターンマイニング(結果) isDebugMode() IF printVerbose() END-IF パターン長:4 サポート値:2 instanceof isDebugMode() IF printVerbose() ELSE printSimple() END-IF methodCall1() IF printVerbose() END-IF methodCall2() isDebugMode() IF printVerbose() END-IF methodCall1() isDebugMode() methodCall3() printVerbose() LOOP print() END-LOOP 特徴列A 特徴列B 特徴列C 特徴列D SES2009 2009/09/09

コーディングパターンの種類 コーディングパターンとは ・ 頻出する定型的なコード片 ・ メソッド呼び出し,制御構造要素の列 イディオム プログラム実装上の定形処理 実装に利用する言語やライブラリに依存 例:イテレータによるループ処理 アプリケーション固有の機能実装 アプリケーション中で特定の機能を実装する為に用意した枠組み 例:JHotDrawのUndo機能の実現 SES2009 2009/09/09 10 10

コーディングパターン例 ~ イディオム ~ iterator() hasNext() LOOP next() END-LOOP … コーディングパターン例 ~ イディオム ~ … Iterator it = list.iterator(); while( it.hasNext() ) { Item item = (Item)it.next(); if (item.isActive()) { item.deactivate(); } イテレータ iterator() hasNext() LOOP next() END-LOOP … for( Iterator it = list.iterator(); it.hasNext(); ) { Item item = (Item)it.next(); if (item.isEnabled()) { item.setInabled(false); } コーディングパターン ソースコード上のインスタンス SES2009 2009/09/09 11

コーディングパターン例 ~ アプリケーション固有の機能実装 ~ コーディングパターン例           ~ アプリケーション固有の機能実装 ~ public void reverseAction(Figure figure) { setUndoActivity(createUndoActivity()); List l = CollectionsFactory.current().createList(); l.add(figure); l.add(((DecoratorFigure)figure).peelDecoration()); getUndoActivity().setAffectedFigures( new FigureEnumerator(l)); … } Undo機能の実装 JHotDraw(Ver. 5.4b1) createUndoActivity() setUndoActivity() getUndoActivity() setAffectedFigures() public void execute() { super.execute(); setUndoActivity(createUndoActivity()); getUndoActivity() .setAffectedFigures(view().selection()); FigureEnumeration fe = getUndoActivity().getAffectedFigures(); … } コーディングパターン ソースコード上のインスタンス SES2009 2009/09/09 12

コーディングパターンの分析 膨大なパターン数 従来の絞り込みの指標 パターン長 サポート値(インスタンス数) キーワード検索 パターンを構成する特徴要素数 サポート値(インスタンス数) ソースコード上で実際に登場する回数 キーワード検索 SES2009 2009/09/09

重要なパターンとは 開発者がプログラム理解のためにパターンを利用することを想定 重要なパターン 不要なパターン プログラムの機能に関連したもの 保守の際に考慮しなければいけないルール 不要なパターン 言語依存のイディオム SES2009 2009/09/09

コーディングパターンのメトリクス パターン長 インスタンス数 制御構造要素の割合 パターンを構成する要素の数 パターンが検出されたメソッド数 IF, ELSE, END-IF, LOOP, END-LOOP 制御構造要素数 / パターン長(パターン全体の要素数) 従来はこの2つに 頼っていた SES2009 2009/09/09

コーディングパターンのメトリクス ~パターンの密度~ LOOP a() b() END-LOOP パターンインスタンスの密度(DENinst)の平均 DENinst = LENpat / LENinst DENinst = 4 / 6 LENpat コーディングパターンの要素数 LENinst インスタンス開始要素から, インスタンス終了要素までの要素数 LENpat コーディングパターン v() LOOP a() b() w() x() END-LOOP y() z() LENinst インスタンス SES2009 2009/09/09 16

コーディングパターンのメトリクス ~パターンの分散~ パターンインスタンスのパッケージ間の分散度合 RAD = 0 RAD = 1 RAD = 2 pkg pkg 2 1 pkg ファイルA ファイルC ファイルA ファイルB ファイルA ファイルB     パターンインスタンス SES2009 2009/09/09 17

コーディングパターンのメトリクス ~非繰り返し要素の割合~ コーディングパターン中の非繰り返し要素の割合 x() a() b() y() z() 非繰り返し要素の割合 = 1 – (繰り返し要素数 / 全要素数) = 1 – (4 / 9) = 5 / 9 コーディングパターン SES2009 2009/09/09

メトリクスの関連性分析 オープンソースソフトウェアからコーディングパターンを抽出 パターンマイニングの設定 10 ≦ インスタンス数 4 ≦ パターン長 コーディングパターンのメトリクスを計測 メトリクスの関連性の分析 調査対象のソフトウェア Name Version LOC #Pattern JHotDraw 7.0.9 90166 375 jEdit 4.3pre10 168335 2902 Apache Tomcat 6.0.14 313479 8782 SableCC 3.2 35388 450 SES2009 2009/09/09

非繰り返し要素の割合と制御構造要素の割合 制御構造要素を含むパターン 非繰り返し要素の割合が高い LOOP構造により,繰り返し処理が集約 制御構造要素を含まないパターン 同じメソッド呼び出しを,繰り返し処理として実現できないものが含まれる 制御構造を含まないパターン 制御構造を含むパターン (jEdit) SES2009 2009/09/09

非繰り返し要素の割合と制御構造要素の割合 ~Apache Tomcatの場合~ パターン長:24(最長) サポート値(インスタンス数):12 「isDebugEnabled(), IF, debug(), END-IF」の繰り返し SES2009 2009/09/09

パターンの分類とメトリクスの関係 ライブラリの利用法に関連するパターン ソフトウェア全体に登場 SableCCでは29.3%がイテレータに関連 (例)イテレータの利用 SES2009 2009/09/09 (JHotDraw)

まとめと今後の課題 まとめ 今後の課題 コーディングパターン コーディングパターンのメトリクス 分析結果 抽出方法 種類 コーディングパターンのメトリクス 6種類 分析結果 パターン分類とメトリクス 非繰り返し要素の割合と制御構造要素の割合 今後の課題 コーディングパターンの分析環境の整備 メトリクスの改善 パターンインスタンスの分散 SES2009 2009/09/09