メソッド呼び出しパターンとして現れる 横断的関心事の検出 大阪大学 三宅達也 Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 研究概要 メソッド呼び出しパターン抽出手法を用いて横断的関心事を検 出 横断的関心事とメソッド呼び出しパターンは同種の機能に関するコード が複数個所に出現するという点で類似している 横断的関心事と関連しているパターンがどの程度存在している かの調査 メソッド呼び出し パターン 横断的 関心事 SIGSS研究会 2015/10/1 Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 2 研究背景 横断的関心事 アスペクト指向プログラミング(AOP) メソッド呼び出しパターン SIGSS研究会 2015/10/1 Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 3 横断的関心事 複数のモジュールにまたがって実装される 機能 保守性,再利用性などを悪化させる クラス1 クラス2 ロギング ロギング 例外処理 例外処理 ロギング 例外処理 SIGSS研究会 2015/10/1 Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 4 横断的関心事の例 Class cls1 { void method1 ( ) { logging.message(); logging.message( “meth1”); } Class Logging { public void message(String ){ s) { System.out.println(“start”); System.out.println(s); } ・ ・ ・ コンパイル エラー } } メソッドの開始時に メッセージを 表示するメソッド Class cls2 { void method2 ( ) { logging.message(); logging.message( “meth2”); } } ・ ・ ・ 本来はLoggingクラス にまとめてしまいたい SIGSS研究会 2015/10/1 Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 5 アスペクト指向プログラミング(AOP) 新たなモジュール単位「アスペクト」を導入 アスペクトを利用し、より理想的なモジュール構 造を実現 保守性、再利用性などが向上 クラス1 クラス2 アスペクト 例外処理 SIGSS研究会 ロギング 2015/10/1 Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 6 横断的関心事の種類 ~ Homogeneous と Heterogeneous ~ 均一性横断的関心事(homogeneous crosscutting concern) どの出現箇所でも関心事を実現するコードが均一 単一のメソッド呼び出し 複数のモジュールにまたがるコードクローン アスペクトにまとめるのが容易 非均一性横断的関心事(heterogeneous crosscutting concern) 出現箇所ごとに関心事を実現するコードが異なる アスペクトにまとめるのが困難 SIGSS研究会 2015/10/1 Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 7 横断的関心事の種類の例 ~ Homogeneous と Heterogeneous ~ 均一性横断的関心事 非均一性横断的関心事 public void heterogen1 ( ) { double res; LineData ld = input ( ); boolean c = ld.check( ); int h = ld.getHeight( ); int b = ld.getBottom( ); if ( c ) { res = b * h / 2; output ( res ); } } public void homogen1 ( ) { if ( isLog() ) { showLog ( ); } int r = ld.getRadius( ); res = Math.pow ( r,2 ); res = res * Math.PI; } public void homogen2 ( ) { if ( isLog() ) { showLog ( ); } int h = ld.getHeight( ); int b = ld.getBottom( ); res = b * h / 2; } SIGSS研究会 public void heterogen2 ( ) { double res; LineData ld = input ( ); Id.hoge(); boolean c = ld.check( ); if ( c ) { int r = ld.getRadius( ); res = Math.pow ( r,2 ); res = res * Math.PI; output ( res ); } } 2015/10/1 Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 8 メソッド呼び出しパターン ソースコードに頻繁に出現する構造のよく似た メソッド呼び出し列 特定の機能を実現する定型的なコード 特定の制御構造を含む 以下の情報を含んでいる 実現したい処理に必要なメソッド呼び出し群 関連のあるメソッドの呼び出し順 メソッドの引数や返り値の扱い方 SIGSS研究会 2015/10/1 Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 9 メソッド呼び出しパターンの例 Public void circle ( ) { Public void triangle ( ) { 辺の長さを double res; double res; 読み込む LineData ld = input ( ); LineData ld = input ( ); boolean c = ld.check( ); boolean c = ld.check( ); 長さの例外 if ( c ) { チェック int h = ld.getHeight( ); int r = ld.getRadius( ); int b = ld.hetBottom( ); 求めた面積 res = Math.pow ( r,2 ); if ( c ) { を出力 res = res * Math.PI; res = b * h / 2; output ( res ); output ( res ); } メソッド呼び出しパターン } } } input( ) LineData.check( ); if output; } SIGSS研究会 2015/10/1 Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 10 本研究の目的 横断的関心事の検出 メソッド呼び出しパターンの抽出を応用 均一性横断的関心事と非均一性横断的関心事の両方を検 出 検出による効果 保守性・再利用性・拡張性などの向上 横断的関心事のアスペクト化 横断的関心事の出現位置の管理 SIGSS研究会 2015/10/1 Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 11 提案する検出手法 横断的関心事 メソッド呼び出しパターン 特定の関心事に関するコード ≒ が複数個所に分散 同種の機能を実現する コードが複数個所に出現 ≒ メソッド呼び出しパターン抽出手法を横断的関心 事の検出に応用 横断的関心事に関連したメソッド呼び出しパターンが存 在する SIGSS研究会 2015/10/1 Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 12 メソッド呼び出しパターン抽出 既存の手法を採用[1] 特徴シーケンスの生成 Sequential pattern mining PrefixSpanアルゴリズムを採用 Javaで書かれたプログラムを対象としたツール を実装 [1] 中山崇,松下誠,井上克郎, ”ソースコードの差分を用いた関数呼び出しパターン抽 出法の提 案”,情報処理学会研究報告,Vol.2006,No.35,2006-SE-151,pp.49–56,2006 SIGSS研究会 2015/10/1 Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 13 特徴シーケンスの生成 ソースコードの特徴 メソッド呼び出し 条件文の開始・終了要素 繰り返し文の開始・終了要素 特徴シーケンス 抽出されたコードの特徴を要素とするシーケンス 各メソッドごとに抽出 class Sample { A a; int i, k; void method1 (int arg ) { foo(); i = a.hoge(); if( i == 0 ) { k = arg; a.bar(); } } ソースコードの特徴 Sample.method1()の 特徴シーケンス Sample.foo() A.hoge() if A.bar() } void foo ( ) {・・・} } SIGSS研究会 2015/10/1 Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 14 Sequential pattern mining(PrefixSpan) 特徴シーケンスに対し射影と呼ばれる操作を繰 り返し行なうことでシーケンシャルパターンを抽 出する 射影とは,全てのシーケンスに対して特定の要素 からの接尾辞を取り出す操作 要素aによる射影 acd cd abc bc 要素aの 接尾辞 cba aab ab SIGSS研究会 2015/10/1 Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 15 PrefixSpanの例 最低出現回数2、最小要素数1 ab,ac,を パターンとして出力 a,b,c,を パターンとして出力 1. a c d 2. a b c 3. c b a 4. a a b a:4 b:3 c:3 d:1 各要素の 出現回数 1. c d 2. b c 4. a b a:1 b:2 c:2 d:1 2. c 3. a a:1 c:1 1. d 1. b a a:1 b:1 d:1 射影 SIGSS研究会 2. c c:1 1. d d:1 結果 a :4 ab:2 ac:2 b :3 c :3 2015/10/1 Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 16 メソッド呼び出しの識別 Super メソッドを宣言しているクラ スを区別する Sample() 継承元が同じであるメソッド Sub1 Sub2 は同一のメソッドとみなす Sample() Sample() 同一の特徴 メソッドを呼び出しているク ラスを区別しない メソッド名のみを識別 A B C Sample() Sample() Sample() 同一の特徴 SIGSS研究会 2015/10/1 Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 17 ツールのスクリーンショット クラス階層ツリーにおける 選択したパターンの 分散状況 抽出されたパ ターンの設定 抽出された パターンの 情報 ソースコード における 選択したパターン の分布状況 SIGSS研究会 2015/10/1 Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 18 実験概要 実験対象 JHotDraw(図形描画アプリケーション) 総行数 : 約18000行、総メソッド数 : 約2900 抽出したパターン 出現回数 : 4回以上 パターンの要素数 : 4以上 メソッド呼び出しの識別方法 メソッドを宣言しているクラスを区別 メソッドを宣言しているクラスを無視 評価方法 抽出したパターンが横断的関心事と関連しているかどうかを評価 他の文献でアスペクト化すべきであるとされている横断的関心事を参考に評価 評価基準 パターンの出現回数 パターンが出現するクラス数 特定のキーワードの出現頻度 パターンの要素であるメソッド呼び出しの名前 パターンが出現するメソッドの名前 SIGSS研究会 2015/10/1 Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 19 抽出結果 メソッドを宣言しているクラスの違いを識別した場合 抽出されたパターン数 : 38種類 横断的関心事に関連しているもの : 22種類 横断的関心事に関連していないもの : 16種類 パターンが関連する関心事 出現回数 出現するクラス数 横断的関心事 ループ処理のイディオム 54 31 × コマンドの取り消し 14 14 ○ コマンド取消用の情報保存 12 12 ○ 図形の選択解除 10 10 ○ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ ポリゴン処理 6 1 × メソッドを宣言しているクラスの違いを無視した場合 抽出されたパターン数 : 55種類 SIGSS研究会 2015/10/1 Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 20 抽出されたメソッド呼び出しパターンの例 (横断的関心事に関連しているパターン1) 呼び出されているメソッドの名前に特定のキーワードが多数出現 実行コマンド取消用の情報を 保存するためのパターン AbstractCommand.setUndoActivity() AbstractCommand.getUndoActivity() Undoable.setAffectedFigures() AbstractCommand.getUndoActivity() Undoable.getAffectedFigures() SIGSS研究会 キーワードUndo が多数出現 2015/10/1 Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 21 抽出されたメソッド呼び出しパターンの例 (横断的関心事に関連しているパターン2) パターンが出現するメソッドの名前に特定のキーワードが多数出現 マウス操作に関連する パターン MouseEvent.getX() MouseEvent.getY() MouseEvent.getX() MouseEvent.getY() 抽出 抽出 抽出 class ConnectionTool{ ・・・・・・・・・・・・ public void mouseUp{ ・・・・・・・・・ } } class PolygonTool{ ・・・・・・・・・・・・ public void mouseDown{ ・・・・・・・・ } } キーワードmouse が多数出現 class DrawingViewMouseListener{ ・・・・・・・・・・・・ public void mousePressed{ ・・・・・・・・ } } SIGSS研究会 2015/10/1 Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 22 抽出されたメソッド呼び出しパターンの例 (アプリケーションの機能に関連していないパターン) org.jhotdraw.standard.StandardDrawingView public void addAll(Collection figures) { FigureEnumeration fe = new FigureEnumerator(figures); while (fe.hasNextFigure()) { add(fe.nextFigure()); } } 集合がまだ要素を 持っているかどうか チェック メソッド呼び出しパターン (出現回数59) org.jhotdraw.standard.CompositeFigure public FigureEnumeration figures(Rectangle viewRectangle) { if (_theQuadTree != null) { FigureEnumeration fe = _theQuadTree.getAllWithin(new Bounds(viewRectangle( List l2 = CollectionsFactory.current().createList(); while (fe.hasNextFigure()) { Figure f = fe.nextFigure(); //int z = fFigures.indexOf(f); l2.add(new OrderedFigureElement(f, f.getZValue())); } ・ } 集合の 次の要素を取得 FigureEnumeration.hasNextFigure() while FigureEnumeration.nextFigure() } 繰り返しの制御に 関連するパターン (横断的関心事というよりは イディオム) SIGSS研究会 2015/10/1 Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 23 特定のクラス階層に出現するパターン 一部のサブクラスのみに出現するパターン 横断的関心事を管理する新たなクラス階層の提案 パターンが出現しないサブクラスは横断的関心事の実装し 忘れの可能性 AbstractCommand Group Group UnGroup AbstractUndoable UnGroup SelectAll SelectAll Zoom Zoom Redo Align Redo Align パターンが出現するサブクラス パターンが出現しないサブクラス SIGSS研究会 2015/10/1 Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 24 クラスを区別せずに抽出したパターンの例 org.jhotdraw.figures.BorderTool org.jhotdraw.standard. DuplicateCommand public void execute() { super.execute(); setUndoActivity(createUndoActivity()); FigureSelection selection = view().getFigureSele・・・ public void action(Figure figure) { // Figure replaceFigure = drawing().replace(figur ・・ setUndoActivity(createUndoActivity()); List l = CollectionsFactory.current().createList(); l.add(figure); l.add(new BorderDecorator(figure)); getUndoActivity().setAffectedFigures(new Fig ・・ ((BorderTool.UndoActivity)getUndoActivity()).repl ・・ // create duplicate figure(s) FigureEnumeration figures = (FigureEnumeration) ・・ getUndoActivity().setAffectedFigures(figures); view().clearSelection(); ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ } AbstractTool のサブクラス } AbstractCommand のサブクラス org.jhotdraw. standard.ResizeHandle setUndoActivity() createUndoActivity() getUndoActivityI() setAffectedFigures() public void invokeStart(int x, int y, DrawingView view) { setUndoActivity(createUndoActivity(view)); getUndoActivity().setAffectedFigures(new Sing ・・ ((ResizeHandle.UndoActivity)getUndoActivity()).se・・・ } AbstractHandle のサブクラス SIGSS研究会 2015/10/1 Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 25 クラスを区別せずに抽出したパターン Abstract Command 11サブクラスに存在 Abstract Handle 6サブクラスに存在 Abstract Tool 9サブクラスに存在 AbstractCommand .setUndoActivity() AbstractHandle .setUndoActivity() AbstractTool .setUndoActivity() EachSubClass .createUndoActivity() EachSubClass .createUndoActivity() EachSubClass .createUndoActivity() AbstractCommand .getUndoActivityI() AbstractHandle クラスを識別しない場合の .getUndoActivityI() パターン AbstractTool .getUndoActivityI() Undoable .setAffectedFigures() Undoable setUndoActivity() .setAffectedFigures() createUndoActivity() getUndoActivityI() setAffectedFigures() SIGSS研究会 Undoable .setAffectedFigures() 2015/10/1 Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 26 考察 特定の関心事に関連しているパターンには関心事の 内容を示すキーワードの出現頻度が高い 特定のクラス階層内のみに出現するパターンが存在 横断的関心事の実装し忘れのチェックに使用可能 一部のサブクラスのみに出現する場合、新たなクラス階層を 提案 メソッドを宣言しているクラスを識別しないほうがより広 範囲から抽出可能 横断的関心事に関連したメソッドには宣言が横断的なものも ある 他の手法にも応用可能 SIGSS研究会 2015/10/1 Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 27 関連研究 アスペクトマイニング オブジェクト指向プログラムからアスペクトの候補と なる部分を抽出 均一性横断的関心事が主な抽出対象 既存手法 コードクローンをベースに抽出 モジュールを横断するコードクローンをアスペクト化 Fan-Inの大きいものを抽出 呼び出されている場所の数が多いメソッドは横断的である可能 性が高い grepを用いた検索 横断的関心事に関連したキーワードで検索 SIGSS研究会 2015/10/1 Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 28 関連研究との比較 コードクローンをベースにまとめる手法 Fan-Inを利用した手法 コード記述が一致していないと検出できない メソッドが個別に抽出されるので他のメソッドとの関連がわからない メソッド呼び出しパターンを利用した手法 コード記述の違いをある程度吸収できる 関連するメソッドをまとめて抽出することができ、その呼び出し順序もわ かる ⇒AOPの目的は同一のコード記述を一箇所にまとめることではなく、同一の関 心事を一箇所にまとめることであるので、コード記述の違いはある程度吸収 できたほうが良い SIGSS研究会 2015/10/1 Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 29 既存手法との比較(抽出例) 同一のメソッド呼び出しパターンを持つコード org.jhotdraw.standard.CutCommand public void execute() { super.execute(); setUndoActivity(createUndoActivity()); FigureEnumeration fe = view().selection(); List affected = CollectionsFactory.current().createL・・・ Figure f; FigureEnumeration dfe; while (fe.hasNextFigure()) { f = fe.nextFigure(); affected.add(0, f); dfe = f.getDependendFigures(); ・・・・・・・・・・・・・・・・・・・・・ } fe = new FigureEnumerator(affected); getUndoActivity().setAffectedFigures(fe); UndoActivity ua = (UndoActivity) getUndoActivity(); ua.setSelectedFigures(view().selection()); copyFigures(ua.getSelectedFigures(), ua.getSele・・・・ deleteFigures(getUndoActivity().getAffectedFigures()); view().checkDamage(); } コードクローンベースの手法で抽出できるコード org.jhotdraw.fiures.GroupCommand public void execute() { super.execute(); setUndoActivity(createUndoActivity()); getUndoActivity().setAffectedFigures(view().selection()); ((GroupCommand.UndoActivity)getUndoActivity()).group・・・ view().checkDamage(); } org.jhotdraw.standard.AlignCommand public void execute() { super.execute(); setUndoActivity(createUndoActivity()); getUndoActivity().setAffectedFigures(view().selection()); ((AlignCommand.UndoActivity)getUndoActivity()).alignA・・・ view().checkDamage(); } SIGSS研究会 2015/10/1 Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 30 まとめと今後の課題 メソッド呼び出しパターン抽出手法を用いて横断的関 心事の検出 横断的関心事には特定のパターンを持つものが存在 コードの違いをある程度吸収できるため非均一性横断的関 心事の一部も抽出可能 今後の課題 実験対象の拡大 本研究で得られた実験結果はJHotDraw特有の特徴から得られた 結果である可能性がある 均一性横断的関心事と非均一性横断的関心事の識別 均一性横断的関心事はアスペクト候補として表示 非均一性横断的関心事は出現箇所を管理すべきコード片として表 示 SIGSS研究会 2015/10/1 Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 31
© Copyright 2024 ExpyDoc