NAIST-IS-MT0851116 修士論文 デザインパターン検出能力の向上を目的とした 複数検出手法の併用 水野 恵祐 2010 年 2 月 4 日 奈良先端科学技術大学院大学 情報科学研究科 情報システム学専攻 本論文は奈良先端科学技術大学院大学情報科学研究科に 修士 (工学) 授与の要件として提出した修士論文である。 水野 恵祐 審査委員: 飯田 元 教授 (主指導教員) 松本 健一 教授 (副指導教員) 安本 慶一 准教授 (副指導教員) 川口 真司 助教 デザインパターン検出能力の向上を目的とした 複数検出手法の併用∗ 水野 恵祐 内容梗概 デザインパターンとは,ソフトウェアの設計時によく起こる問題に対する典型 的な解決策をまとめたものである.ソフトウェアに適用されているデザインパター ンを検出することは,ソフトウェアの構造に関する理解を深めることにつながる. そのため,これまでに数多くのデザインパターン検出手法が提案されている.こ れらの検出手法は,検出可能なデザインパターンの種類や検出箇所が異なってい る.この違いはそれぞれの検出手法の検出アプローチの違いによるものであり, それぞれの検出手法にはデザインパターン検出の適性に差があると考えられる. 本研究では,複数の検出手法を適切に併用することで,個々の検出手法の適性 を補い合い,デザインパターン検出能力を向上させることができると考えた.現 在,いくつかのデザインパターン検出手法をツールとして実装したものが Web 上 で公開されている.本研究では,これらのツールの検出結果を組み合わせること で複数検出手法の併用を実現した.複数検出手法を併用することの妥当性を検証 した上で,複数の併用アルゴリズムの性能評価を行った.その結果,和集合によ る併用が効果的であるという知見が得られた. キーワード ソフトウェア工学,デザインパターン,ソフトウェア理解,デザインパターン検 出,併用アルゴリズム ∗ 奈良先端科学技術大学院大学 情報科学研究科 情報システム学専攻 修士論文, NAIST-ISMT0851116, 2010 年 2 月 4 日. i Hybridization of Design Pattern Detection Techniques for Improving Detection Ability∗ Keisuke Mizuno Abstract Design patterns are typical solutions to frequently occurring problems in objectoriented software design. Detection of design patterns applied in software may help understand software architecture. Therefore, many design pattern detection techniques have been proposed. These detection techniques detect different kinds of design patterns, and their results are generally different. This is because they detect design patterns in different ways, and have different ability of the design pattern detection. We assume that we can detect more precisely by hybridization of some design pattern detection techniques. Some detection techniques are implemented as a tool and released on the Web. We combine the detection results of these tools to achieve hybridization of design pattern detection techniques. In this paper, we validate whether hybridization improves detection ability and evaluate performance of some hybrid algorithms. Keywords: Software Engineering, Design Pattern, Program Comprehension, Design Pattern Detection, Hybrid Algorithm ∗ Master’s Thesis, Department of Information Systems, Graduate School of Information Science, Nara Institute of Science and Technology, NAIST-IS-MT0851116, February 4, 2010. ii 目次 1. はじめに 1 2. デザインパターン 3 2.1 デザインパターンの概要 . . . . . . . . . . . . . . . . . . . . . . . 3 2.2 デザインパターン検出 . . . . . . . . . . . . . . . . . . . . . . . . 5 3. デザインパターン検出手法 6 3.1 Pat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 3.2 HEDGEHOG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 3.3 PTIDEJ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 3.4 SPOOL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 3.5 FUJABA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 3.6 CrocoPat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 3.7 SPQR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 3.8 Columbus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 3.9 DPVK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 3.10 DPRE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 3.11 PRAssistor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 3.12 DPdT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 3.13 PINOT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 3.14 DP-Miner . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 3.15 WOP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 3.16 Web 上で公開されているデザインパターン検出ツール . . . . . . . 29 4. 提案手法 32 4.1 複数検出手法の併用によるデザインパターン検出 . . . . . . . . . 32 4.2 検出範囲の統一 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 4.3 併用アルゴリズム . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 和集合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 4.3.1 iii 4.3.2 多数決 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 4.3.3 適性値付き和集合 . . . . . . . . . . . . . . . . . . . . . . . 35 5. 実験 37 5.1 妥当性の検証 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 5.1.1 妥当性を検証する仮説 . . . . . . . . . . . . . . . . . . . . 37 5.1.2 実験対象 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 5.1.3 実験 1: 検出されるデザインパターンの確認 . . . . . . . . 39 5.1.4 実験 2: 検出手法の組み合わせによる精度の確認 . . . . . . 41 5.2 併用アルゴリズムの比較評価 . . . . . . . . . . . . . . . . . . . . 42 5.2.1 実験対象 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 5.2.2 実験方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 5.2.3 実験結果 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 6. 考察 46 6.1 併用アルゴリズムの性能 . . . . . . . . . . . . . . . . . . . . . . . 46 6.2 検出範囲 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 6.3 実験結果の妥当性 . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 7. 関連研究 48 7.1 デザインパターン検出手法の比較評価 . . . . . . . . . . . . . . . 48 7.2 デザインパターン検出手法の精度改善 . . . . . . . . . . . . . . . 48 . . . . . . . . . . . . . . . . . . . . 49 7.3 デザインパターンの影響分析 8. まとめ 50 謝辞 51 参考文献 52 付録 57 A. デザインパターン検出ツールの検出範囲 57 iv B. デザインパターン検出ツールの検出件数 57 C. デザインパターン検出ツール間の検出箇所の一致件数 57 D. デザインパターン検出ツールおよび和集合による併用結果の検出精度 60 E. 併用アルゴリズムの検出精度 60 v 図目次 1 Pat の検出プロセス [27] . . . . . . . . . . . . . . . . . . . . . . . . 9 2 Adapter パターンの構造 [27] . . . . . . . . . . . . . . . . . . . . . 9 3 Adapter パターンの Prolog ルール [27] . . . . . . . . . . . . . . . . 9 4 デザインパターンのメタモデル [1] . . . . . . . . . . . . . . . . . . 11 5 変形した Composite パターンの訂正例 [1] . . . . . . . . . . . . . . 12 6 SPOOL のアーキテクチャ[25] . . . . . . . . . . . . . . . . . . . . 13 7 SPOOL で扱う情報 [25] . . . . . . . . . . . . . . . . . . . . . . . . 14 8 Composite パターンの定義 [29] . . . . . . . . . . . . . . . . . . . . 15 9 SPQR の検出プロセス [36] . . . . . . . . . . . . . . . . . . . . . . 17 10 RedirectInFamily パターンの構造 [36] . . . . . . . . . . . . . . . . 18 11 RedirectInFamily の σ-calculus 表現 [36] . . . . . . . . . . . . . . . 18 12 DPVK の検出プロセス [38] . . . . . . . . . . . . . . . . . . . . . . 19 13 REQL スクリプトによる Command パターンの静的な定義 [38] . . 20 14 Command パターンの動的な定義 [38] . . . . . . . . . . . . . . . . 20 15 DPRE の検出プロセス [5] . . . . . . . . . . . . . . . . . . . . . . 21 16 Adapter パターンにおけるクラス間の関係 [5] . . . . . . . . . . . . 21 17 ビジュアル言語における Adapter パターンの定義 [5] . . . . . . . . 21 18 Visitor パターンの構造 [19] . . . . . . . . . . . . . . . . . . . . . . 22 19 Visitor パターンの Prolog ルール [19] . . . . . . . . . . . . . . . . 22 20 PRAssistor のアーキテクチャ[19] . . . . . . . . . . . . . . . . . . 23 21 Decaorator パターンの構造 [40] . . . . . . . . . . . . . . . . . . . 24 22 ビジュアル言語における Adapter パターンの定義 [40] . . . . . . . 24 23 GoF のデザインパターンの再分類 [35] . . . . . . . . . . . . . . . . 26 24 DP-Miner のアーキテクチャ[9] . . . . . . . . . . . . . . . . . . . . 26 25 Adapter パターン [9] . . . . . . . . . . . . . . . . . . . . . . . . . 27 26 DPdT のスクリーンショット . . . . . . . . . . . . . . . . . . . . . 30 27 DPRE のスクリーンショット . . . . . . . . . . . . . . . . . . . . . 30 28 PINOT のスクリーンショット . . . . . . . . . . . . . . . . . . . . 31 vi 29 WOP のスクリーンショット . . . . . . . . . . . . . . . . . . . . . 31 30 提案手法の流れ . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 表目次 1 GoF の 23 種類のデザインパターン . . . . . . . . . . . . . . . . . 4 2 検出ツールが検出可能なデザインパターンの種類 . . . . . . . . . 7 3 検出ツールが着目するデザインパターンの特徴 . . . . . . . . . . . 8 4 変形したデザインパターンに対する検出手法の対応方法 . . . . . . 8 5 構造要素の素数表現 [9] . . . . . . . . . . . . . . . . . . . . . . . . 27 6 Adapter パターンのマトリクス [9] . . . . . . . . . . . . . . . . . . 27 7 既存のデザインパターン検出ツール . . . . . . . . . . . . . . . . . 29 8 統一した検出範囲 . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 9 各検出ツールの合計検出件数 . . . . . . . . . . . . . . . . . . . . 40 10 検出ツール間の検出箇所の合計一致件数 . . . . . . . . . . . . . . 40 11 各プロジェクトにおける検出ツールごとの検出精度のまとめ . . . 43 12 各プロジェクトにおける併用アルゴリズムの検出精度のまとめ . . 45 13 DPdT のデザインパターンごとの検出範囲 . . . . . . . . . . . . . 58 14 DPRE のデザインパターンごとの検出範囲 . . . . . . . . . . . . . 58 15 PINOT のデザインパターンごとの検出範囲 . . . . . . . . . . . . 59 16 WOP のデザインパターンごとの検出範囲 . . . . . . . . . . . . . 61 17 JHotDraw 6.0 beta 1 における各検出ツールの検出件数 . . . . . . 62 18 JHotDraw 5.1 における各検出ツールの検出件数 . . . . . . . . . . 63 19 JRefactory における各検出ツールの検出件数 . . . . . . . . . . . . 64 20 Lexi における各検出ツールの検出件数 . . . . . . . . . . . . . . . 65 21 JHotDraw 6.0 beta 1 における検出箇所の一致件数 . . . . . . . . 66 22 JHotDraw 5.1 における検出箇所の一致件数 . . . . . . . . . . . . 67 23 JRefactory における検出箇所の一致件数 . . . . . . . . . . . . . . 68 24 Lexi における検出箇所の一致件数 . . . . . . . . . . . . . . . . . . 69 vii 25 JHotDraw 6.0 beta 1 の Strategy パターンに関する検出ツールご との検出精度 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 26 JHotDraw 5.1 における検出ツールごとの検出精度 (1) . . . . . . . 70 27 JHotDraw 5.1 における検出ツールごとの検出精度 (2) . . . . . . . 71 28 JRefactory における検出ツールごとの検出精度 . . . . . . . . . . 72 29 Lexi における検出ツールごとの検出精度 . . . . . . . . . . . . . . 73 30 JHotDraw 6.0 beta 1 の Strategy パターンに関する併用アルゴリ ズムの検出精度 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 31 JHotDraw 5.1 における併用アルゴリズムの検出精度 (1) . . . . . 74 32 JHotDraw 5.1 における併用アルゴリズムの検出精度 (2) . . . . . 75 33 JRefactory における併用アルゴリズムの検出精度 . . . . . . . . . 76 34 Lexi における併用アルゴリズムの検出精度 . . . . . . . . . . . . . 77 viii 1. はじめに デザインパターン [17] は,ソフトウェアの設計上の問題に対するベストプラク ティスをまとめたものである.デザインパターンを利用することで,過去の成功 例を再利用することが容易となり,ソフトウェア設計を効率的に行うことができ る.また,デザインパターンは開発者同士の共通語彙としても利用することがで き,ソフトウェアの設計に際して,互いの意思疎通を円滑にする働きもある.こ のようなことから,デザインパターンを利用することでソフトウェアの品質向上 が見込める [17, 42] ため,デザインパターンは多くのソフトウェア開発プロジェ クトで利用されている. デザインパターンはソフトウェア理解においても重要な役割を果たしている [29, 40].デザインパターンに含まれる要素(クラス,オブジェクトなど)には 各々の役割が規定されているため,ソフトウェアに適用されているデザインパター ンを理解することで,要素間の関係や設計段階で想定されていた拡張性などにつ いて知ることができるからである.このように,既存のソフトウェアに適用され ているデザインパターンを検出することで,開発者はソフトウェアの構造に関す る理解を深めることができ,ソフトウェアの保守が容易になる. そのため,ソフトウェア理解の支援を目的として,既存のソフトウェアからデ ザインパターンを検出するための手法がこれまでに数多く提案されている.こう した検出手法の多くは Gang of Four(GoF) のデザインパターン [17] を検出対象と しているが,GoF の 23 種類のデザインパターン全てを検出できるわけではなく, 検出手法ごとに検出可能なデザインパターンの種類が異なっている.また,同じ 種類のデザインパターンについても,検出箇所(デザインパターンが適用されて いると検出された箇所)は,検出手法間で異なっている場合が多い. こうした検出対象および検出箇所の違いは,それぞれの検出手法によって検出 アプローチ,つまりデザインパターンの定義やデータ構造,検出アルゴリズムな どが異なることに起因するものである [10, 5].また,デザインパターンを適用す る場合には,元々定義されていた構造を変形させることもある.このような変形 したデザインパターンに対する検出能力も,検出アプローチに大きく依存する. そのため,同じ種類のデザインパターンであっても,検出手法ごとに検出箇所が 1 異なる場合もある.このように,デザインパターンの表現方法や着目する特徴な どが検出手法によって異なるため,抽出すべき特徴を表現できないために検出で きないデザインパターンや,反対に検出しやすいデザインパターンなどが検出手 法ごとに存在する.つまり,検出手法によってそれぞれのデザインパターンの種 類に対する検出の適性に差があると考えられる. 本研究では,それぞれのデザインパターンの性質や検出アプローチを考慮して, 複数のデザインパターン検出手法を併用することで,個々の検出手法の適性を補 いあうことができるのではないかと考えた.そこで,複数の検出手法を併用する ことでデザインパターンの検出能力を向上させる手法を提案する.現在,いくつ かのデザインパターン検出手法をツールとして実装したものが Web 上で公開さ れている.本研究では,これらのツールの検出結果を組み合わせることで複数検 出手法の併用を実現した.複数検出手法を併用することの妥当性を検証した上で, 複数の併用アルゴリズムの性能評価を行った. 本論文の構成は以下の通りである.2 章では,デザインパターンについて概説 する.3 章では,デザインパターン検出ツールを紹介する.4 章では,本研究で提 案する複数検出手法の併用によるデザインパターン検出について説明する.5 章 では,2 つの実験について報告する.6 章では,実験より得られた知見に関する 考察を述べる.7 章では,既存のデザインパターン検出手法の比較評価,デザイ ンパターン検出手法の精度改善,デザインパターンの影響分析に関する研究など について紹介する.最後に,8 章でまとめと今後の課題について述べる. 2 2. デザインパターン 2.1 デザインパターンの概要 近年のソフトウェア開発プロジェクトでは,オブジェクト指向開発が一般的と なっている.オブジェクト指向開発とは,ソフトウェアの構造をオブジェクト群 の相互作用の関係と捉えて定義していく開発方法論である.オブジェクト指向開 発の利点として,既存のソフトウェアの一部を部品化することによる,再利用性 の向上が挙げられる.既存のソフトウェア部品を再利用することによって,効率 的にソフトウェアの品質を向上させることができる. しかし,再利用性の高いソフトウェアを設計することは容易ではない.オブジェ クト指向開発における良い設計とは,現在直面している問題を解決すると同時に, 将来起こり得る問題や要求にも対応できるものでなければならない.また,ソフ トウェア開発においては熟練した開発者と初心者の生産性に大きな差があるが, これは経験の差によるものが大きいと一般的に言われている.設計において,熟 練した開発者は自身の経験に基づいたベストプラクティスを繰り返し再利用して いる.このような再利用の結果として,オブジェクト指向開発において繰り返し 用いられるある種のパターンが生まれることになった.これらのパターンのこと をデザインパターンという. デザインパターンは,オブジェクト指向開発において重要でかつ繰り返し発生 する設計を,それぞれ体系的に名前付けし,説明を加え,評価したものである. 最も有名なデザインパターンとしては, Gamma らが提唱した GoF (the Gang of Four) のデザインパターン [17] が挙げられる.Gamma らは 23 種類のデザイ ンパターンを文書化してカタログの形でまとめており,一般的にこの 23 種類の デザインパターンを GoF のデザインパターンと総称している.表 1 に GoF の 23 種類のデザインパターンの一覧を示す. Gamma らは,23 種類のデザインパターンを 2 つの基準で分類している.1 つ 目の基準は目的で,デザインパターンが何を扱うかを示す.デザインパターンは, 生成,構造,振舞いのうちいずれかの目的を持つ.生成に関するパターンはオブ ジェクト生成のプロセスを扱う.構造に関するパターンはクラスまたはオブジェ 3 表 1 GoF の 23 種類のデザインパターン 目的 範囲 クラス 生成 構造 振舞い Factory Method Adapter Interpreter Template Method オブジェクト Abstract Factory Adapter Chain of Responsibility Builder Bridge Command Prototype Composite Iterator Singleton Decorator Mediator Facade Memento Flyweight Observer Proxy State Strategy Visitor クトの構成を扱う.このクラスとはオブジェクトの雛型を定義したものであり, オブジェクトとは処理の実体を指す.振舞いに関するパターンはクラスまたはオ ブジェクトの相互作用の方法を特徴づけ,責任を分担する.2 つ目の基準は範囲 で,デザインパターンがクラスとオブジェクトのどちらに主に適用されるかを示 す.クラスパターンはクラスとサブクラス間の,オブジェクトパターンはオブジェ クト間の関連をそれぞれ扱う.Adapter パターンは,クラスパターンとオブジェ クトパターンの両方に属す. デザインパターンは,ソフトウェアの設計上の問題に対するベストプラクティ スをまとめたものである.つまり,デザインパターンを利用することで,過去の 成功例を再利用することが容易となり,ソフトウェア設計を効率的に行うことが できる.また,デザインパターンは開発者同士の共通語彙としても利用すること ができ,ソフトウェアの設計に際して,互いの意思疎通を円滑にする働きもある. デザインパターンを習得している開発者同士であれば,パターン名で設計の概 要の合意をとることが可能であるためである.このようなことから,デザインパ 4 ターンを利用することでソフトウェアの品質向上が見込める [17, 42] ため,デザ インパターンは多くのソフトウェア開発プロジェクトで利用されている. 2.2 デザインパターン検出 デザインパターンはソフトウェア理解においても重要な役割を果たしている [29, 40].デザインパターンに含まれる要素(クラス,オブジェクトなど)には 各々の役割が規定されているため,ソフトウェアに適用されているデザインパター ンを理解することで,要素間の関係や設計段階で想定されていた拡張性などにつ いて知ることができるからである.デザインパターンに含まれる各要素の役割の ことをロールという.このように,既存のソフトウェアに適用されているデザイ ンパターンを検出することで,開発者はソフトウェアの構造に関する理解を深め ることができ,ソフトウェアの保守が容易になる. そのため,ソフトウェア理解の支援を目的として,既存のソフトウェアからデ ザインパターンを検出するための手法がこれまでに数多く提案されている.こう した検出手法の多くは Gang of Four(GoF) のデザインパターン [17] を検出対象と しているが,GoF の 23 種類のデザインパターン全てを検出できるわけではなく, 検出手法ごとに検出可能なデザインパターンの種類が異なっている.また,同じ 種類のデザインパターンについても,検出箇所(デザインパターンが適用されて いると検出された箇所)は,検出手法間で異なっている場合が多い.これらの検 出手法については 3 章で紹介する. 5 3. デザインパターン検出手法 これまでに数多くのデザインパターン検出手法が提案されている.本章では, こうした検出手法のうち,ツールとして実装されているものを紹介する.表 2 に, それぞれの検出ツールが検出可能なデザインパターンの種類を示す.この中で, DPdT は Adapter パターンと Command パターンを区別せずに (Object)AdapterCommand パターンとして検出する.また,State パターンと Strategy パターン についても State-Strategy パターンとしてそれらを区別せずに検出する.なお, SPQR は検出可能なデザインパターンの種類が不明であるため,記載を省略して いる. また,それぞれの検出手法は検出アプローチ,つまりデザインパターンの定義 やデータ構造,検出アルゴリズムなどが異なっている [10, 5].表 3 にそれぞれの 検出手法が着目するデザインパターンの特徴を示す.ここでは,デザインパター ンの特徴を大きく 4 つに分類している. • 構造 : 主にクラス図から得られるレベルの情報 (継承,関連,集約など) • 静的な振舞い : 主にソースコード解析から得られるレベルの情報 (メソッド の呼び出し関係,委譲関係) • 動的な振舞い : 主に実行時解析から得られるレベルの情報 (イベント列,操 作の開始/終了,オブジェクトの割当て/解放) • セマンティクス : その他の特別な特徴 (変数値,命名規則) デザインパターンを実際のソフトウェアに適用する場合には,元々カタログで定 義されていた構造を変形させることもある.このような変形したデザインパター ンに対する検出能力も,検出アプローチに大きく依存する.表 4 に,変形したデ ザインパターンに対するそれぞれの検出手法の対応方法を示す.ここでは,対応 方法を大きく 4 つに分類している. • 未対応 : 変形したデザインパターンへの対応を特にしていない. 6 表 2 検出ツールが検出可能なデザインパターンの種類 ツール名 PRAssistor 検出可能なデザインパターンの種類 Factory Method, Abstract Factory, Builder, Singleton, Adapter, Bridge, Composite, Decorator, Flyweight, Proxy, Interpreter, Chain of Responsibility, Iterator, Mediator, Observer, Strategy, Visitor DPdT Factory Method, Prototype, Singleton, Composite, Decorator, Proxy, Template Method, Observer, Visitor, (Object)Adapter-Command, State-Strategy DP-Miner Adapter, Bridge, Composite, Strategy PINOT Factory Method, Abstract Factory, Builder, Singleton, Adapter, Bridge, Composite, Decorator, Facade, Flyweight, Proxy, Template Method, Chain of Responsibility, Mediator, Mediator, Observer, State, Strategy, Visitor DPRE Adapter, Bridge, Composite, Decorator, Facade, Proxy, WOP Abstract Factory, Builder, Singleton, Adapter, Bridge, Composite, Proxy, Template Method PTIDEJ Factory Method, Composite, Facade, Proxy, Chain of Responsibility, Memento, Observer, Visitor FUJABA Bridge, Composite, Strategy CrocoPat Composite HEDGEHOG Factory Method, Singleton, Bridge, Proxy, Command Columbus Adapter, Strategy DPVK Factory Method, Abstract Factory, Builder, Adapter, Bridge, Composite, Decorator, Flyweight, Proxy, Interpreter, Command, Iterator, Mediator, Memento, Observer, State, Strategy, Visitor Pat Adapter, Bridge, Composite, Decorator, Proxy SPOOL Factory Method, Bridge, Template Method 7 表 3 検出ツールが着目するデザインパターンの特徴 構造 PRAssistor, DPdT, DP-Miner, PINOT, DPRE, WOP, PTIDEJ, FUJABA, CrocoPat, HEDGEHOG, Columbus, DPVK, Pat, SPQR, SPOOL 静的な振舞い PRAssistor, DP-Miner, PINOT, DPRE, FUJABA, HEDGEHOG, DPVK, SPOOL 動的な振舞い PRAssitor セマンティクス DP-Miner, WOP, HEDGEHOG 表 4 変形したデザインパターンに対する検出手法の対応方法 未対応 PRAssistor, DP-Miner, PINOT, DPRE, WOP, CrocoPat, Columbus, DPVK, Pat, SPOOL 個別に定義 FUJABA, SPQR 定義で対応 HEDGEHOG アルゴリズムで対応 DPdT, PTIDEJ • 個別に定義 : 変形したデザインパターンの構造をケースバイケースに定義 する必要がある. • 定義で対応 : あらかじめ変形を考慮してデザインパターンの定義を行う. • アルゴリズムで対応 : あらかじめ変形を考慮して検出アルゴリズムを作成 する. なお,ここで紹介したツールの中で (1)Java プロジェクトを対象とした,(2)Web 上で公開されているものに関しては,3.16 節でより詳細に説明する. 8 図 1 Pat の検出プロセス [27] 図 2 Adapter パターンの構造 [27] 図 3 Adapter パターンの Prolog ルー ル [27] 3.1 Pat Kramer らは,構造に関するパターンを検出する手法を提案している [27].提 案手法では,システムおよびデザンパターンを Prolog で表現し,Prolog エンジ ンを用いて検出処理を行う.提案手法の検出プロセスを図 1 に示す. 提案手法では,C++ヘッダファイルからクラス名,属性名,メソッド名,プロ パティ,および継承や関連,集約といった関係を抽出し,検出処理に用いる.例 えば,図 2 に示す Adapter パターンの Prolog ルールは図 3 のようになる. 上記の提案手法を実装したツールが Pat である. 3.2 HEDGEHOG Blewitt らは,デザインパターンの仕様を形式的に記述する言語を開発し,そ れを用いた検出手法を提案している [3].Blewitt らは,これまでに提案されてき たデザインパターンが形式化されていない理由を以下のように述べている. 9 • デザインパターンの実装は言語ごとに特有である. • 同じ言語であっても,デザインパターンの実装方法は多様である. • オブジェクト指向開発コミュニティにおいて,形式言語記述が一般的では ない. 提案手法では,対象とする言語ごとに各デザインパターンの具体的な仕様を定 義する.対象の言語を Java として提案手法を実装したツールが HEDGEHOG で ある.本ツールは,与えられたクラスセットにデザインパターンインスタンスが 正しく実装されているかを確認する目的で使用する. Blewitt らは,デザインパターンの仕様を定義するために,一階論理によるパ ターン記述言語 SPINE を開発した.SPINE では,デザインパターンの仕様を,ク ラス間またはクラス内のメソッド間の関係に関する制約の集合とみなしている. Blewitt らは,そのような制約を以下のように分類した. • Structural constraints : 継承や多態インタフェースを通して,各クラス が互いにどのように関連しているか. • Static Semantic constraints : 一対一または一対多の関係において,各 クラスが互いにどのように関連しているか.また,それらは必須なのか任 意なのか. • Dynamic Semantic constraints : あるメソッドが動作することで,どの ような結果がもたらされるのか. HEDGEHOG では, Structural constraints と一部の Static Semantic constraints を考慮してデザインパターン検出を行っている. 例えば,Proxy パターンは以下のように定義される. • クラス C はインタフェース I を実装する (Structural constraint). • クラス C は I 型のインスタンス変数 V をもつ (Structural constraint). • V は null でない (Semantic consraint). 10 図 4 デザインパターンのメタモデル [1] • I の各メソッド M について,C.M は V.M を呼び出す (Semantic constraint). ただし,デザインパターンの実装方法は多様であるため,形式化にあたっては そういった多様性を許容できる記述方法が必要となる.例えば,クラス C が Proxy であることを示すためには,C が InterfaceProxy か SubclassProxy を実装してい ることを示せば十分である. 3.3 PTIDEJ Albin-Amiot らは,変形したデザインパターンでも検出でき,さらにリファク タリングまで支援する手法を提案している [1].一般に,デザインパターンはコン テキストに依存しない抽象モデルで表現されている.提案手法では,デザインパ ターンをソースコードで記述する際,抽象モデルからいくつかの関係が欠落する ことを変形とみなす.提案手法におけるデザインパターンのメタモデルの一部を 図 4 に示す. 提案手法では,変形したデザインパターンを検出した場合は両者の差異を計算 し,差異を減少させるための訂正を提案する.変形した Composite パターンに提 案手法を適用した例を図 5 に示す. Albin-Amiot らは,デザインパターンの検出処理をモデリングするために CSP 11 図 5 変形した Composite パターンの訂正例 [1] (Constraint Satisfaction Problem) を開発した.CSP は以下の 3 つのパートで構 成されている. • 変数の集合.与えられたデザインパターンの抽象モデルに含まれる各エン ティティに対応する. • 変数間の制約.与えられたデザインパターンの抽象モデルに含まれる各エ ンティティ間の関係に対応する. • 変数のドメイン.与えられたソースコードのエンティティおよびそれらの 関係に対応する. 例えば,Composite パターンは以下のように定義される. • Composite パターンに関わるエンティティは (Component, Composite, Leaf) である. • 各変数間の制約は次の通りである. – composite < component – leaf < component – composite ⊃ component. 変形したデザインパターンを検出するために,既存の検出手法では,考えられ る変形をデザインパターンの定義として新しく追加していた.しかし,この方法で 12 図 6 SPOOL のアーキテクチャ[25] は新しいデザインパターンの追加や既存のデザインパターンの修正などの際,メ ンテナンスが非常に困難となる.提案手法では,検出アルゴリズムに explanation- based constraint programming[24] を用いることで,変形していると疑わしいデ ザインパターンの候補も検出することができる.そのため,デザインパターンの 変形に対する新たな定義といったメンテナンスは不要となっている. Java プログラムを対象として提案手法を実装したツールが PTIDEJ(Pattern Trace Identification, Detection, and Enhancement for Java) である [33]. 3.4 SPOOL Keller らは,デザインパターンを用いたリバースエンジニアリング環境を提案 している [25].提案手法のアーキテクチャを図 6 に示す. 提案手法では,ソフトウェアの構成要素ごとにデータ型や他の構成要素との関 係のような構造に関する情報を抽出する (図 7 ). C++プログラムを対象として提案手法を実装したツールが SPOOL(Spreading Desirable Properties into the Design of Object-Oriented, Large-Scale Software Systems) である. 13 図 7 SPOOL で扱う情報 [25] 3.5 FUJABA Niere らは,ソフトウェアの規模に対するスケーラビリティ問題を改善する検 出手法を提案している [29].多くのデザインパターンは実装方法が多様であるた め,あらゆる形のデザインパターンを定義および検出することはほぼ不可能であ る.既存の検出手法の多くは,呼出しグラフや命名規則などに着目し,多様性に 影響されない粗い検出を行っているが,大量の False Positive が発生してしまう. 一方,データフローグラフやコントロールフローグラフなどに着目し,詳細な検 出を行う検出手法は,大規模なソフトウェアに適用する際,スケーラビリティの 問題によって検出を失敗する. 提案手法では,デザインパターンを ASG(Abstract Syntax Graph) にアノテー ションを付与する形で表現する.例えば,Composite パターンは図 8 のように定 14 図 8 Composite パターンの定義 [29] 義される. この定義では,同じ 2 クラス間に 1 つの生成と 1 つの関連が存在すること,お よびそれらのクラスの 2 操作間に Delegation パターンが存在することを示してい る.また,これは Leaf クラスを考慮しない場合の Composite パターンを示した ものであり,その他のバリエーションは個別に定義される. 提案手法では,スケーラビリティの問題を解決するために最適な分析アルゴリ ズムを開発した.デザインパターン検出の処理は,与えたルールセットを繰り返 しソースコードに適用することで特徴を発見する演繹分析問題とみなすことがで きる.しかし,純粋な演繹分析アルゴリズムはボトムアップにルールを適用して いくため,スケーラビリティの問題がある.そこで提案手法では,あるコンテキ スト (通常,グラフ中の 1 つのオブジェクト) にのみ与えられたルールを適用する ことで,スケーラビリティの問題を改善している. Java プログラムを対象として提案手法を実装したツールが FUJABA(From UML to Java And Back Again) である [13]. 15 3.6 CrocoPat Beyer らは,ソフトウェアシステムに含まれる様々な関係を容易に問い合わせ ることができる手法を提案している [2].Beyer らは,リバースエンジニアリング における関係問い合わせの応用例として以下のものを挙げている. • オブジェクト指向ソフトウェアの理解およびドキュメント化を目的とした デザインパターン検出. • 設計品質の評価および改善を目的とした問題ある設計パターンの検出. • ソースコードからのシナリオモデルの抽出を目的としたグラフパターンマッ チング. • コードクローン検出およびデザインパターンの帰納推論を目的とした反復 サブグラフの検出. • デッドコード検出および変更影響分析を目的とした呼出しまたは継承のト ラバーサル. • ソフトウェアの理解および修正の支援を目的とした設計-実装間のアーキテ クチャの不一致の検出. • 抽象化レベルの異なる複数のビューの生成. Beyer らは,関係問い合わせのためのデータベース,クエリ言語,データ構造 を開発した.データベースでは,プレーンテキストで関係の読み書きが可能な RSF(Rigi Standard Format) を利用している.RSF は,関係する 2 つのエンティ ティおよびその関係名を記述することで,2 項関係を表現する. クエリ言語では一階述語論理を利用している.例えば,Composite パターンは 以下のように定義される. CompP at(Component, Composite, Leaf ) := IN HERIT (Composite, Component) ∧CON T AIN (Composite, Component) 16 図 9 SPQR の検出プロセス [36] ∧IN HERIT (Leaf, Component) ∧!CON T AIN (Leaf, COmponent); データ構造としては,膨大な関係を効率的に表現できる BDD(Binary Decision Diagram) を利用している. 上記の提案手法を実装したツールが CrocoPat である [4].CrocoPat には入力 として,SNiFF+[39] などを用いてソースコードから生成した RSF ファイルを与 える. 3.7 SPQR Smith らは,σ-calculus を用いた検出手法を提案している [36].提案手法の検出 プロセスを図 9 に示す. σ-calculus はオブジェクト指向言語を形式化した計算モデルであり,提案手法 では,型定義やオブジェクトの型宣言,継承関係などを表現するために用いる. σ-calculus を ρ-calculus を形成するように拡張し,クラスやオブジェクト間の関 係を表現することも可能となっている.また,検出処理では,デザインパターン 17 図 11 RedirectInFamily の σ- 図 10 RedirectInFamily パターンの calculus 表現 [36] 構造 [36] でよく使われる要素をさらにパターン化した EDP(Elemental Design Pattern) を 用いている. 例えば,EDP の一つである RedirectInFamily パターン (図 10) の σ-calculus 表 現は図 11 のようになる. また,考え得るデザインパターンの変形に関しては,あらかじめルールを作成 しておくことで検出することができる.C++プログラムを対象として提案手法を 実装したツールが SPQR(System for Pattern Query and Recognition) である. 3.8 Columbus Ferenc らは,機械学習を用いた検出手法を提案している [12].Columbus は C++ プログラムを ASG で表現して,デザインパターンの構造を検出するリバースエ ンジニアリングツールである.デザインパターンの構造は,XML ベースで開発 した DPML(Design Pattern Markup Language) で記述されており,検出処理は 両グラフの照合によって行われる.しかし,構造にしか着目しないため,State パターンと Strategy パターンのように構造が似たデザインパターンを弁別できな い.そこで Ferenc らは,デザインパターンの構造以外の特徴を学習するシステム を組み込むことで,検出処理の改善を図った. 学習フェーズでは,プログラムの ASG から検出した各候補に相当するソース コードに対して,正誤を手作業で調査する.その正誤表を教師データとして機械 18 図 12 DPVK の検出プロセス [38] 学習アルゴリズムを適用し,あらかじめ決めておいた各デザインパターンの特徴 パラメータを調整する. 検出フェーズでは,学習済みのパラメータを用いて,プログラムの ASG から 得られた候補に対するフィルタリングを行う. 3.9 DPVK Wang らは,Eiffel プログラムにおけるデザインパターン検出手法を提案してい る [38].提案手法のアーキテクチャを図 12 に示す. 提案手法では,デザインパターンの構造を REQL スクリプトで定義している. REQL スクリプトによる構造分析でターゲットを絞ったうえで,振舞いに関する 分析を行う.例えば,Composite パターンの構造の定義は図 13,振舞いの定義は 図 14 のようになる. 提案手法では,構造分析ではクラス間の継承および関連の関係に,振舞い分 析では呼出し関係に着目している.提案手法を実装したツールが DPVK(Design Pattern Veirification toolKit) である. 19 図 14 Command パターンの動的な 図 13 REQL スクリプトによる Com- 定義 [38] mand パターンの静的な定義 [38] 3.10 DPRE Lucia らは,ビジュアル言語解析を利用した検出手法を提案している [5].提案 手法では,まずビジュアル言語解析を行ってターゲットを絞ったうえで,詳細な ソースコード解析を行う.提案手法の検出プロセスを図 15 に示す. ビジュアル言語解析においては,クラス図から得られるようなデザインパター ンの構造に関する情報を扱う.例えば,Adapter パターンの構造に関する情報は 図 16 のように定義され,ビジュアル言語で表現すると図 17 のようになる. ソースコード解析においては,メソッドの宣言や呼出しに関する情報を扱う. 具体的には,クラス間の継承関係や委譲関係を分析する. Java および C++プログラムを対象として提案手法を実装したツールが DPRE (Design Pattern Recovery Environment) である [7]. 3.11 PRAssistor Huang らは,構造および振舞いの解析による検出手法を提案している [19]. 構 造に関しては,要素情報および関係情報を扱っている.要素情報にはクラス,イ ンタフェース,属性,操作,コンストラクタが,関係情報には依存,汎化,関連, 生成がそれぞれ含まれる.振舞いに関しては,実行時のインスタンス情報,イベ ント情報,およびメッセージ情報を扱っている.イベント情報には操作の開始・ 20 図 15 DPRE の検出プロセス [5] 図 17 ビジュアル言語における 図 16 Adapter パターンにおけるク Adapter パターンの定義 [5] ラス間の関係 [5] 21 図 18 Visitor パターンの構造 [19] 図 19 Visitor パターンの Prolog ルー ル [19] 終了やオブジェクトの割当て・解放が,メッセージ情報には呼出しや送返信,生 成・破棄が含まれる. 提案手法では,デザインパターンの振舞いの時系列を表現するために,Prorlog に時間の概念を拡張した Temporal Prolog[20] を用いている.例えば,図 18 に示 す Visitor パターンの Prolog ルールは図 19 のようになる. Java プログラムを対象として提案手法を実装したツールが PRAssistor である. PRAssistor のアーキテクチャを図 20 に示す. クラスの構造やクラス間の関係を取得するためにリフレクションを利用してい る.実行時の振舞いに関する情報の取得には JVMPI(Java Virtual Machine Prifile Interface)[37] を用いている. 検出処理は,まず構造分析を行ってターゲットを絞ったうえで振舞い分析を行う. 3.12 DPdT Tsantalis らは,グラフの類似度計算を用いた検出手法を提案している [40]. Tsantalis らは,既存のデザインパターン検出手法の多くに以下の問題があること を指摘している. 22 図 20 PRAssistor のアーキテクチャ[19] • 変形したデザインパターンの検出が困難である. • システムの規模に対するスケーラビリティに問題がある. • 新しいデザインパターンの追加が困難である. Tsantalis らは,グラフアルゴリズムを用いることでこれらの問題を解決した. 提案手法では,システムおよびデザインパターンの構造をグラフで表現する. 具体的には,関連,汎化,抽象クラス,オブジェクト生成,抽象メソッド呼出しな どの静的な構造を個々にマトリクスで表現する.例えば,図 21 に示す Decorator パターンのマトリクス表現は図 22 のようになる. 検出処理では,システムおよびデザインパターンの各マトリクスの類似度を算 出し,閾値を用いて成否を判断する.提案手法では,特性の高々1 種類が変形し ているデザインパターンなら検出することができる.また,検出処理が個々にデ ザインパターンに依存しないため,新しいデザインパターンを追加する場合は, 必要なマトリクスを作成すれば容易に行うことができる. 提案手法では,グラフサイズの抑制のため,システムをクラスの継承関係で分 割し,そのサブシステム毎にアルゴリズムを適用する.このため,サブシステム 外に拡張したデザインパターンインスタンスは検出することができない.また, False Positive の抑制のために,デザインパターンを強く特徴づけるロールのみを 検出対象としている. 23 図 21 Decaorator パターンの構造 [40] 図 22 ビジュアル言語における Adapter パターンの定義 [40] 24 Java プログラムを対象として提案手法を実装したツールを DPdT(Design Pattern detection Tool) と呼ぶ [6]. 3.13 PINOT Shi らは,GoF のデザインパターンをリバースエンジニリングに適した形に再 分類し,それを用いた検出手法を提案している [35].通常,GoF のデザインパター ンは,目的 (生成,構造,振舞い) および対象 (クラス,オブジェクト) という観 点から分類される.しかし,構造に関するデザインパターンでも振舞い分析が必 要であったり,振舞いに関するパターンであっても構造分析で十分である場合が あるため,従来の分類はリバースエンジニアリングの目的に沿わない.Shi らは 構造と振舞いの類似性に着目して,GoF のデザインパターンを 5 種類に分類した (図 23). 1. Language-provided : 言語やパッケージの中で既に定義されている. 2. Structure-driven : 構造設計によって定義され,静的な構造分析で検出で きる. 3. Behavior-driven : 振舞い設計によって定義され,静的な振舞い分析で検 出できる. 4. Domain-specific : 他のデザインパターンを組み合わせ,特定のドメイン に特化させる. 5. Generic-concepts :構造や振舞いに関する明確な定義がない. 提案手法では,Structure-driven および Behavior-driven に分類されるデザイン パターンを検出対象とする.Sturucture-driven パターンに対しては,デザインパ ターンごとにクラス間の関係を分析する.Behavior-driven パターンに対しては, 構造分析であらかじめターゲットを絞ったうえで,AST を用いたコントロールフ ロー分析を行う. 25 図 23 GoF のデザインパターンの再分類 [35] 図 24 DP-Miner のアーキテクチャ[9] Java プログラムを対象として提案手法を実装したツールが PINOT(Pattern INference recOvery Tool) である [32].PINOT はオープンソースの Java コンパイラ である Jikes[22] にデザインパターン検出エンジンを組み込む形で実装されている. 3.14 DP-Miner Dong らは,デザインパターンの構造をマトリクスで表現し,それを用いた検 出手法を提案している [9].提案手法では構造だけでなく振る舞いやセマンティク スにも着目して分析を行う.また,プログラムを分析する際,ソースコードを直 接扱うのではなく,それらのクラス図から生成した XMI ファイルを用いる.提 案手法のアーキテクチャを図 24 に示す. マトリクスでは行と列にクラスをとり,全ての 2 クラス間の関係を表現する. システムおよび各デザインパターンに対して,個々にマトリクスを作成する.マ 26 表 5 構造要素の素数表現 [9] 構造要素 素数表現 属性 2 メソッド 3 関連 5 汎化 7 依存 11 集約 13 表 6 Adapter パターンのマトリクス [9] Class 図 25 Adapter パターン [9] Target Adapter Adaptee Target 1 1 1 Adapter 7 1 5 Adaptee 1 1 1 トリクス作成においては,クラスの特性を素数で表現 (表 5) し,複数の特性をも つクラスのセルの重みはそれらの積となる.ただし,依存と集約は XMI ファイ ルから読み取ることはできない.依存は振舞い分析で扱い,集約は関連と弁別で きないので扱わないこととする. 例えば,図 25 に示す Adapter パターンのマトリクス表現は表 6 のようになる. ただし,表 6 のマトリクスは重みのオーバーフローを避けるため,検出に不要な 構造要素の省略といった最適化を行ったものである. 検出処理では,検出したいクラスの重みと等しいかその値を公倍数にもつクラ スを探せばよい.振舞い分析では,クラス間の依存や委譲関係を調べる.デザイ ンパターンの変形に伴う振舞いの多様化には,CFG を用いて振舞いを抽象化す ることで対応している.また,セマンティクス分析としてはクラスや属性,操作 の命名規則を調べている. 27 Java プログラムを対象として提案手法を実装したツールが DP-Miner である [11]. 3.15 WOP Dietrich らは,OWL(Web Ontology Language) によってデザインパターンを形 式的に定義し,それを用いた検出手法を提案している [8].同じ名前のデザインパ ターンであっても,コミュニティによって定義が異なる場合があり,異なるコミュ ニティに属する開発者同士のコミュニケーションに齟齬が生じる恐れがある.こ の問題は,デザインパターンのコンテキストに関する情報を明示することで容易 に回避することができる.Dietrich らは,そうした情報も含めてデザインパター ンを形式的に定義することのできる言語として OWL に着目した. • 形式化でき,機械処理可能であるパターン定義言語. • 用語を容易に共有できる分散知識表現. • スキーマとインスタンスを分離できるモジュール設計. • デザインパターンの記述についての推論ができるメタデータアノテーション. • 標準 Web 技術と互換性のあるフォーマット. 提案手法では,リフレクション API および命名パターンの分析から得られた 事実に基づいた推論によって検出処理を行う.リフレクション API は,プログラ ムの実行時にオブジェクト間の関係を検出する働きがあり,プログラムの構造に 関する情報を収集することができる.命名パターン分析とは,例えば, add < ListenerType > ( < ListenerType > ) や add < ListenerType > ( < ListenerType > ) といったメソッドを定義しているクラスは, ListenerType クラスとの間に 多くの関連があるだろうとみなすようなことである. Dietrich らは,個々のデザインパターンに加えて,複数のデザインパターンが 要素を共有する場合についても形式的な定義を行っている.また,検出処理は exact matching のみを行っている.提案手法を実装したツールが WOP(Web Of Patterns) である [43]. 28 表 7 既存のデザインパターン検出ツール ツール名 作者 対象言語 入力ファイル形式 CrocoPat Beyer ら [2] Java RSF ファイル DPdT Tsantalis ら [40] Java クラスファイル DP-Miner Dong ら [9] Java XMI ファイル DPRE De Lucia ら [5] C++, Java ソースコード FUJABA Niere ら [29] Java ソースコード PINOT Shi ら [35] Java ソースコード PTIDEJ Albin-Amiot ら [1] Java ソースコード WOP Dietrich ら [8] Java ソースコード,クラスファイル 3.16 Web 上で公開されているデザインパターン検出ツール ここでは,これまで紹介してきたデザインパターン検出ツールのうち,(1)Java プロジェクトを対象とした,(2)Web 上で公開されているものについて述べる.表 7 に上記の要件を満たすデザインパターン検出ツールを示す. DPdT は jar ファイルとして配布されている.クラスファイルを入力として,検 出結果は XML ファイル形式で出力される.DPdT のスクリーンショットを図 26 に示す. DPRE はバッチファイルとして配布されている.java ファイルを入力として, 検出結果は HTML ファイル形式で出力される.DPRE のスクリーンショットを図 27 に示す. PINOT は Jikes 上で動作するため,コマンドライン経由で操作する.java ファ イルを入力として,検出結果はテキストファイル形式で出力される.PINOT の スクリーンショットを図 28 に示す. WOP は Eclipse のプラグインとして配布されている.java ファイルおよびクラ スファイルを入力として,検出結果は XML ファイル形式で出力される.WOP の スクリーンショットを図 29 に示す. 29 図 26 DPdT のスクリーンショット 図 27 DPRE のスクリーンショット 30 図 28 PINOT のスクリーンショット 図 29 WOP のスクリーンショット 31 4. 提案手法 4.1 複数検出手法の併用によるデザインパターン検出 2.2 節でも述べたように,デザインパターンはソフトウェア理解において重要な 役割を果たしている [29, 40].そのため,ソフトウェア理解の支援を目的として, 既存のソフトウェアからデザインパターンを検出するための手法がこれまでに数 多く提案されている.しかし,検出手法ごとに検出可能なデザインパターンの種 類や検出箇所が異なっている.こうした違いは,検出手法ごとに検出アプローチ が異なることに起因するものである [10, 5].そのため,検出手法ごとにそれぞれ のデザインパターンの種類に対する検出の適性に差があると考えられる. 本研究では,それぞれのデザインパターンの性質や検出アプローチを考慮して, 複数のデザインパターン検出手法を併用することで,個々の検出手法の適性を補 いあい,検出能力を向上させることができるのではないかと考えた.本研究にお ける「検出能力の向上」とは,具体的には「検出精度の向上」と「検出可能なデ ザインパターンの種類の増加」の 2 つの意味がある.先に述べたように,デザイ ンパターン検出手法はそれぞれ検出可能なデザインパターンの種類が異なる.複 数の検出手法を併用し,個々の検出手法が検出対象としないデザインパターンを 補完し合うことで,より多くの種類のデザインパターンを検出することが可能と なる.また,複数の検出箇所を比較検討することで,検出漏れや誤検出を減らし, 検出精度の向上が期待できる. そこで,本研究では複数の検出手法を併用することでデザインパターンの検出 能力を向上させる手法を提案する.現在,いくつかのデザインパターン検出手法 をツールとして実装したものが Web 上で公開されている.本研究では,これらの ツールの検出結果を組み合わせることで複数検出手法の併用を実現した.提案手 法の処理の流れを図 30 に示す.まず,対象のソフトウェアに対し個々の検出ツー ルを適用して検出結果を得る.次にこの検出結果を組み合わせるため,それぞれ の形式を加工して検出範囲の統一を行う.最後に検出範囲の統一が済んだ検出結 果を併用アルゴリズムを用いて組み合わせ,その出力をデザインパターン検出の 最終的な検出結果とする. 32 図 30 提案手法の流れ 4.2 検出範囲の統一 複数のデザインパターン検出ツールの検出結果を組み合わせるにあたって,検 出範囲を考慮する必要がある.検出範囲とは,検出箇所と指摘されたデザインパ ターンに含まれるロールの範囲を指す.同じ種類のデザインパターンであっても, 検出ツールごとに検出箇所とみなすロールの範囲が異なる場合がある.また,検 出ツールによっては,特定の種類のデザインパターンの検出箇所が膨大な件数に なり,比較が困難となる. このようなことから,検出ツール間の検出結果を比較するためには,検出範囲 を統一しなければならない.本研究では,各デザインパターンに関して全ての検 出ツールに共通する検出範囲に統一し,それ以外のロールは考慮しないこととし た.統一した検出範囲の一覧を表 8 に示す.個々の検出ツールの検出範囲につい ては付録 A に示す.なお,DPdT は Adapter パターンと Command パターンを区 別せずに (Object)Adapter-Command パターンとして検出する.また,State パ ターンと Strategy パターンについても State-Strategy パターンとしてそれらを区 別せずに検出する. 4.3 併用アルゴリズム 本研究では,5.1.1 節で述べたような妥当性を検証した上で,複数のデザイン パターン検出手法を併用するアルゴリズムとしてどのようなものが有用なのか調 33 表 8 統一した検出範囲 デザインパターン名 ロール名 Abstract Factory Abstract Factory, Abstract Product Factory Method Factory Method Prototype Prototype Singleton Singleton Adapter Adapter, Adaptee Bridge Abstraction, Implementor Composite Composite, Component Decorator Decorator, Component Facade Facade Flyweight Flyweight Factory Proxy Proxy Chain of Responsibility Chain of Resposibility Command Command, Receiver Mediator Mediator Observer Observer State State, Context Strategy Strategy, Context Template Method Template Method Visitor Visitor 34 べた.複数の検出手法を併用するというアプローチはこれまでに研究されていな いため,どの要因が併用結果にどのような影響を与えるかということはわかって いない.そこで,今回はクラスおよびクラス集合に対する検出箇所の重複に着目 し,併用アルゴリズムを考案した.ここでは,今回性能評価を行った 3 種類の併 用アルゴリズムについて紹介する. 4.3.1 和集合 和集合は,それぞれの検出ツールの全ての検出箇所を採用する併用アルゴリズ ムである.その性質上,検出結果の再現率があらゆる併用アルゴリズム中で最大 になるという利点がある.ソフトウェア理解においては,ソフトウェアの特徴を 見落とさないために,デザインパターン検出の再現率は高いことが望ましい [18]. また,5.1.1 節の妥当性を検証するために行った実験では,併用アルゴリズムとし て和集合を用いている. 4.3.2 多数決 コンピュータ将棋の分野で, 「合議アルゴリズム」という新しい考え方が生まれ ている [45].個性の異なる複数のプログラムに同じ局面を与え,それぞれのプロ グラムが出力した候補手の中から合議によって一手を決めるという方法である. 小幡らは単純な多数決によって 4 プログラムの合議を行い,単体プログラムに有 意に勝ち越す結果を出している. 本研究では,合議アルゴリズムの考え方が検出ツールの併用アルゴリズムに応 用できると考えた.ソフトウェア中の各クラスについて,複数のデザインパター ン検出箇所として指摘されることは多々ある.そこで,そのクラスが含まれるデ ザインパターンの種類に関する多数決を行った. 4.3.3 適性値付き和集合 4.3.2 で述べたことと同様に,同じクラス集合について複数のデザインパター ン検出箇所として指摘される場合は多々ある.これは,デザインパターンの中に 35 は State パターンと Strategy パターンのように構造が似ているものがあり,この ために誤検出が発生しているものと考えられる.また,4.2 節でも述べたように, 検出結果を組み合わせるために検出範囲を統一していることにも原因があると考 えられる.このような検出箇所の重複が誤りであるのか,それともそのクラス集 合に本当にデザインパターンが集中しているのかを,適切に区別することは検出 能力の向上に有用である. 本研究では,検出箇所の重複における誤りを減らすために,検出ツールのデザ インパターンに対する検出適性をパラメータとして導入した.異なる種類のデザ インパターンの構造が似ているために検出箇所の重複が発生するのであれば,よ り適性値の高い検出ツールのほうを採用することで,誤検出を減らせると考えら れる.検出適性の判断材料としては,図 23 に示す Shi らの分類を利用した.検 出ツールが Shi らの各 5 分類に含まれるデザインパターンの種類を多く検出対象 にしているほど,その分類に含まれるデザインパターンに対する検出適性は高い とみなしている.この検出ツールの各分類に対する適性値は以下のように算出で きる. 適性値 = 分類に含まれ,かつ検出対象であるデザインパターンの種類の数 分類に含まれるデザインパターンの種類の総数 このアルゴリズムでは,重複がない場合は 4.3.1 で紹介した和集合と同じ方法 をとる.検出結果の重複が起きた場合のみ,適性値の高い検出ツールのみを採用 することで誤検出を減らせると考えられる. 36 5. 実験 本研究では,大きく分けて 2 種類の実験を行っている.1 つ目は,複数のデザ インパターン検出手法を併用することで検出能力が向上するという本研究の妥当 性を確認するために行った実験である.2 つ目は 4.3 節で紹介した併用アルゴリ ズムの性能を評価するために行った実験である.前者は 5.1 節で,後者は 5.2 節 でそれぞれ説明する. 5.1 妥当性の検証 本節では,本研究の妥当性を確認するために行った実験について説明する.以 降,5.1.1 では本研究の妥当性を確認するために検証すべき 2 つの仮説について説 明する.5.1.2 で実験で利用したデザインパターン検出ツールと,検出対象とした プロジェクトについて説明する.5.1.3 では検出ツールによってどのようなデザイ ンパターンが検出されるかを確認する(後述する仮説 1 の検証).5.1.4 ではデザ インパターン検出結果を組み合わせることで,検出能力がどの程度向上するかを 確認する(後述する仮説 2 の検証). 5.1.1 妥当性を検証する仮説 3 章で示したように,それぞれのデザインパターン検出手法ごとに,その検出 アプローチは大きく異なっており,検出可能なデザインパターンの種類も異なる. また,検出アプローチや検出対象のデザインパターンの構造によって,検出箇所 にも大きく差があると考えられる.このように,検出手法ごとに,検出可能なデ ザインパターンの種類や検出箇所が大きく異なるのであれば,複数の検出手法を 適切に併用することで,検出能力の向上が期待される.本研究では,複数検出手 法を併用する具体策として,デザインパターン検出ツールの検出結果を組み合わ せる方法をとっている.そこで,検出能力の向上を目的とした検出結果の組み合 わせを検討するにあたって,まず以下の仮説を検証する. (仮説 1) デザインパターン検出手法によって,検出可能なデザインパターンの 種類や,デザインパターンの検出箇所が異なる. 37 仮説 1 が成立すれば,複数の検出手法を併用することによる,検出能力の向上 が期待できる.そこで,仮説 1 を確認した上で,以下の仮説を検証する. (仮説 2) 複数のデザインパターン検出手法を併用することにより,デザインパ ターン検出能力を向上することができる. 本研究における「検出能力の向上」とは,具体的には「検出精度の向上」と「検 出可能なデザインパターンの種類の増加」の 2 つの意味がある.先に述べたよう に,デザインパターン検出ツールは,それぞれの検出アプローチの違いによって 検出可能なデザインパターンの種類が異なる.複数の検出ツールを併用し,個々の 検出手法が検出対象としないデザインパターンを補完し合うことで,より多くの 種類のデザインパターンを検出することが可能となる.また,複数の検出結果を 比較検討することで,検出漏れや誤検出を減らし,検出精度の向上が期待される. 5.1.2 実験対象 今回は,3.16 節で紹介した検出ツールのうち,本研究の実験環境において使用 可能であった DPdT,DPRE,PINOT,WOP の 4 つを使用した.3.16 節に示し た通り,これらの検出ツールは全て Java プロジェクトを対象としているが,そ れぞれの検出アプローチは異なっている.そのため,同じ種類のデザインパター ンであっても,検出箇所は大きく異なると考えられる.また,表 2 に示した通り, 検出可能なデザインパターンの種類も異なっている. デザインパターン検出の対象プロジェクトとして Java で書かれたオープンソー スプロジェクト JHotDraw 5.1 および 6.0 beta 1 [21], JRefactory 2.6.24 [23], Lexi 0.1.1 alpha [28] を利用した.JHotDraw 6.0 beta 1 に関しては, Dong らが Strategy パターンの手作業による検出箇所のリスト [11] を公開している.また, JHotDraw 5.1, JRefactory 2.6.24 および Lexi 0.1.1 alpha に関しては Gueheneuc らの手作業による検出箇所のリストを入手している.これらを検出箇所の正例と して用いることで,検出ツールの検出精度を比較評価することが可能となる. 38 5.1.3 実験 1: 検出されるデザインパターンの確認 実験方法 本実験では,仮説 1 を検証するために,デザインパターン検出ツール の検出結果の違いを分析する.5.1.2 で紹介したように,4 つの Java プロジェクト を対象に 4 つの検出ツールの各デザインパターンの検出件数を調べる.また,4.2 節で述べたように各検出ツールでは検出範囲が異なるが,表 8 に示す統一した検 出範囲に従って検出結果を整理した上で検出件数を数える.そして,検出ツール間 の検出結果がどの程度一致しているのかを分析する.ただし, DPdT は Adapter パターンと Command パターン,および State パターンと Strategy パターン を区別せず,それぞれ (Object)Adapter-Command パターン, State-Strategy パ ターンとして検出する.そこで, (Object)Adapter-Command パターンについて は Adapter パターンと Command パターン,State-Strategy パターンについて は State パターンと Strategy パターン,というように,両者とも検出箇所とみ なすこととする. 実験結果 各検出ツールの検出件数についてまとめた結果を表 9 に示す.それぞ れの数値は,各検出ツールの検出件数について 4 つのプロジェクトでの合計をとっ たものである.表中の棒線は,その検出ツールにおいてそのデザインパターンが 検出対象でないことを表している.表より,各デザインパターンの検出件数が検 出ツールによって大きく異なることがわかる.プロジェクトごとの検出件数は付 録 B に示す. また,検出ツール間の検出箇所の一致件数についてまとめた結果を表 10 に示 す.表の○種類の数字は,検出箇所が一致した件数を表している.それぞれの数 値は,検出ツール間の検出箇所の一致件数について,4 つのプロジェクトにおけ る全てのデザインパターンでの合計をとったものである.表より,各検出ツール の検出箇所の多くが一致していないことがわかる.プロジェクトごとの検出箇所 の一致件数は付録 C に示す. 以上の結果より,今回利用した検出ツール間では,仮説 1 が成立することが確 認できた. 39 表 9 各検出ツールの合計検出件数 DPdT DPRE PINOT WOP - - 0 46 12 - 28 - Prototype 8 - - - Singleton 24 - 4 11 Adapter 96 125 14 91 Bridge - 202 27 55 Composite 3 1 9 18 Decorator 16 0 5 - Facade - 39 108 - Flyweight - - 8 - 14 3 41 1 - - 5 - 96 - - - Mediator - - 415 - Observer 17 - 6 - State 184 - 3 - Strategy 184 - 37 - 28 - 0 19 3 - 2 0 Abstract Factory Factory Method Proxy Chain of Responsibility Command Template Method Visitor 表 10 検出ツール間の検出箇所の合計一致件数 1 種類 1672 2 種類 3 種類 4 種類 110 13 40 0 5.1.4 実験 2: 検出手法の組み合わせによる精度の確認 実験方法 本実験では仮説 2 を検証,すなわち複数の検出ツールを併用すること で検出能力が向上できるかどうかを検証する.4.3.1 で述べたように,この実験で は複数検出ツールの併用アルゴリズムとして,全ての検出ツールの検出箇所の和 集合をとる.そして,それぞれの検出ツールの検出箇所および検出箇所の和集合 をとったものについて検出精度を算出する. 検出精度の評価にあたっては,5.1.2 で述べたように,JHotDraw 6.0 beta 1 に関しては Dong らが公開している Strategy パターンの検出箇所のリストを, JHotDraw 5.1, JRefactory, Lexi に関しては Gueheneuc らによる検出箇所の リストを用いる.これらのデータはそれぞれのプロジェクトを対象に,各デザイ ンパターンの検出箇所を手作業で評価したものである.このデータをデザインパ ターン検出の正例として,以降の評価に用いる. 検出精度の評価尺度としては,正しくデザインパターンとして検出できた個 数(True Positive; TP),間違ってデザインパターンとして検出した数(False Positive; FP),デザインパターンであるのにも関わらず検出できなかった個数 (False Negative; FN)を算出する.そして,これらの値をもとに,正解集合に含 まれるデザインパターンを正しく検出できた割合(再現率)と検出結果の中に含 まれる正解デザインパターンの割合(適合率)を求める.さらに,再現率と適合 率の調和平均である F 値もあわせて求める. 実験結果 各プロジェクトにおける個々の検出ツールおよび和集合による併用結 果の検出精度についてまとめた結果を表 11 に示す.表は各プロジェクトにおけ る個々の検出ツールおよび和集合による併用結果について,検出箇所の TP(True Positive), FN(False Negative), FP(False Positive) を合計した上で適合率,再 現率,F 値を算出したものを示している.表中の棒線は,その検出ツールにおい てそのプロジェクトのデザインパターンが検出対象でないことを表している.表 より,JHotDraw 6.0 beta 1 以外のプロジェクトでは,和集合の F 値は個々の検出 ツールと同じかそれを下回っている.これは,個々の検出ツールの False Positive が多すぎたため,適合率が著しく低下したことに起因する.しかし,ソフトウェ 41 ア理解においては,デザインパターン検出の再現率は高いことが望ましいとされ ている [18].再現率に関しては,和集合は全てのプロジェクトにおいて個々の検 出ツールと同じかそれ以上の値となっている.そのため,これらのプロジェクト についても検出精度が向上したということができる.デザインパターンの種類別 の検出精度を含む詳細な評価結果は付録 D に示す. 以上の結果より,今回の実験では仮説 2 が成立することが確認できた.よって, 5.1.3 の結果とあわせて仮説 1 および仮説 2 が成立することが確認できたので,本 研究の妥当性が確認できたと言える. 5.2 併用アルゴリズムの比較評価 5.1 節では,複数検出手法の併用によってデザインパターン検出能力が向上で きることを確認した.本節では,検出能力の向上に適した併用アルゴリズムの発 見を目的として,複数の併用アルゴリズムを比較評価した実験について説明する. 5.2.1 実験対象 実験対象の Java プロジェクトおよび検出ツールは 5.1 節と同様である. 3.16 節で紹介した検出ツールのうち,DPdT,DPRE,PINOT,WOP の 4 つ を使用した.デザインパターン検出の対象プロジェクトとしては,オープンソー スプロジェクト JHotDraw 5.1 および 6.0 beta 1, JRefactory 2.6.24, Lexi 0.1.1 alpha を利用した.検出箇所の正例としては,JHotDraw 6.0 beta 1 に関し ては, Dong らが公開している Strategy パターンの手作業による検出箇所のリ ストを, JHotDraw 5.1, JRefactory 2.6.24 および Lexi 0.1.1 alpha に関しては, Gueheneuc らの手作業による検出箇所のリストを用いた. 5.2.2 実験方法 本実験では,検出能力の向上に適した併用アルゴリズムを発見するために,複 数の併用アルゴリズムの性能を評価する.今回は 4.3 節で紹介した,和集合,多 42 表 11 各プロジェクトにおける検出ツールごとの検出精度のまとめ 検出ツール JHotDraw 6.0 beta 1 DPdT DPRE PINOT WOP 和集合 TP/FN/FP JHotDraw JRefactory Lexi 5.1 54/11/40 14/190/134 3/19/75 2/9/0 適合率 0.574 0.0946 0.0385 1 再現率 0.831 0.0686 0.136 0.182 F値 0.679 0.0795 0.06 0.308 -/65/- 4/200/36 0/22/34 0/11/0 適合率 - 0.1 0 0 再現率 - 0.0196 0 0 F値 - 0.0328 0 0 9/56/4 0/204/2 0/22/25 1/10/0 適合率 0.692 0 0 1 再現率 0.138 0 0 0.0909 F値 0.231 0 0 0.167 -/65/- 4/200/34 1/21/6 2/9/0 適合率 - 0.105 0.143 1 再現率 - 0.0196 0.0455 0.182 F値 - 0.0331 0.0690 0.308 58/7/44 16/188/187 3/19/121 2/9/0 適合率 0.569 0.0788 0.0242 1 再現率 0.892 0.0784 0.136 0.182 F値 0.695 0.0786 0.0411 0.308 TP/FN/FP TP/FN/FP TP/FN/FP TP/FN/FP 43 数決,適性値付き和集合の 3 種類の併用アルゴリズムについて行った.5.1.4 と同 様に,DPdT, DPRE, PINOT, WOP の 4 つの検出ツールの検出結果を 3 種類の併 用アルゴリズムによってそれぞれ組み合わせる.そして,Dong らや Gueheneuc らによるデザインパターン検出の正例を用いて精度評価を行い,併用アルゴリズ ムによる違いを分析する. 5.2.3 実験結果 各プロジェクトにおけるそれぞれの併用アルゴリズムによる併用結果の検出 精度についてまとめた結果を表 12 に示す.表は各プロジェクトにおけるそれぞ れの併用アルゴリズムによる併用結果について,検出箇所の TP(True Positive), FN(False Negative), FP(False Positive) を合計した上で適合率,再現率,F 値を 算出したものを示している.表より,JRefactory 以外のプロジェクトでは,和集 合の F 値が他の 2 つと同じかそれ以上となっていることがわかる.多数決および 適性値付き和集合では False Positive を減らすことが期待できるが,同時に True Positive の取りこぼしも発生してしまう.今回の実験では, JRefactory 以外のプ ロジェクトでは False Positive を減らせたことより True Positive を取りこぼし たことの方が影響が大きかったと言える.JRefactory では,適性値付き和集合で 除去された検出箇所が全て False Positive であったため,同じ再現率の和集合を 適合率で上回り,結果的に F 値が高くなっている.しかし,この適性値付き和集 合の優位はわずかであるため,3 つの併用アルゴリズムの中では和集合が最も高 性能であるといえる.デザインパターンの種類別の検出精度を含む詳細な評価結 果は付録 E に示す. 44 表 12 各プロジェクトにおける併用アルゴリズムの検出精度のまとめ 検出ツール 和集合 多数決 適性値付き和集合 JHotDraw JHotDraw JRefactory Lexi 6.0 beta 1 5.1 58/7/44 16/188/187 3/19/121 2/9/0 適合率 0.569 0.0788 0.0242 1 再現率 0.892 0.0784 0.136 0.182 F値 0.695 0.0786 0.0411 0.308 11/54/8 8/196/66 1/21/70 2/9/0 適合率 0.579 0.108 0.0141 1 再現率 0.169 0.0392 0.0455 0.182 F値 0.262 0.0576 0.0215 0.308 58/7/44 13/191/165 3/19/118 0/11/0 適合率 0.569 0.0730 0.0248 0 再現率 0.892 0.0637 0.136 0 F値 0.695 0.0681 0.0420 0 TP/FN/FP TP/FN/FP TP/FN/FP 45 6. 考察 6.1 併用アルゴリズムの性能 5.2 節において,和集合,多数決,適性値付き和集合の 3 種類の併用アルゴリ ズムの性能比較を行い,和集合が最も高性能であるという知見を得た.また,ソ フトウェア理解においてはデザインパターン検出の再現率が高いことが望ましい [18] ため,その意味でも再現率が最大となる和集合は優れていると言える.しか し,個々の検出ツールで False Positive が大量に発生した場合,それらを全て採 用してしまう和集合では適合率が著しく低下する.そのため, False Positive の 除去は複数検出手法の併用において重要な課題である. 多数決および適性値付き和集合では False Positive の除去を目的とした検出箇 所の絞込みを行っている.実験において,多数決によって大量の False Positive が除去されるという状況も確認できた.しかし, False Positive と一緒に True Positive も除去してしまうという問題がある.この問題は程度の差はあれど,適 性値付き和集合についても同様であった. 6.2 検出範囲 本研究では,複数検出手法の併用のために,各デザインパターンに関して検出 範囲を全ての検出ツールに共通する範囲に統一している.これは検出箇所の比較 や精度評価のために行ったことであるが,統一された検出範囲に含まれないロー ルまで指摘できる検出ツールの検出性能を意図的に低下させているとも言える. このような状況では検出手法の併用だけでなく,検出手法同士の性能比較なども 困難である.そのため,目的に応じた望ましい検出範囲などについては今後議論 が必要である.具体的には,検出範囲を変えた時の検出精度の変動などを測定す ることで,最適な検出範囲が得られるのではないかと考えられる. 46 6.3 実験結果の妥当性 本研究においては,5.1.1 節で述べた妥当性の検証,つまりデザインパターン検 出ツールによって検出結果が異なること (仮説 1),および検出ツールを併用する ことで検出能力が向上できること (仮説 2) を示した.また,4.3 節で紹介した 3 つ の併用アルゴリズムのうち,実用上は和集合が最も高性能であることを示した. ただし,今回使用した検出ツールは本研究の環境で実行可能であった 4 つのみ である.Web 上で公開されている検出ツールのうち,いくつかは使用できる条件 が合わず,使用を見送っている.また,今回使用した検出ツールはいずれも Java を主な対象言語としている.C++ や Smalltalk を対象言語とする検出ツールにつ いては今回は検証していない.実験対象のソフトウェアも 4 つの Java プロジェク トのみである.本研究の知見が一般的に成りたつのか,検出ツールやソフトウェ ア,プログラミング言語を変えてさらに検証していくことが必要である. また,精度評価の正例として Dong らおよび Gueheneuc らの手作業による検出 箇所のリストを用いた.この正例自体にも False Positive や False Negative が存 在する可能性は否定できない.しかし,このようなデザインパターン検出の正例 を入手および作成することは一般に困難である.オープンソースソフトウェアで は,ソフトウェア中に適用されているデザインパターンの情報を詳細に管理して いることはほとんどない.そのため,現状では手作業による検出箇所のリストが 最も信頼性の高い正例と言える. 本研究の提案手法は,個々の検出ツールが正常に検出結果を出力することが前 提となっている.そのため,対象ソフトウェアが個々の検出ツールの求める入力 形式を満たしていなければならない.つまり,提案手法を適用するためには,ソ フトウェアのソースコードやクラスファイルを入手する必要がある. 検出範囲の統一は,使用する全ての検出ツールの検出範囲を考慮して決定して いる.そのため,使用する検出ツールが増えたり変わったりした場合は,その度 に統一した検出範囲を見直す必要がある.また,個々の検出ツールの検出結果を, 元々の検出範囲から統一した検出範囲に適合させる処理も検出ツールごとに行っ ている.これについても,使用する検出ツールが増えたり変わったりした場合は, その度に検出ツールごとに処理方法を見直さなければならない. 47 7. 関連研究 7.1 デザインパターン検出手法の比較評価 これまでに提案されているデザインパターン検出手法は,対象とするプログラ ミング言語や検出可能なデザインパターンの種類,デザインパターンの検出箇所 など多くの点で異なっている.また,それぞれの検出手法の性能評価の方法が手 法によってまちまちであるため,検出手法間での検出精度などの性能比較が困難 であった.そのため,近年は既存のデザインパターン検出手法の比較評価に関す る研究が増えている. Dong らは,既存のデザインパターン検出手法に関する比較研究を行っている [10].それぞれの検出手法を,デザインパターンの表現方法や着目する特徴など 様々な観点から分類している.また,同じソフトウェア,同じデザインパターン に対する検出結果が手法によって異なる原因についての分析も行っている. Fulop らは,デザインパターン検出ツールを評価するベンチマーク DEEBEE (DEsign pattern Evaluation BEnchmark Environment) を提案している [15].DEEBEE はプロジェクト管理ツール Trac[41] を拡張したもので,デザインパターン検 出ツールに関する各種データベースのビューを提供する.また,Fulop らは C++ プロジェクトを対象とするデザインパターン検出ツールの比較評価も行っている [14].Columbus[12], Maisa[30] および CrocoPat[2] の 3 つのツールについて,検 出箇所,処理速度およびメモリ使用量に関して比較している. Pettersson らは,デザインパターン検出の精度を評価するフレームワークを提 案している [31].検出手法間の精度比較を妨げるいくつかの問題を指摘し,それ を解決するための方法について述べている. 7.2 デザインパターン検出手法の精度改善 深谷らは,デザインパターン適用前のソースコード解析を併用することで,デ ザインパターン検出ツールの検出精度を改善する手法を提案している [44].深谷 らは,デザインパターン適用前のソースコードには,後にデザインパターンを適 48 用できる箇所があると考え,その部分を識別する情報をデザインパターン検出に 利用している. 7.3 デザインパターンの影響分析 デザインパターンを利用することでソフトウェアの品質向上が見込めると言わ れている [17, 42] が,それを定量的に示した研究は少ない.ここでは,デザイン パターンがソフトウェアに与える影響に関する研究を紹介する. Khomh らは,デザインパターンがソフトウェアの保守工程に与える影響に関す る研究を行っている [26].Composite パターン,Abstract Factory パターンおよ び Flyweight パターンの 3 種類のデザインパターンについて,各デザインパター ンを利用することで再利用性,可読性および拡張性にどのような影響を与えるか 分析している.筆者らの過去の実験結果を用いて仮説検定を行い,それに対する 考察を行っている. Fushida らは,デザインパターンの適用履歴に関する分析を行っている [16]. Fushida らは,デザインパターンがソフトウェアの品質や生産性に与える影響を 知るための手がかりとしてデザインパターンの適用履歴が重要であると考え,そ の分析方法を提案している. 49 8. まとめ 本研究では,まずソフトウェアの品質を向上させるデザインパターンについて, 最も有名な GoF のパターンを挙げて概要を述べた.また,デザインパターンが ソフトウェア設計時だけでなく,ソフトウェア理解においても有用であることを 述べた. 次に,ソフトウェア理解の目的でこれまでに数多くのデザインパターン検出手 法が提案されており,それぞれの検出手法で検出アプローチが大きく異なること を文献調査によって明らかにした.いくつかの検出手法はツールとして実装され ており,Web 上で公開され一般に使用可能であることを確認した. 次に,複数検出手法を併用することでデザインパターン検出能力が向上できる ことを示した.本研究の妥当性を検証するために 2 つの仮説を立てて,4 つの Java プロジェクトと 4 つの検出ツールを用いた実験によってそれらを確認した.複数 検出手法を併用するにあたっての検出範囲の違いという問題を指摘し,それを解 決するために全ての検出ツールに共通する検出範囲に統一する方法を示した. 次に,3 種類の併用アルゴリズムを考案し,それらの比較評価を行った.その 結果,検出ツールの併用方法として全てのツールの検出箇所の和集合をとった場 合,適合率はわずかに低下するが再現率および F 値が改善することが多く,3 種 類の中では最も高性能であることを示した. 今後は,本研究で提案した複数検出手法の併用というアプローチの有用性が認 知され,普及していくことが望まれる.デザインパターン検出手法自体やその比 較評価の方法など,関連分野の研究は今後も盛んに行われていくと考えられる. また,デザインパターン検出の正例データが増えれば精度評価が行いやすくなる. 使用可能な検出ツールや正例データが増え,分析環境などが今後整ってくれば, 今回の 3 種類の併用アルゴリズムよりも高性能なものも考案できると考えられる. 50 謝辞 本論文は,筆者が奈良先端科学技術大学院大学 情報科学研究科 ソフトウェア 設計学講座に在籍中の研究成果をまとめたものです.本研究を進めるにあたり, 多くの方々から御指導,御協力を賜りました.ここに記して感謝の意を表す次第 です. 奈良先端科学技術大学院大学 情報科学研究科 ソフトウェア設計学講座 飯田 元 教授には,本研究の全過程において熱心な御指導を賜りました.研究方針だけで はなく,研究に対する姿勢,論文執筆,発表方法についても多くの御助言を賜り ました.心より厚く御礼申し上げます. 奈良先端科学技術大学院大学 情報科学研究科 ソフトウェア工学講座 松本 健 一 教授,ならびにソフトウェア基礎学講座 安本 慶一 准教授には,学内の発表 において多数の貴重な御質問,御助言を賜りました.心より感謝申し上げます. 奈良先端科学技術大学院大学 情報科学研究科 ソフトウェア設計学講座 川口 真 司 助教,ならびに伏田 享平 氏には,本研究を進めるにあたり,広範囲かつ多大 な御助力を賜りました.特に,筆者が論文投稿直前に新型インフルエンザに感染 した際,親身になって御指導頂きました.心より感謝申し上げます. 株式会社 日立製作所 名倉 正剛 氏には,研究方針や発表方法などについて貴 重な御助言を賜りました.心より感謝申し上げます. Ecole Polytechnique de Montreal の Yann-Gael Gueheneuc 准教授には,本研 究を進めるにあたり,貴重なデータを快く御提供頂きました.心より感謝申し上 げます. 奈良先端科学技術大学院大学 情報科学研究科 ソフトウェア設計学講座,なら びにソフトウェア工学講座の皆様には,日頃より多大な御協力と御助言を賜り, 公私ともに支えて頂きました.ありがとうございました. 最後に,日頃より私を励まし,暖かく見守ってくれた家族に心より深く感謝し ます. 51 参考文献 [1] H. Albin-Amiot, P. Cointe, Y. Gueheneuc, and N. Jussien, “ Instantiating and detecting design patterns: putting bits and pieces together. ” In Proceedings 16th Annual International Conference on Automated Software Engineering (ASE), 2001. [2] Dirk Beyer , Andreas Noack , Claus Lewerentz, Simple and Efficient Relational Querying of Software Structures, Proceedings of the 10th Working Conference on Reverse Engineering, p.216, November 13-17, 2003. [3] Blewitt and A. Bundy, “ Automatic verification of Java design patterns. ” Proceedings of International Conference on Automated Software Engineering, pp. 324-327, 2001. [4] CrocoPat Homepage.http://www.sosy-lab.org/?dbeyer/CrocoPat/ [5] Andrea De Lucia, Vincenzo Deufemia, Carmine Gravino, Michele Risi, Design pattern recovery through visual language parsing and source code analysis, The Journal of Systems and Software, 2009. (To appear). [6] Design Pattern Detection Homepage. http://java.uom.gr/$sim$nikos/ pattern-detection.html [7] Design Pattern Recovery Homepage. http://www.sesa.dmi.unisa.it/ dpr/index.html [8] J. Dietrich, C. Elgar, ”Towards a Web of Patterns,”Proc. Semantic Web Enabled Software Engineering(SWESE), 117-132, Galway, Ireland, 2005. [9] Jing Dong , Dushyant S. Lad , Yajing Zhao, DP-Miner: Design Pattern Discovery Using Matrix, Proceedings of the 14th Annual IEEE International Conference and Workshops on the Engineering of Computer-Based Systems, p.371-380, March 26-29, 2007 52 [10] Jing Dong, Yajing Zhao, and Tu Peng, A Review of Design Pattern Mining Techniques, the International Journal of Software Engineering and Knowledge Engineering (IJSEKE), World Scientific Publishing, 2009. (To appear). [11] DP-Miner Homepage. http://www.utdallas.edu/∼yxz045100/ DesignPattern/DP Miner/index.html [12] R. Ferenc, A. Beszedes, L. Fulop, and J. Lele, “ Design pattern mining enhanced by machine learning. ” In Proceedings of the 21st IEEE International Conference on Software Maintenance (ICSM ’05), 2005. [13] FUJABA Homepage.http://wwwcs.uni-paderborn.de/cs/fujaba/ [14] L. Fulop, T. Gyovai, and R. Ferenc. Evaluating C++ Design Pattern Miner Tools. In Proceedings of the 6th International Workshop on Source Code Analysis and Manipulation (SCAM 2006), pages 127-136. IEEE Computer Society, Sept. 2006. [15] L. J. Fulop, R. Ferenc, and T. Gyimothy. Towards a Benchmark for Evaluating Design Pattern Miner Tools. In Proceedings of the 12th European Conference on Software Maintenance and Reengineering (CSMR 2008). IEEE Computer Society, Apr. 2008. [16] K. Fushida, S. Kawaguchi, and H. Iida. A method of investigate software evolutions using design pattern detection tool. In Proceedings of the 1st International Workshop on Software Patterns and Quality(SPAQu ’07), pp. 11-16, Nagoya, Japan, 2007. [17] E. Gamma, R. Helm, R. Johnson, and J. Vlissides. Design Patterns - Elements of Reusable Object-Oriented Software. Addison-Wesley, 1st edition, 1994. [18] Y.-G. Gueheneuc and G. Antoniol. DeMIMA: A multi-layered framework for design pattern identification. In Transactions on Software Engineering 53 (TSE), 34(5):667-684, September 2008. [19] Heyuan Huang, Shensheng Zhang, Jian Cao, Yonghong Duan, A practical pattern recovery approach based on both structural and behavioral analysis, Journal of Systems and Software, 75(1-2), pp.69-87, February 2005. [20] Hrycej, T, A temporal extension of Prolog. Journal of Logic Programming 15, 113-145, 2002. [21] JHotDraw Homepage. http://www.jhotdraw.org/ [22] Jikes Homepage. http://jikes.sourceforge.net/ [23] JRefactory Homepage. http://jrefactory.sourceforge.net/ [24] N. Jussien and V. Barichard. The PaLM system: explanation-based constraint programming. In Proceedings of TRICS: Techniques foR Implementing Constraint programming Systems, a post-conference workshop of CP 2000, pages 118-133, Singapore, Sept. 2000. [25] R. K. Keller, R. Schauer, S. Robitaille, and P. Page, Pattern-based reverseengineering of design components. Proceedings of the 21st International Conference on Software Engineering (ICSE), pp 226-235. 1999. [26] Foutse Khomh, Yann-Gael Gueheneuc, Do Design Patterns Impact Software Quality Positively? Proceedings of the 12th European Conference on Software Maintenance and Reengineering (CSMR), du 1-4 avril 2008, Athenes, Grece. IEEE Computer Society Press. [27] C. Kramer and L. Prechelt, “ Design recovery by automated search for structural design patterns in object-oriented software. ” In Proceedings of 6th International Workshop on Program Compression (IWPC ’98), 1998. [28] Lexi Homepage. http://lexi.sourceforge.net/ 54 [29] J. Niere, W. Schafer, J.P. Wadsack, L. Wendehals, and J. Welsh, “ Towards Pattern-Based Design Recovery, ” Proc. 24th Int’l Conf. Software Eng. (ICSE 2002), pp. 338-348, 2002. [30] J. Paakki, A. Karhinen, J. Gustafsson, L. Nenonen, and A. Verkamo. Software Metrics by Architectural Pattern Mining. In Proceedings of the International Conference on Software: Theory and Practice (16th IFIP World Computer Congress)., pages 325-332, 2000. [31] N. Pettersson, W. Lowe and J. Nivre. On Evaluation of Accuracy in Pattern Detection. First InternationalWorkshop on Design Pattern Detection for Reverse Engineering, October 2006. [32] PINOT Homepage.http://www.cs.ucdavis.edu/?shini/research/ pinot/ [33] PTIDEJ Download page. http://www.yann-gael.gueheneuc.net/Work/ Research/PTIDEJ/Download/ [34] Rational Rose website.http://www-01.ibm.com/software/rational/ [35] N. Shi and R. A. Olsson, “ Reverse engineering of design patterns from java source code. ” 21st IEEE/ACM International Conference on Automated Software Engineering, 2006. [36] J. M. Smith and D. Stotts, “ SPQR: Flexible automated design pattern extraction from source code. ” In Proceedings of the 18th IEEE International Conference on Automated Software Engineering (ASE), 2003. [37] Sun Microsystems, Inc., 2002. Javae2 SDK, Standard Edition Documentation, version 1.4.1. http://java.sun.com/j2se/1.4.1/docs/index.html [38] W. Wang and V. Tzerpos, “ Design pattern detection in Eiffel systems. ” In Proceedings of 12th Working Conference on Reverse Engineering (WCRE ’ 05), 2005. 55 [39] Wind River Systems, Inc. Sniff+. http://www.windriver.com/products/ sniff plus/ [40] Nikolaos Tsantalis and Spyros T. Halkidis. Design pattern detection using similarity scoring. IEEE Trans. Softw. Eng., 32(11):896-909, 2006. [41] The Trac Homepage. http://trac.edgewall.org/ [42] B. Venners. How to use design patterns - A conversation with Erich Gamma, part I, May 2005. http://www.artima.com/lejava/articles/gammadp. html [43] The Web of Patterns Project Homepage. http://www-ist.massey.ac.nz/ wop/ [44] 深谷和宏, 久保淳人, 鷲崎弘宜, 深澤良彰, パターン適用前の状況を活用した デザインパターン検出, ソフトウェア工学の基礎ワークショップ (FOSE2007), pp95-104, November 8-10, 2007. [45] 小幡拓弥, 塙雅織, 伊藤毅志, 思考ゲームによる合議アルゴリズム 単純多数決 の有効性について , 情報処理学会ゲーム情報学研究会報告, Vol.2009-GI-22, No.2(2009). 56 付録 A. デザインパターン検出ツールの検出範囲 ここには,4.2 節で触れた個々のデザインパターン検出ツールの検出範囲を示 す.DPdT の検出範囲を表 13 に,DPRE を表 14 に,PINOT を表 15 に,WOP を表 16 にそれぞれ示す. B. デザインパターン検出ツールの検出件数 ここには,5.1.3 の実験結果で触れたデザインパターン検出ツールの検出件数 を示す.表は各プロジェクトにおける個々の検出ツールの検出件数をデザインパ ターンの種類ごとに数えたものである.表中の棒線は,その検出ツールがそのデ ザインパターンを検出可能でないことを表している.JHotDraw 6.0 beta 1 にお ける検出件数を表 17 に,JHotDraw 5.1 を表 18 に,JRefactory を表 19 に, Lexi を表 20 にそれぞれ示す. C. デザインパターン検出ツール間の検出箇所の一致件 数 ここには,5.1.3 の実験結果で触れたデザインパターン検出ツール間の検出箇所 の一致件数を示す.表は各プロジェクトにおける検出ツール間の検出箇所の一致 件数をデザインパターンの種類ごとに数えたものである.表の○種類の数字は, 検出箇所が一致した件数を表している.表中の棒線は,使用している検出ツール の中でそのデザインパターンを検出可能なものの個数がその件数に満たないこと を示している.JHotDraw 6.0 beta 1 における検出箇所の一致件数を表 21 に, JHotDraw 5.1 を表 22 に,JRefactory を表 23 に, Lexi を表 24 にそれぞれ示す. 57 表 13 DPdT のデザインパターンごとの検出範囲 デザインパターン名 ロール名 Factory Method Factory Method Prototype Prototype, Client Singleton Singleton Adapter Adapter, Adaptee Command Command, Receiver Composite Composite, Component Decorator Decorator, Component Proxy Proxy, Real Subject Observer Observer, Subject State State, Context Strategy Strategy, Context Template Method Template Method Visitor Visitor, Concrete Element 表 14 DPRE のデザインパターンごとの検出範囲 デザインパターン名 ロール名 Adapter Adapter, Adaptee, Target Bridge Abstraction, Implementor, Concrete Implementor Composite Composite, Component, Leaf Facade Facade, Hidden Classes Proxy Proxy, Subject, Real Subject 58 表 15 PINOT のデザインパターンごとの検出範囲 デザインパターン名 ロール名 Factory Method Factory Method, Concrete Factory Method Singleton Singleton Adapter Adapter, Adaptee, Adapting Classes Bridge abstract, interface Composite Composite, Component Decorator Decorator, Decoratee Facade Facade, Hidden Types Flyweight Flyweight Factory Proxy Proxy, Proxy Interface Chain of Responsibility Chain of Resposibility Mediator Mediator, Colleagues Observer Observer, Subject State State, Context, Concrete State Visitor Abstract Visitor, Visitee 59 D. デザインパターン検出ツールおよび和集合による併 用結果の検出精度 ここには,5.1.4 の実験結果で触れたデザインパターン検出ツールおよび和集合 による併用結果の検出精度を示す.表は各プロジェクトにおける個々の検出ツー ルおよび和集合による併用結果について,デザインパターンごとに検出箇所の TP(True Positive),FN(False Negative), FP(False Positive) および適合率,再 現率,F 値を示したものである.JHotDraw 6.0 beta 1 における個々の検出ツー ルおよび和集合による併用結果の検出精度を表 25 に, JHotDraw 5.1 を表 26 お よび表 27 に,JRefactory を表 28 に, Lexi を表 29 にそれぞれ示す. E. 併用アルゴリズムの検出精度 ここには,5.2.3 で触れた併用アルゴリズムの検出精度を示す.表は各プロジェ クトにおけるそれぞれの併用アルゴリズムによる併用結果について,デザイン パターンごとに検出箇所の TP(True Positive),FN(False Negative), FP(False Positive) および適合率,再現率,F 値を示したものである.JHotDraw 6.0 beta 1 における個々の検出ツールおよび和集合による併用結果の検出精度を表 30 に, JHotDraw 5.1 を表 31 および表 32 に,JRefactory を表 33 に, Lexi を表 34 に それぞれ示す. 60 表 16 WOP のデザインパターンごとの検出範囲 デザインパターン名 ロール名 Abstract Factory Abstract Factory, Abstract Product, Concrete Factory, Concrete Product Singleton Singleton Adapter Adapter, Adaptee, Target Bridge Abstraction, Implementor, Refined Abstraction, Concrete Implementor Composite Composite, Component Proxy Proxy, Subject, Real Subject Template Method Abstract Class, Concrete Class 61 表 17 JHotDraw 6.0 beta 1 における各検出ツールの検出件数 DPdT DPRE PINOT WOP Abstract Factory - - 0 34 Factory Method 9 - 17 - Prototype 6 - - - Singleton 8 - 0 1 Adapter 33 48 2 59 Bridge - 147 23 21 Composite 2 1 1 13 Decorator 13 0 5 - Facade - 18 21 - Flyweight - - 4 - Proxy 0 0 4 0 Chain of Responsibility - - 5 - 33 - - - Mediator - - 103 - Observer 11 - 0 - State 94 - 1 - Strategy 94 - 13 - Template Method 7 - 0 12 Visitor 1 - 1 0 Command 62 表 18 JHotDraw 5.1 における各検出ツールの検出件数 DPdT DPRE PINOT WOP Abstract Factory - - 0 9 Factory Method 2 - 0 - Prototype 2 - - - Singleton 2 - 0 1 Adapter 23 40 0 32 Bridge - 1 1 34 Composite 1 0 0 5 Decorator 3 0 0 - Facade - 9 0 - Flyweight - - 1 - Proxy 0 0 2 1 Chain of Responsibility - - 0 - 23 - - - Mediator - - 0 - Observer 4 - 1 - State 44 - 0 - Strategy 44 - 1 - Template Method 5 - 0 0 Visitor 0 - 1 0 Command 63 表 19 JRefactory における各検出ツールの検出件数 DPdT DPRE PINOT WOP Abstract Factory - - 0 2 Factory Method 1 - 8 - Prototype 0 - - - Singleton 12 - 3 7 Adapter 26 34 12 0 Bridge - 31 3 0 Composite 0 0 8 0 Decorator 0 0 0 - Facade - 9 86 - Flyweight - - 1 - 14 3 29 0 - - 0 - 26 - - - Mediator - - 262 - Observer 2 - 5 - State 37 - 2 - Strategy 37 - 15 - Template Method 16 - 0 6 2 - 0 0 Proxy Chain of Responsibility Command Visitor 64 表 20 Lexi における各検出ツールの検出件数 DPdT DPRE PINOT WOP Abstract Factory - - 0 1 Factory Method 0 - 3 - Prototype 0 - - - Singleton 2 - 1 2 Adapter 14 3 0 0 Bridge - 23 0 0 Composite 0 0 0 0 Decorator 0 0 0 - Facade - 3 1 - Flyweight - - 2 - Proxy 0 0 6 0 Chain of Responsibility - - 0 - 14 - - - Mediator - - 50 - Observer 0 - 0 - State 9 - 0 - Strategy 9 - 8 - Template Method 0 - 0 1 Visitor 0 - 0 0 Command 65 表 21 JHotDraw 6.0 beta 1 における検出箇所の一致件数 1 種類 2 種類 3 種類 4 種類 Abstract Factory 34 0 - - Factory Method 22 2 - - Prototype 6 - - - Singleton 7 1 0 - Adapter 125 4 3 0 Bridge 154 17 1 - Composite 13 2 0 0 Decorator 14 2 0 - Facade 35 2 - - Flyweight 4 - - - Proxy 4 0 0 0 Chain of Responsibility 5 - - - Command 33 - - - Mediator 103 - - - Observer 11 0 - - State 93 1 - - Strategy 97 5 - - Template Method 7 6 0 - Visitor 2 0 0 - 66 表 22 JHotDraw 5.1 における検出箇所の一致件数 1 種類 2 種類 3 種類 4 種類 Abstract Factory 9 0 - - Factory Method 2 0 - - Prototype 2 - - - Singleton 1 1 0 - Adapter 57 10 6 0 Bridge 86 12 0 - Composite 4 1 0 0 Decorator 3 0 0 - Facade 9 0 - - Flyweight 1 - - - Proxy 3 0 0 0 Chain of Responsibility 0 - - - Command 23 - - - Mediator 0 - - - Observer 5 0 - - State 44 0 - - Strategy 43 1 - - Template Method 5 0 0 - Visitor 1 0 0 - 67 表 23 JRefactory における検出箇所の一致件数 1 種類 2 種類 3 種類 4 種類 Abstract Factory 2 0 - - Factory Method 7 1 - - Prototype 0 - - - Singleton 3 8 1 - Adapter 58 7 0 0 Bridge 34 0 0 - Composite 8 0 0 0 Decorator 0 0 0 - 95 0 - - 1 - - - 24 8 2 0 0 - - - Command 26 - - - Mediator 262 - - - Observer 7 0 - - State 35 2 - - Strategy 30 11 - - Template Method 10 6 0 - 2 0 0 - Facade Flyweight Proxy Chain of Responsibility Visitor 68 表 24 Lexi における検出箇所の一致件数 1 種類 2 種類 3 種類 4 種類 Abstract Factory 1 0 - - Factory Method 3 0 - - Prototype 0 - - - Singleton 0 1 1 - Adapter 15 1 0 0 Bridge 23 0 0 - Composite 0 0 0 0 Decorator 0 0 0 - Facade 4 0 - - Flyweight 2 - - - Proxy 6 0 0 0 Chain of Responsibility 0 - - - Command 14 - - - Mediator 50 - - - Observer 0 0 - - State 9 0 - - Strategy 1 8 - - Template Method 1 0 0 - Visitor 0 0 0 - 表 25 JHotDraw 6.0 beta 1 の Strategy パターンに関する検出ツールごとの検出 精度 TP FP FN 適合率 再現率 F値 DPdT 54 40 11 0.574 0.831 0.679 PINOT 9 4 56 0.692 0.138 0.231 58 44 7 0.569 0.892 0.695 併用 (和集合) 69 表 26 JHotDraw 5.1 における検出ツールごとの検出精度 (1) パターン名 Adapter Command Composite Decorator DPRE PINOT WOP 和集合 TP/FN/FP 3/165/20 4/164/36 0/168/0 2/166/30 5/163/68 DPdT 適合率 0.130 0.1 0 0.0625 0.0685 再現率 0.0179 0.0238 0 0.0119 0.0298 F値 0.0314 0.0385 0 0.02 0.0415 0/16/23 -/16/- -/16/- -/16/- 0/16/23 適合率 0 - - - 0 再現率 0 - - - 0 F値 0 - - - 0 1/4/0 0/5/0 0/5/0 1/4/4 1/4/4 適合率 1 0 0 0.2 0.2 再現率 0.2 0 0 0.2 0.2 F値 0.333 0 0 0.2 0.2 TP/FN/FP 1/0/2 -/1/- 0/1/0 -/1/- 1/0/2 適合率 0.333 - 0 - 0.333 再現率 1 - 0 - 1 0.5 - 0 - 0.5 0/2/2 -/2/- 0/2/0 -/2/- 0/2/2 TP/FN/FP TP/FN/FP F値 Factory TP/FN/FP Method 適合率 0 - 0 - 0 再現率 0 - 0 - 0 F値 0 - 0 - 0 1/1/3 -/2/- 0/2/1 -/2/- 1/1/4 適合率 0.25 - 0 - 0.2 再現率 0.5 - 0 - 0.5 0.333 - 0 - 0.286 Observer TP/FN/FP F値 70 表 27 JHotDraw 5.1 における検出ツールごとの検出精度 (2) パターン名 Prototype Singleton State DPdT DPRE TP/FN/FP WOP 和集合 2/0/0 -/2/- -/2/- -/2/- 2/0/0 適合率 1 - - - 1 再現率 1 - - - 1 F値 1 - - - 1 2/0/0 -/2/- 0/2/0 1/1/0 2/0/0 適合率 1 - 0 1 1 再現率 1 - 0 0.5 1 F値 1 - 0 0.667 1 TP/FN/FP 1/1/43 -/2/- 0/2/0 -/2/- 1/1/43 TP/FN/FP 適合率 0.0227 - 0 - 0.0227 再現率 0.5 - 0 - 0.5 0.435 - 0 - 0.435 TP/FN/FP 3/1/41 -/4/- 0/4/1 -/4/- 3/1/41 F値 Strategy PINOT 適合率 0.0682 - 0 - 0.0682 再現率 0.75 - 0 - 0.75 0.125 - 0 - 0.125 F値 71 表 28 JRefactory における検出ツールごとの検出精度 パターン名 Adapter DPdT DPRE PINOT WOP 和集合 TP/FN/FP 0/16/26 0/16/34 0/16/12 0/16/0 0/16/65 適合率 0 0 0 0 0 再現率 0 0 0 0 0 F値 0 0 0 0 0 0/1/1 -/1/- 0/1/8 -/1/- 0/1/8 Factory TP/FN/FP Method 適合率 0 - 0 - 0 再現率 0 - 0 - 0 F値 0 - 0 - 0 TP/FN/FP 1/1/11 -/2/- 0/2/3 1/1/6 1/1/11 適合率 0.0833 - 0 143 0.833 再現率 0.5 - 0 0.5 0.5 0.143 - 0 0.222 0.143 0/1/37 -/1/- 0/1/2 -/1/- 0/1/37 適合率 0 - 0 - 0 再現率 0 - 0 - 0 F値 0 - 0 - 0 2/0/0 -/2/- 0/2/0 -/2/- 2/0/0 適合率 1 - 0 - 1 再現率 1 - 0 - 1 F値 1 - 0 - 1 Singleton F値 State Visitor TP/FN/FP TP/FN/FP 72 表 29 Lexi における検出ツールごとの検出精度 パターン名 Builder Observer Singleton WOP 和集合 DPdT DPRE PINOT -/1/- -/1/- -/1/- -/1/- -/1/- 適合率 - - - - - 再現率 - - - - - F値 - - - - - 0/8/0 -/8/- 0/8/0 -/8/- 0/8/0 適合率 0 - 0 - 0 再現率 0 - 0 - 0 F値 0 - 0 - 0 2/0/0 0/2/0 1/1/0 2/0/0 2/0/0 適合率 1 0 1 1 1 再現率 1 0 0.5 1 1 F値 1 0 0.667 1 1 TP/FN/FP TP/FN/FP TP/FN/FP 表 30 JHotDraw 6.0 beta 1 の Strategy パターンに関する併用アルゴリズムの検 出精度 TP FP FN 適合率 再現率 F値 和集合 58 44 7 0.569 0.892 0.695 多数決 11 8 54 0.579 0.169 0.262 適性値付き和集合 58 44 7 0.569 0.892 0.695 73 表 31 JHotDraw 5.1 における併用アルゴリズムの検出精度 (1) パターン名 Adapter Command Composite Decorator 和集合 多数決 適性値付き和集合 TP/FN/FP 5/163/68 4/164/62 4/164/68 適合率 0.0685 0.0606 0.0556 再現率 0.0298 0.0238 0.0238 F値 0.0415 0.0342 0.0333 0/16/23 0/16/0 0/16/2 適合率 0 0 0 再現率 0 0 0 F値 0 0 0 1/4/4 1/4/2 1/4/4 適合率 0.2 0.333 0.2 再現率 0.2 0.2 0.2 F値 0.2 0.25 0.2 TP/FN/FP 1/0/2 0/1/0 0/1/1 適合率 0.333 0 0 再現率 1 0 0 0.5 0 0 0/2/2 0/2/0 0/2/2 TP/FN/FP TP/FN/FP F値 Factory TP/FN/FP Method 適合率 0 0 0 再現率 0 0 0 F値 0 0 0 1/1/4 1/1/0 1/1/4 適合率 0.2 1 0.2 再現率 0.5 0.5 0.5 0.286 0.667 0.286 Observer TP/FN/FP F値 74 表 32 JHotDraw 5.1 における併用アルゴリズムの検出精度 (2) パターン名 Prototype Singleton State 和集合 多数決 適性値付き和集合 2/0/0 0/2/0 1/1/0 適合率 1 0 1 再現率 1 0 0.5 F値 1 0 0.667 2/0/0 1/1/0 2/0/0 適合率 1 1 1 再現率 1 0.5 1 F値 1 0.667 1 TP/FN/FP 1/1/43 0/2/1 1/1/43 TP/FN/FP TP/FN/FP 適合率 0.0227 0 0.0227 再現率 0.5 0 0.5 0.435 0 0.435 TP/FN/FP 3/1/41 1/3/1 3/1/41 F値 Strategy 適合率 0.0682 0.5 0.682 再現率 0.75 0.25 0.75 0.125 0.333 0.125 F値 75 表 33 JRefactory における併用アルゴリズムの検出精度 パターン名 Adapter 和集合 多数決 適性値付き和集合 TP/FN/FP 0/16/65 0/16/59 0/16/65 適合率 0 0 0 再現率 0 0 0 F値 0 0 0 0/1/8 0/1/0 0/1/7 Factory TP/FN/FP Method 適合率 0 0 0 再現率 0 0 0 F値 0 0 0 TP/FN/FP 1/1/11 1/1/7 1/1/9 適合率 0.0833 0.125 0.1 再現率 0.5 0.5 0.5 0.143 0.2 0.167 0/1/37 0/1/4 0/1/37 適合率 0 0 0 再現率 0 0 0 F値 0 0 0 2/0/0 0/2/0 2/0/0 適合率 1 0 1 再現率 1 0 1 F値 1 0 1 Singleton F値 State Visitor TP/FN/FP TP/FN/FP 76 表 34 Lexi における併用アルゴリズムの検出精度 パターン名 Builder Observer Singleton 和集合 多数決 適性値付き和集合 -/1/- -/1/- -/1/- 適合率 - - - 再現率 - - - F値 - - - 0/8/0 0/8/0 0/8/0 適合率 0 0 0 再現率 0 0 0 F値 0 0 0 2/0/0 2/0/0 0/2/0 適合率 1 1 0 再現率 1 1 0 F値 1 1 0 TP/FN/FP TP/FN/FP TP/FN/FP 77
© Copyright 2024 Paperzz