(57)【特許請求の範囲】
【請求項１】
評価対象となるソフトウェア構成要素について、仮称と、種別と、抽出条件と、が対応付けられて設定された第１パターン情報データと、アンチパターンを構成する依存元及び依存先のソフトウェア構成要素について、それぞれの仮称と、両者間の依存関係における条件と、が対応付けられて設定された第２パターン情報データと、を記憶するパターン情報記憶手段と、
評価対象となるソースコードに含まれるソフトウェア構成要素について、名称と、種別と、包含される他のソフトウェア構成要素の数についての情報と、が対応付けられて設定された構成要素データと、前記ソースコードに含まれる依存元及び依存先のソフトウェア構成要素について、それぞれの名称と、両者間の依存関係における依存種別毎の依存頻度と、が対応付けられて設定された依存関係データと、を記憶するメモリと、
前記第１パターン情報データと、前記第２パターン情報データと、前記構成要素データと、前記依存関係データと、に基づいて、前記ソースコードに含まれているアンチパターンを構成する依存元及び依存先のそれぞれのソフトウェア構成要素の名称を抽出するパターン抽出手段と、を備える、ソフトウェア評価支援装置。
【請求項２】
評価対象となるソフトウェアに対応したソースコードを記憶するソースコード記憶部と、
前記ソースコードから、前記構成要素データと、前記依存関係データと、を生成し、前記メモリに保存する依存関係抽出手段と、をさらに備える、請求項１に記載のソフトウェア評価支援装置。
【請求項３】
コンピュータを、
パターン情報記憶手段にそれぞれ記憶されている、評価対象となるソフトウェア構成要素について、仮称と、種別と、抽出条件と、が対応付けられて設定された第１パターン情報データ及びアンチパターンを構成する依存元及び依存先のソフトウェア構成要素について、それぞれの仮称と、両者間の依存関係における条件と、が対応付けられて設定された第２パターン情報データと、所定のメモリにそれぞれ記憶されている、評価対象となるソースコードに含まれるソフトウェア構成要素について、名称と、種別と、包含される他のソフトウェア構成要素の数についての情報と、が対応付けられて設定された構成要素データ及び前記ソースコードに含まれる依存元及び依存先のソフトウェア構成要素について、それぞれの名称と、両者間の依存関係における依存種別毎の依存頻度と、が対応付けられて設定された依存関係データと、に基づいて、前記ソースコードに含まれているアンチパターンを構成する依存元及び依存先のそれぞれのソフトウェア構成要素の名称を抽出するパターン抽出手段として機能させる、プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ソフトウェアの品質評価を支援する技術に関する。
【背景技術】
【０００２】
ソフトウェアの品質評価に関するツールとして、例えば、ＤＳＭ（Dependency Structure Matrix）と呼ばれるアーキテクチャ分析手法を採用したＬａｔｔｉｘ（米国Ｌａｔｔｉｘ社）が知られている。この“Ｌａｔｔｉｘ”では、ソースコードを解析して、当該ソフトウェアの構成要素（モジュール等）間の依存関係を抽出し、抽出した依存関係を直感的に判り易くするため表形式(マトリクス)で定量的に表して可視化する。これにより、当該ソフトウェアにおける構成要素の依存関係の把握が容易となり、結果として、開発効率及び品質の向上が図れる。
【０００３】
ところで、ソフトウェアの品質評価として、いわゆる「アンチパターン」と呼ばれる、デザインパターンとは真逆となるパターン（保守性を悪化させる等、不適切なソフトウェア構造をパターン化したもの）を漏れなく検出することも重要な作業の一つである。
【０００４】
しかしながら、従来のアンチパターン検出作業においては、ソースコードから上記のように抽出した構成要素間の依存関係を人手でたどっていく必要があった。そのため、ソフトウェアの規模が大きい場合には多大な労力を要していた。
【０００５】
上記の問題に関連して、例えば、特許文献１に記載の発明では、ソフトウェアのソースコードに付与された所定のアノテーションを解析して、ソフトウェアを構成する構成要素と構成要素同士の関連を示す関連要素を抽出する。そして、抽出した構成要素又は関連要素と、予め定義しておいた、ソフトウェアの構造として回避されるべき不適切な構造を表す不良パターン情報とを照合することで、不良パターンに該当する構成要素又は関連要素を検出する。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２００７−２６５０８９号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
特許文献１に記載の発明では、ソースコードから上記の構成要素と関連要素とを抽出するために、予め当該ソースコードに所定のアノテーションを付加しておく必要があり、ソフトウェアの規模が大きくなると、その手間も当然のことながら大きくなってしまうという問題が生じる。
【０００８】
本発明は、上記課題を解決するためになされたものであり、アノテーション等が付加されていないソースコードであっても、アンチパターンを自動検出できるソフトウェア評価支援装置及びプログラムを提供することを目的とする。
【課題を解決するための手段】
【０００９】
上記目的を達成するため、本発明に係るソフトウェア評価支援装置は、
評価対象となるソフトウェア構成要素について、仮称と、種別と、抽出条件と、が対応付けられて設定された第１パターン情報データと、アンチパターンを構成する依存元及び依存先のソフトウェア構成要素について、それぞれの仮称と、両者間の依存関係における条件と、が対応付けられて設定された第２パターン情報データと、を記憶するパターン情報記憶手段と、
評価対象となるソースコードに含まれるソフトウェア構成要素について、名称と、種別と、包含される他のソフトウェア構成要素の数についての情報と、が対応付けられて設定された構成要素データと、前記ソースコードに含まれる依存元及び依存先のソフトウェア構成要素について、それぞれの名称と、両者間の依存関係における依存種別毎の依存頻度と、が対応付けられて設定された依存関係データと、を記憶するメモリと、
前記第１パターン情報データと、前記第２パターン情報データと、前記構成要素データと、前記依存関係データと、に基づいて、前記ソースコードに含まれているアンチパターンを構成する依存元及び依存先のそれぞれのソフトウェア構成要素の名称を抽出するパターン抽出手段と、を備える。
【発明の効果】
【００１０】
本発明によれば、アノテーション等が付加されていないソースコードであっても、ソースコード中のアンチパターンを自動検出できるため、ソフトウェアの品質評価作業の効率向上が図れる。
【図面の簡単な説明】
【００１１】
【図１】本発明の実施形態に係るソフトウェア評価支援装置の構成を示すブロック図である。
【図２】本実施形態のソフトウェア評価支援装置が備える制御部の構成を示すブロック図である。
【図３】本実施形態において、評価対象となるソースコードの一例を示す図である。
【図４】本実施形態の構成要素リストの一例を示す図である。
【図５】本実施形態の依存関係リストの一例を示す図である。
【図６】本実施形態の第１パターン情報リストの一例を示す図である。
【図７】本実施形態の第１パターン情報リストの「抽出条件」について説明するための図である。
【図８】本実施形態の第２パターン情報リストの一例を示す図である。
【図９】本実施形態の第２パターン情報リストの「依存関係条件」について説明するための図である。
【図１０】本実施形態のソフトウェア評価支援処理の手順を示すフローチャートである。
【図１１】本実施形態のパターン抽出処理の手順を示すフローチャート（その１）である。
【図１２】本実施形態のパターン抽出処理の手順を示すフローチャート（その２）である。
【図１３】本実施形態のパターン抽出処理の手順を示すフローチャート（その３）である。
【図１４】本実施形態のパターン一致リストの一例を示す図である。
【発明を実施するための形態】
【００１２】
以下、本発明の実施形態について図面を参照して詳細に説明する。
【００１３】
図１は、本発明の実施形態に係るソフトウェア評価支援装置１の全体構成を示す図である。このソフトウェア評価支援装置１は、所定のプログラミング言語で作成されたソフトウェアにおいて、その品質の評価を支援する装置である。
【００１４】
このソフトウェア評価支援装置１のハードウェア構成は、一般的なパーソナルコンピュータと同等である。即ち、ソフトウェア評価支援装置１は、何れも図示しないが、ＣＰＵ（Central Processing Unit），ＲＯＭ（Read Only Memory），ＲＡＭ（Random Access Memory）等から構成される制御装置、読み書き可能な不揮発性の半導体メモリやハードディスクドライブ等から構成される外部記憶装置、キーボード，マウス，キーパッド，タッチパッドやタッチパネル等から構成される入力装置、ＣＲＴや液晶モニタ等から構成される表示装置等を備える。
【００１５】
ソフトウェア評価支援装置１は、機能的には、図１に示すように、入力部１０と、表示部１１と、ソースコード記憶部１２と、パターン情報記憶部１３と、制御部１４と、を備える。
【００１６】
入力部１０は、ユーザからの入力操作を受け付け、受け付けた入力操作に係る信号を制御部１４に送出する。
【００１７】
表示部１１は、制御部１４の制御の下、ユーザ操作用の画面の表示を行う。
【００１８】
ソースコード記憶部１２は、評価対象となるソフトウェアに対応したソースコードを記憶する。ソースコードは、所定のプログラミング言語に従って記述されたプログラムコードであり、本実施形態では、Ｃ＋＋（シープラスプラス）言語の仕様に従って記述されている。
【００１９】
パターン情報記憶部１３は、制御部１４によって実行される後述のパターン抽出処理の際に、制御部１４によって参照されるパターン情報リストを記憶する。
【００２０】
制御部１４は、入力部１０、表示部１１、ソースコード記憶部１２及びパターン情報記憶部１３を制御し、それに付随して、これらとの間でデータの授受を行う。制御部１４は、機能的には、図２に示すように、依存関係抽出部１４１と、パターン抽出部１４２と、を備える。これらの各機能部は、ＣＰＵ等が、ＲＯＭ又は外部記憶装置に記憶されている、所定のプログラムを実行することで実現する。このプログラム（ソフトウェア評価支援プログラム）は、ソフトウェア評価支援装置１にて、ユーザに対してソフトウェアの評価を支援するための一連の処理を行うためのアプリケーションソフトウェアである。
【００２１】
依存関係抽出部１４１は、従来の手法により、ソースコード記憶部１２に記憶されているソースコード１２１から、ソフトウェアの構成要素（以下、単に「構成要素」と称する。）と、構成要素間の依存関係を抽出し、抽出したそれぞれに基づいて、構成要素リスト１５及び依存関係リスト１６を生成する。ソースコード１２１の一例を図３に示す。ここで、従来の手法には、例えば、ＤＳＭを取り入れたソフトウェアの品質評価ツールである、米国Ｌａｔｔｉｘ社の“Ｌａｔｔｉｘ”により実現される技術等が該当する。
【００２２】
依存関係抽出部１４１は、生成した構成要素リスト１５及び依存関係リスト１６をＲＡＭ又は外部記憶装置に保存する。
【００２３】
構成要素リスト１５は、ソースコード１２１に含まれる構成要素についての情報がリストアップされたデータである。より詳細には、構成要素リスト１５は、図４に示すように、「要素名」と、「要素種別」と、「包含要素数」と、から構成されるレコードが複数設定されたデータテーブルである。「要素名」には、Ｃ＋＋、Ｊａｖａ（登録商標）等のプログラミング言語で作成されたソフトウェアを構成する要素であって、当該ソースコード１２１において記述された名称（例えば、クラス名、変数名、関数名、マクロ名等）が設定される。
【００２４】
「要素種別」には、当該構成要素の種別（例えば、クラス、変数、関数、マクロ等）を示す情報が設定される。「包含要素数」には、当該構成要素に包含される他の構成要素の数が、要素種別毎に設定される。図４の例では、先頭（番号１）のレコードにおいて、クラスである“Class1”には、構成要素として関数のみが含まれ、その数が１であることが示されており、番号２のレコードにおいて、クラスである“Class2”には、変数のみが含まれ、その数が２であることが示されており、番号３のレコードにおいて、クラスである“Class3”には、変数のみが含まれ、その数が１であることが示されている。
【００２５】
依存関係リスト１６は、ソースコード１２１に含まれる構成要素間の依存関係についての情報がリストアップされたデータである。より詳細には、依存関係リスト１６は、図５に示すように、「依存元要素名」と、「依存先要素名」と、「依存度数」と、から構成されるレコードが複数設定されたデータテーブルである。ここで、依存関係とは、ある構成要素が他の構成要素を含む場合や他の構成要素を引用するといったように、ある構成要素が他のソフトウェア構成要素に依存する関係をいう。依存関係には、例えば、インクルード、クラス参照、クラス継承、関数の呼出し、関数のオーバーライド、宣言、変数参照、変数書き込み、マクロの使用などがある。
【００２６】
「依存元要素名」には、依存元（即ち、依存する側）の構成要素のソースコード１２１上の名称が設定される。「依存先要素名」には、依存先（即ち、依存される側）の構成要素のソースコード１２１上の名称が設定される。「依存度数」には、当該依存元の構成要素と依存先の構成要素との間の依存関係において、依存の種別（依存種別）毎の依存の頻度（回数）が設定される。
【００２７】
図５の例では、先頭（番号１）のレコードにおいて、構成要素“Class1”から構成要素“Class2”への依存関係で、インクルード、クラス参照、クラス継承、関数の呼出し、関数のオーバーライド、宣言、変数書き込み及びマクロの使用のそれぞれの回数が０であり、変数参照の回数が１であることが示されており、同様に、番号２のレコードにおいても、構成要素“Class1”から構成要素“Class3”への依存関係で、インクルード、クラス参照、クラス継承、関数の呼出し、関数のオーバーライド、宣言、変数書き込み及びマクロの使用のそれぞれの回数が０であり、変数参照の回数が１であることが示されている。また、番号３のレコードにおいては、構成要素“Class2”から構成要素“Class3”への依存関係で、インクルード、クラス継承、関数の呼出し、関数のオーバーライド、宣言、変数参照、変数書き込み及びマクロの使用のそれぞれの回数が０であり、クラス参照の回数が１であることが示されている。
【００２８】
続いて、パターン情報記憶部１３に記憶されているパターン情報リストについて説明する。パターン情報リストには、図２に示すように、第１パターン情報リスト１３１と、第２パターン情報リスト１３２とが含まれる。第１パターン情報リスト１３１は、予めユーザにより設定された、ユーザが評価対象として抽出を所望する構成要素についての情報がリストアップされたデータである。より詳細には、第１パターン情報リスト１３１は、図６に示すように、「仮要素名」と、「実要素名」と、「要素種別」と、「抽出条件」と、から構成されるレコードが複数設定されたデータテーブルである。
【００２９】
「仮要素名」には、抽出を所望する構成要素の仮称が設定される。仮称の決め方は任意であり、本実施形態では、Ａ、Ｂ、Ｃ、…、といったようにアルファベットが順番に割り振られるものとする。「実要素名」は、当初、即ち、ユーザによる当該第１パターン情報リスト１３１の作成時点では未設定状態であり、後に、パターン抽出部１４２により、後述するパターン抽出処理にて、ソースコード１２１上の名称が格納される。
【００３０】
「要素種別」には、ユーザが抽出を所望する構成要素の種別（例えば、クラス、変数、関数、マクロ等）を示す情報が設定される。「抽出条件」には、抽出するための条件を示す情報が設定される。例えば、「抽出条件」には、上記条件が記述されたファイル（リスト）名がテキスト形式で設定される。「抽出条件」に設定される条件の一例を図７に示す。図７（ａ）は、条件１に対応する内容を示し、図７（ｂ）は、条件２に対応する内容を示している。
【００３１】
例えば、図６の先頭（番号１）のレコードでは、要素種別がクラスであり、包含する変数の数が０である構成要素に対して、仮要素名“Ａ”が付されるということが示されている。また、番号２のレコードでは、要素種別がクラスであり、包含する関数の数が０である構成要素に対して、仮要素名“Ｂ”が付されるということが示されている。
【００３２】
第２パターン情報リスト１３２は、予めユーザにより設定された、検出すべきアンチパターンについての情報がリストアップされたデータである。より詳細には、第２パターン情報リスト１３２は、図８に示すように、「仮依存元要素名」と、「実依存元要素名」と、「仮依存先要素名」と、「実依存先要素名」と、「依存関係条件」と、「チェック欄」と、から構成されるレコードが複数設定されたデータテーブルである。
【００３３】
「仮依存元要素名」には、アンチパターンを構成する依存元の構成要素の仮称が設定される。ここで、「仮依存元要素名」に設定される仮称と、第１パターン情報リスト１３１における「仮要素名」に設定される仮称とは、共通化されており、仮称が同一の場合は、同一の構成要素を示すこととなる。
【００３４】
「実依存元要素名」は、ユーザによる当該第２パターン情報リスト１３２の作成時点では未設定状態であり、後に、パターン抽出部１４２により、後述するパターン抽出処理にて、対応する依存元の構成要素として、ソースコード１２１上の名称が格納される。「仮依存先要素名」には、アンチパターンを構成する依存先の構成要素の仮称が設定される。ここで、上記の「仮依存元要素名」の場合と同様、「仮依存先要素名」に設定される仮称と、第１パターン情報リスト１３１における「仮要素名」に設定される仮称とは、共通化されており、仮称が同一の場合は、同一の構成要素を示すこととなる。
【００３５】
「実依存先要素名」は、ユーザによる当該第２パターン情報リスト１３２の作成時点では未設定状態であり、後に、パターン抽出部１４２により、後述するパターン抽出処理にて、依存先の構成要素として、ソースコード１２１上の名称が格納される。
【００３６】
「依存関係条件」には、当該アンチパターンを構成する依存元の構成要素と依存先の構成要素との間の依存関係における条件を示す情報が設定される。例えば、「依存関係条件」には、上記条件が記述されたファイル（リスト）名がテキスト形式で設定される。「依存関係条件」に設定される条件の内容の一例を図９に示す。図９（ａ）は、条件３に対応する内容を示し、図９（ｂ）は、条件４に対応する内容を示している。
【００３７】
例えば、図８の先頭（番号１）のレコードでは、仮称“Ａ”の依存元の構成要素と、仮称“Ｂ”の依存先の構成要素との間において、依存種別が変数参照であり、その依存度数が１以上であるという条件を満たす場合に、仮称“Ａ”の構成要素が仮称“Ｂ”の構成要素に依存するソフトウェア構造が、アンチパターンであることが示されている。
【００３８】
また、番号２のレコードでは、仮称“Ａ”の依存元の構成要素と、仮称“Ｃ”の依存先の構成要素との間において、依存種別が変数参照であり、その依存度数が１以上であるという条件を満たす場合に、仮称“Ａ”の構成要素が仮称“Ｃ”の構成要素に依存するソフトウェア構造が、アンチパターンであることが示されている。また、番号３のレコードでは、仮称“Ｂ”の依存元の構成要素と、仮称“Ｃ”の依存先の構成要素との間において、依存種別を問わず、依存度数が１以上である、換言すると、何れかの依存種別において、依存度数が１以上である、という条件を満たす場合に、仮称“Ｂ”の構成要素が仮称“Ｃ”の構成要素に依存するソフトウェア構造が、アンチパターンであることが示されている。
【００３９】
「チェック欄」は、ユーザによる当該第２パターン情報リスト１３２の作成時点では、チェック無し（０が設定）状態となっており、後に、パターン抽出部１４２により、後述するパターン抽出処理にて、必要に応じて、チェックが入れられる（１が設定される。）。
【００４０】
パターン抽出部１４２は、依存関係抽出部１４１により生成された構成要素リスト１５及び依存関係リスト１６と、パターン情報記憶部１３に予め記憶されている第１パターン情報リスト１３１及び第２パターン情報リスト１３２と、に基づいて、パターン一致リスト１７を生成し、出力する。パターン一致リスト１７は、第２パターン情報リスト１３２にリストアップされている、ユーザが予め設定したアンチパターンの中から、当該ソフトウェア（ソースコード１２１）に実際に含まれているアンチパターンをリストアップした結果を示すデータである。パターン一致リスト１７の詳細については後述する。
【００４１】
続いて、上記のように構成されるソフトウェア評価支援装置１において実行されるソフトウェア評価支援処理について説明する。このソフトウェア評価支援処理は、ユーザにより、入力部１０を介して、ＲＯＭ又は外部記憶装置に記憶されている、上述のソフトウェア評価支援プログラムを起動させるための所定操作が行われることで開始される。
【００４２】
図１０は、ソフトウェア評価支援処理の手順を示すフローチャートである。先ず、依存関係抽出部１４１は、ソースコード記憶部１２からソースコード１２１を読み出し（ステップＳ１０１）、読み出したソースコード１２１から、従来の手法により、ソフトウェアの構成要素と、構成要素間の依存関係を抽出し、抽出したそれぞれに基づいて、構成要素リスト１５及び依存関係リスト１６を生成する（ステップＳ１０２）。生成された構成要素リスト１５及び依存関係リスト１６はＲＡＭ等に保存される。
【００４３】
パターン抽出部１４２は、依存関係抽出部１４１により生成された構成要素リスト１５及び依存関係リスト１６と、パターン情報記憶部１３に予め記憶されている第１パターン情報リスト１３１及び第２パターン情報リスト１３２と、に基づいて、パターン抽出処理を実行する（ステップＳ１０３）。
【００４４】
以下、図１１〜図１３のフローチャートを参照して、パターン抽出処理の詳細を説明する。先ず、パターン抽出部１４２は、カウンタｉに０を設定し、変数Ｎｉに第１パターン情報リスト１３１のレコード数を設定する（図１１のステップＳ２０１）。そして、パターン抽出部１４２は、カウンタｉをインクリメントした後、カウンタｉの値が変数Ｎｉの値以下であるか否かを判定する（ステップＳ２０２）。その結果、カウンタｉの値が変数Ｎｉの値を超えている場合（ステップＳ２０２；ＮＯ）、パターン抽出部１４２は、図１３のステップＳ２２３の処理を実行する。
【００４５】
一方、カウンタｉの値が変数Ｎｉの値以下である場合（ステップＳ２０２；ＹＥＳ）、パターン抽出部１４２は、パターン情報記憶部１３に記憶されている第１パターン情報リスト１３１を読み出し、その先頭からカウンタｉの値番目のレコードを選択する（ステップＳ２０３）。また、パターン抽出部１４２は、カウンタｊに０を設定し、変数Ｎｊに構成要素リスト１５のレコード数を設定する（ステップＳ２０４）。
【００４６】
そして、パターン抽出部１４２は、カウンタｊをインクリメントした後、カウンタｊの値が変数Ｎｊの値以下であるか否かを判定する（ステップＳ２０５）。その結果、カウンタｊの値が変数Ｎｊの値を超えている場合（ステップＳ２０５；ＮＯ）、パターン抽出部１４２は、ステップＳ２０２の処理を再度実行する。
【００４７】
一方、カウンタｊの値が変数Ｎｊの値以下である場合（ステップＳ２０５；ＹＥＳ）、パターン抽出部１４２は、構成要素リスト１５の先頭からカウンタｊの値番目のレコードを選択する（ステップＳ２０６）。パターン抽出部１４２は、第１パターン情報リスト１３１の選択したレコードにおける要素種別と、構成要素リスト１５の選択したレコードにおける要素種別とが一致し、且つ、第１パターン情報リスト１３１の選択したレコードにおける抽出条件が成立しているか否かを判定する（ステップＳ２０７）。
【００４８】
その結果、ステップＳ２０７の判定がＮＯの場合、パターン抽出部１４２は、ステップＳ２０５の処理を再度実行する。一方、ステップＳ２０７の判定がＹＥＳの場合、パターン抽出部１４２は、構成要素リスト１５の選択したレコードにおける要素名を、第１パターン情報リスト１３１の選択したレコードにおける実要素名に格納する（ステップＳ２０８）。
【００４９】
次に、パターン抽出部１４２は、パターン情報記憶部１３から第２パターン情報リスト１３２を読み出し、読み出した第２パターン情報リスト１３２において、第１パターン情報リスト１３１の選択したレコードにおける仮要素名と一致する仮依存元要素名を有するレコードがあるか否かを判定する（ステップＳ２０９）。その結果、ステップＳ２０９の判定がＮＯの場合、パターン抽出部１４２は、図１２のステップＳ２１１の処理を実行する。
【００５０】
一方、ステップＳ２０９の判定がＹＥＳの場合、パターン抽出部１４２は、第２パターン情報リスト１３２の該当する全てのレコードについて、実依存元要素名に、構成要素リスト１５の選択したレコードにおける要素名を格納する（ステップＳ２１０）。
【００５１】
図１２のステップＳ２１１では、パターン抽出部１４２は、第２パターン情報リスト１３２において、第１パターン情報リスト１３１の選択したレコードにおける仮要素名と一致する仮依存先要素名を有するレコードがあるか否かを判定する。その結果、ステップＳ２１１の判定がＮＯの場合、パターン抽出部１４２は、ステップＳ２１３の処理を実行する。
【００５２】
一方、ステップＳ２１１の判定がＹＥＳの場合、パターン抽出部１４２は、第２パターン情報リスト１３２の該当する全てのレコードについて、実依存先要素名に、構成要素リスト１５の選択したレコードにおける要素名を格納する（ステップＳ２１２）。
【００５３】
続くステップＳ２１３では、パターン抽出部１４２は、カウンタｋに０を設定し、変数Ｎｋに依存関係リスト１６のレコード数を設定する。そして、パターン抽出部１４２は、カウンタｋをインクリメントした後、カウンタｋの値が変数Ｎｋの値以下であるか否かを判定する（ステップＳ２１４）。その結果、カウンタｋの値が変数Ｎｋの値を超えている場合（ステップＳ２１４；ＮＯ）、パターン抽出部１４２は、図１１のステップＳ２０５の処理を再度実行する。
【００５４】
一方、カウンタｋの値が変数Ｎｋの値以下である場合（ステップＳ２１４；ＹＥＳ）、パターン抽出部１４２は、依存関係リスト１６の先頭からカウンタｋの値番目のレコードを選択する（ステップＳ２１５）。パターン抽出部１４２は、依存関係リスト１６において、構成要素リスト１５の選択したレコードにおける要素名と一致する依存元要素名又は依存先要素名を有するレコードがあるか否かを判定する（ステップＳ２１６）。その結果、ステップＳ２１６の判定がＮＯの場合、パターン抽出部１４２は、ステップＳ２１４の処理を再度実行する。
【００５５】
一方、ステップＳ２１６の判定がＹＥＳの場合、パターン抽出部１４２は、カウンタｌに０を設定し、変数Ｎｌに第２パターン情報リスト１３２のレコード数を設定する（ステップＳ２１７）。そして、パターン抽出部１４２は、カウンタｌをインクリメントした後、カウンタｌの値が変数Ｎｌの値以下であるか否かを判定する（ステップＳ２１８）。その結果、カウンタｌの値が変数Ｎｌの値を超えている場合（ステップＳ２１８；ＮＯ）、パターン抽出部１４２は、ステップＳ２１４の処理を再度実行する。
【００５６】
一方、カウンタｌの値が変数Ｎｌの値以下である場合（ステップＳ２１８；ＹＥＳ）、パターン抽出部１４２は、第２パターン情報リスト１３２の先頭からカウンタｌの値番目のレコードを選択する（ステップＳ２１９）。
【００５７】
続く図１３のステップＳ２２０では、パターン抽出部１４２は、第２パターン情報リスト１３２の選択したレコードにおける実依存元要素名及び実依存先要素名と、依存関係リスト１６の選択したレコードにおける依存元要素名及び依存先要素名とがそれぞれ一致し、且つ、第２パターン情報リスト１３２の選択したレコードにおける依存関係条件が、依存関係リスト１６の選択したレコードにおける依存度数の内容に適合しているか否かを判定する。その結果、ステップＳ２２０の判定がＮＯの場合、パターン抽出部１４２は、図１２のステップＳ２１８の処理を再度実行する。
【００５８】
一方、ステップＳ２２０の判定がＹＥＳの場合、パターン抽出部１４２は、第２パターン情報リスト１３２の選択したレコードにおけるチェック欄に１を格納する（ステップＳ２２１）。パターン抽出部１４２は、第２パターン情報リスト１３２の全レコードのチェック欄に１が格納されているか否かを判定する（ステップＳ２２２）。全レコードのチェック欄に１が格納されている場合（ステップＳ２２２；ＹＥＳ）、パターン抽出部１４２は、ステップＳ２２３の処理を実行する。一方、何れかのレコードのチェック欄に１が格納されていない場合（ステップＳ２２２；ＮＯ）、パターン抽出部１４２は、図１２のステップＳ２１８の処理を再度実行する。
【００５９】
ステップＳ２２３では、パターン抽出部１４２は、第２パターン情報リスト１３２から、パターン一致リスト１７を生成する（ステップＳ２２３）。具体的には、パターン抽出部１４２は、第２パターン情報リスト１３２から、チェック欄に１が設定されているレコードを全て抽出する。そして、パターン抽出部１４２は、抽出した各レコードから、「仮依存元要素名」、「仮依存先要素名」及び「チェック欄」の各項目を削除する。これにより、図１４に示すようなパターン一致リスト１７が生成される。生成されたパターン一致リスト１７は、ＲＯＭ又は外部記憶装置に保存され、ユーザによる入力部１０を介した所定操作により、その内容が表示部１１にて所定態様で表示される。
【００６０】
なお、第２パターン情報リスト１３２の何れのレコードにおいてもチェック欄に１が設定されていない場合、パターン抽出部１４２は、アンチパターンが検出されなかった旨を所定態様でユーザに報知する。この場合、例えば、パターン抽出部１４２は、“アンチパターンは検出されませんでした”等のメッセージを表示部１１に表示させる。
【００６１】
以上説明したように、本発明の本実施形態に係るソフトウェア評価支援装置１によれば、依存関係抽出部１４１は、ソースコード記憶部１２に記憶されているソースコード１２１から、ソフトウェアの構成要素と、構成要素間の依存関係を抽出し、抽出したそれぞれに基づいて、構成要素リスト１５及び依存関係リスト１６を生成する。そして、パターン抽出部１４２は、構成要素リスト１５及び依存関係リスト１６と、ユーザが評価対象として抽出を所望する構成要素についての情報がリストアップされた第１パターン情報リスト１３１と、検出すべきアンチパターンについての情報がリストアップされた第２パターン情報リスト１３２と、に基づいて、ソースコード１２１に実際に含まれているアンチパターンを検出し、その結果として、パターン一致リスト１７を生成する。このように、アノテーション等が付加されていないソースコードであっても、ソースコード１２１に内在するアンチパターンを自動検出できるため、ソフトウェアの品質評価作業の効率向上が図れる。
【００６２】
なお、本発明は、上記実施形態に限定されず、本発明の要旨を逸脱しない範囲での種々の変更は勿論可能である。
【００６３】
例えば、上記実施形態では、ソフトウェア評価支援装置１の制御部１４は、依存関係抽出部１４１を備え、ソースコード記憶部１２に記憶されているソースコード１２１から、構成要素リスト１５及び依存関係リスト１６を生成していたが、かかる構成に限定されることはない。本発明には、依存関係抽出部１４１を備えない構成のソフトウェア評価支援装置も含まれる。その場合のソフトウェア評価支援装置は、他の装置で生成された構成要素リスト１５及び依存関係リスト１６を用いてパターン一致リスト１７を生成する。
【００６４】
また、上記実施形態のソフトウェア評価支援装置１が実行したプログラムを、既存のパーソナルコンピュータ（ＰＣ）等に適用することで、当該ＰＣを本発明に係るソフトウェア評価支援装置として機能させることも可能である。
【００６５】
このようなプログラムの配布方法は任意であり、例えば、ＣＤ−ＲＯＭ（Compact Disk Read-Only Memory）、ＤＶＤ（Digital Versatile Disk）、ＭＯ（Magneto Optical Disk）、メモリカードなどのコンピュータ読み取り可能な記録媒体に格納して配布してもよいし、インターネットなどの通信ネットワークを介して配布してもよい。  
【００６６】
本発明は、本発明の広義の精神と範囲を逸脱することなく、様々な実施の形態及び変形が可能とされるものである。また、上述した実施の形態は、本発明を説明するためのものであり、本発明の範囲を限定するものではない。つまり、本発明の範囲は、実施の形態ではなく、特許請求の範囲によって示される。そして、特許請求の範囲内及びそれと同等の発明の意義の範囲内で施される様々な変形が、本発明の範囲内とみなされる。
【符号の説明】
【００６７】
１      ソフトウェア評価支援装置
１０    入力部
１１    表示部
１２    ソースコード記憶部
１３    パターン情報記憶部
１４    制御部
１５    構成要素リスト
１６    依存関係リスト
１７    パターン一致リスト
１２１  ソースコード
１３１  第１パターン情報リスト
１３２  第２パターン情報リスト
１４１  依存関係抽出部
１４２  パターン抽出部
【図１】
0005826099.tif 000002
【図２】
0005826099.tif 000003
【図３】
0005826099.tif 000004
【図４】
0005826099.tif 000005
【図５】
0005826099.tif 000006
【図６】
0005826099.tif 000007
【図７】
0005826099.tif 000008
【図８】
0005826099.tif 000009
【図９】
0005826099.tif 000010
【図１０】
0005826099.tif 000011
【図１１】
0005826099.tif 000012
【図１２】
0005826099.tif 000013
【図１３】
0005826099.tif 000014
【図１４】
0005826099.tif 000015