(58)【調査した分野】(Int.Cl.,DB名)
【発明を実施するための形態】
【0012】
以下、本発明の実施形態について図面を参照して詳細に説明する。
【0013】
図1は、本発明の実施形態に係るソフトウェア評価支援装置1の全体構成を示す図である。このソフトウェア評価支援装置1は、所定のプログラミング言語で作成されたソフトウェアにおいて、その品質の評価を支援する装置である。
【0014】
このソフトウェア評価支援装置1のハードウェア構成は、一般的なパーソナルコンピュータと同等である。即ち、ソフトウェア評価支援装置1は、何れも図示しないが、CPU(Central Processing Unit),ROM(Read Only Memory),RAM(Random Access Memory)等から構成される制御装置、読み書き可能な不揮発性の半導体メモリやハードディスクドライブ等から構成される外部記憶装置、キーボード,マウス,キーパッド,タッチパッドやタッチパネル等から構成される入力装置、CRTや液晶モニタ等から構成される表示装置等を備える。
【0015】
ソフトウェア評価支援装置1は、機能的には、
図1に示すように、入力部10と、表示部11と、ソースコード記憶部12と、パターン情報記憶部13と、制御部14と、を備える。
【0016】
入力部10は、ユーザからの入力操作を受け付け、受け付けた入力操作に係る信号を制御部14に送出する。
【0017】
表示部11は、制御部14の制御の下、ユーザ操作用の画面の表示を行う。
【0018】
ソースコード記憶部12は、評価対象となるソフトウェアに対応したソースコードを記憶する。ソースコードは、所定のプログラミング言語に従って記述されたプログラムコードであり、本実施形態では、C++(シープラスプラス)言語の仕様に従って記述されている。
【0019】
パターン情報記憶部13は、制御部14によって実行される後述のパターン抽出処理の際に、制御部14によって参照されるパターン情報リストを記憶する。
【0020】
制御部14は、入力部10、表示部11、ソースコード記憶部12及びパターン情報記憶部13を制御し、それに付随して、これらとの間でデータの授受を行う。制御部14は、機能的には、
図2に示すように、依存関係抽出部141と、パターン抽出部142と、を備える。これらの各機能部は、CPU等が、ROM又は外部記憶装置に記憶されている、所定のプログラムを実行することで実現する。このプログラム(ソフトウェア評価支援プログラム)は、ソフトウェア評価支援装置1にて、ユーザに対してソフトウェアの評価を支援するための一連の処理を行うためのアプリケーションソフトウェアである。
【0021】
依存関係抽出部141は、従来の手法により、ソースコード記憶部12に記憶されているソースコード121から、ソフトウェアの構成要素(以下、単に「構成要素」と称する。)と、構成要素間の依存関係を抽出し、抽出したそれぞれに基づいて、構成要素リスト15及び依存関係リスト16を生成する。ソースコード121の一例を
図3に示す。ここで、従来の手法には、例えば、DSMを取り入れたソフトウェアの品質評価ツールである、米国Lattix社の“Lattix”により実現される技術等が該当する。
【0022】
依存関係抽出部141は、生成した構成要素リスト15及び依存関係リスト16をRAM又は外部記憶装置に保存する。
【0023】
構成要素リスト15は、ソースコード121に含まれる構成要素についての情報がリストアップされたデータである。より詳細には、構成要素リスト15は、
図4に示すように、「要素名」と、「要素種別」と、「包含要素数」と、から構成されるレコードが複数設定されたデータテーブルである。「要素名」には、C++、Java(登録商標)等のプログラミング言語で作成されたソフトウェアを構成する要素であって、当該ソースコード121において記述された名称(例えば、クラス名、変数名、関数名、マクロ名等)が設定される。
【0024】
「要素種別」には、当該構成要素の種別(例えば、クラス、変数、関数、マクロ等)を示す情報が設定される。「包含要素数」には、当該構成要素に包含される他の構成要素の数が、要素種別毎に設定される。
図4の例では、先頭(番号1)のレコードにおいて、クラスである“Class1”には、構成要素として関数のみが含まれ、その数が1であることが示されており、番号2のレコードにおいて、クラスである“Class2”には、変数のみが含まれ、その数が2であることが示されており、番号3のレコードにおいて、クラスである“Class3”には、変数のみが含まれ、その数が1であることが示されている。
【0025】
依存関係リスト16は、ソースコード121に含まれる構成要素間の依存関係についての情報がリストアップされたデータである。より詳細には、依存関係リスト16は、
図5に示すように、「依存元要素名」と、「依存先要素名」と、「依存度数」と、から構成されるレコードが複数設定されたデータテーブルである。ここで、依存関係とは、ある構成要素が他の構成要素を含む場合や他の構成要素を引用するといったように、ある構成要素が他のソフトウェア構成要素に依存する関係をいう。依存関係には、例えば、インクルード、クラス参照、クラス継承、関数の呼出し、関数のオーバーライド、宣言、変数参照、変数書き込み、マクロの使用などがある。
【0026】
「依存元要素名」には、依存元(即ち、依存する側)の構成要素のソースコード121上の名称が設定される。「依存先要素名」には、依存先(即ち、依存される側)の構成要素のソースコード121上の名称が設定される。「依存度数」には、当該依存元の構成要素と依存先の構成要素との間の依存関係において、依存の種別(依存種別)毎の依存の頻度(回数)が設定される。
【0027】
図5の例では、先頭(番号1)のレコードにおいて、構成要素“Class1”から構成要素“Class2”への依存関係で、インクルード、クラス参照、クラス継承、関数の呼出し、関数のオーバーライド、宣言、変数書き込み及びマクロの使用のそれぞれの回数が0であり、変数参照の回数が1であることが示されており、同様に、番号2のレコードにおいても、構成要素“Class1”から構成要素“Class3”への依存関係で、インクルード、クラス参照、クラス継承、関数の呼出し、関数のオーバーライド、宣言、変数書き込み及びマクロの使用のそれぞれの回数が0であり、変数参照の回数が1であることが示されている。また、番号3のレコードにおいては、構成要素“Class2”から構成要素“Class3”への依存関係で、インクルード、クラス継承、関数の呼出し、関数のオーバーライド、宣言、変数参照、変数書き込み及びマクロの使用のそれぞれの回数が0であり、クラス参照の回数が1であることが示されている。
【0028】
続いて、パターン情報記憶部13に記憶されているパターン情報リストについて説明する。パターン情報リストには、
図2に示すように、第1パターン情報リスト131と、第2パターン情報リスト132とが含まれる。第1パターン情報リスト131は、予めユーザにより設定された、ユーザが評価対象として抽出を所望する構成要素についての情報がリストアップされたデータである。より詳細には、第1パターン情報リスト131は、
図6に示すように、「仮要素名」と、「実要素名」と、「要素種別」と、「抽出条件」と、から構成されるレコードが複数設定されたデータテーブルである。
【0029】
「仮要素名」には、抽出を所望する構成要素の仮称が設定される。仮称の決め方は任意であり、本実施形態では、A、B、C、…、といったようにアルファベットが順番に割り振られるものとする。「実要素名」は、当初、即ち、ユーザによる当該第1パターン情報リスト131の作成時点では未設定状態であり、後に、パターン抽出部142により、後述するパターン抽出処理にて、ソースコード121上の名称が格納される。
【0030】
「要素種別」には、ユーザが抽出を所望する構成要素の種別(例えば、クラス、変数、関数、マクロ等)を示す情報が設定される。「抽出条件」には、抽出するための条件を示す情報が設定される。例えば、「抽出条件」には、上記条件が記述されたファイル(リスト)名がテキスト形式で設定される。「抽出条件」に設定される条件の一例を
図7に示す。
図7(a)は、条件1に対応する内容を示し、
図7(b)は、条件2に対応する内容を示している。
【0031】
例えば、
図6の先頭(番号1)のレコードでは、要素種別がクラスであり、包含する変数の数が0である構成要素に対して、仮要素名“A”が付されるということが示されている。また、番号2のレコードでは、要素種別がクラスであり、包含する関数の数が0である構成要素に対して、仮要素名“B”が付されるということが示されている。
【0032】
第2パターン情報リスト132は、予めユーザにより設定された、検出すべきアンチパターンについての情報がリストアップされたデータである。より詳細には、第2パターン情報リスト132は、
図8に示すように、「仮依存元要素名」と、「実依存元要素名」と、「仮依存先要素名」と、「実依存先要素名」と、「依存関係条件」と、「チェック欄」と、から構成されるレコードが複数設定されたデータテーブルである。
【0033】
「仮依存元要素名」には、アンチパターンを構成する依存元の構成要素の仮称が設定される。ここで、「仮依存元要素名」に設定される仮称と、第1パターン情報リスト131における「仮要素名」に設定される仮称とは、共通化されており、仮称が同一の場合は、同一の構成要素を示すこととなる。
【0034】
「実依存元要素名」は、ユーザによる当該第2パターン情報リスト132の作成時点では未設定状態であり、後に、パターン抽出部142により、後述するパターン抽出処理にて、対応する依存元の構成要素として、ソースコード121上の名称が格納される。「仮依存先要素名」には、アンチパターンを構成する依存先の構成要素の仮称が設定される。ここで、上記の「仮依存元要素名」の場合と同様、「仮依存先要素名」に設定される仮称と、第1パターン情報リスト131における「仮要素名」に設定される仮称とは、共通化されており、仮称が同一の場合は、同一の構成要素を示すこととなる。
【0035】
「実依存先要素名」は、ユーザによる当該第2パターン情報リスト132の作成時点では未設定状態であり、後に、パターン抽出部142により、後述するパターン抽出処理にて、依存先の構成要素として、ソースコード121上の名称が格納される。
【0036】
「依存関係条件」には、当該アンチパターンを構成する依存元の構成要素と依存先の構成要素との間の依存関係における条件を示す情報が設定される。例えば、「依存関係条件」には、上記条件が記述されたファイル(リスト)名がテキスト形式で設定される。「依存関係条件」に設定される条件の内容の一例を
図9に示す。
図9(a)は、条件3に対応する内容を示し、
図9(b)は、条件4に対応する内容を示している。
【0037】
例えば、
図8の先頭(番号1)のレコードでは、仮称“A”の依存元の構成要素と、仮称“B”の依存先の構成要素との間において、依存種別が変数参照であり、その依存度数が1以上であるという条件を満たす場合に、仮称“A”の構成要素が仮称“B”の構成要素に依存するソフトウェア構造が、アンチパターンであることが示されている。
【0038】
また、番号2のレコードでは、仮称“A”の依存元の構成要素と、仮称“C”の依存先の構成要素との間において、依存種別が変数参照であり、その依存度数が1以上であるという条件を満たす場合に、仮称“A”の構成要素が仮称“C”の構成要素に依存するソフトウェア構造が、アンチパターンであることが示されている。また、番号3のレコードでは、仮称“B”の依存元の構成要素と、仮称“C”の依存先の構成要素との間において、依存種別を問わず、依存度数が1以上である、換言すると、何れかの依存種別において、依存度数が1以上である、という条件を満たす場合に、仮称“B”の構成要素が仮称“C”の構成要素に依存するソフトウェア構造が、アンチパターンであることが示されている。
【0039】
「チェック欄」は、ユーザによる当該第2パターン情報リスト132の作成時点では、チェック無し(0が設定)状態となっており、後に、パターン抽出部142により、後述するパターン抽出処理にて、必要に応じて、チェックが入れられる(1が設定される。)。
【0040】
パターン抽出部142は、依存関係抽出部141により生成された構成要素リスト15及び依存関係リスト16と、パターン情報記憶部13に予め記憶されている第1パターン情報リスト131及び第2パターン情報リスト132と、に基づいて、パターン一致リスト17を生成し、出力する。パターン一致リスト17は、第2パターン情報リスト132にリストアップされている、ユーザが予め設定したアンチパターンの中から、当該ソフトウェア(ソースコード121)に実際に含まれているアンチパターンをリストアップした結果を示すデータである。パターン一致リスト17の詳細については後述する。
【0041】
続いて、上記のように構成されるソフトウェア評価支援装置1において実行されるソフトウェア評価支援処理について説明する。このソフトウェア評価支援処理は、ユーザにより、入力部10を介して、ROM又は外部記憶装置に記憶されている、上述のソフトウェア評価支援プログラムを起動させるための所定操作が行われることで開始される。
【0042】
図10は、ソフトウェア評価支援処理の手順を示すフローチャートである。先ず、依存関係抽出部141は、ソースコード記憶部12からソースコード121を読み出し(ステップS101)、読み出したソースコード121から、従来の手法により、ソフトウェアの構成要素と、構成要素間の依存関係を抽出し、抽出したそれぞれに基づいて、構成要素リスト15及び依存関係リスト16を生成する(ステップS102)。生成された構成要素リスト15及び依存関係リスト16はRAM等に保存される。
【0043】
パターン抽出部142は、依存関係抽出部141により生成された構成要素リスト15及び依存関係リスト16と、パターン情報記憶部13に予め記憶されている第1パターン情報リスト131及び第2パターン情報リスト132と、に基づいて、パターン抽出処理を実行する(ステップS103)。
【0044】
以下、
図11〜
図13のフローチャートを参照して、パターン抽出処理の詳細を説明する。先ず、パターン抽出部142は、カウンタiに0を設定し、変数Niに第1パターン情報リスト131のレコード数を設定する(
図11のステップS201)。そして、パターン抽出部142は、カウンタiをインクリメントした後、カウンタiの値が変数Niの値以下であるか否かを判定する(ステップS202)。その結果、カウンタiの値が変数Niの値を超えている場合(ステップS202;NO)、パターン抽出部142は、
図13のステップS223の処理を実行する。
【0045】
一方、カウンタiの値が変数Niの値以下である場合(ステップS202;YES)、パターン抽出部142は、パターン情報記憶部13に記憶されている第1パターン情報リスト131を読み出し、その先頭からカウンタiの値番目のレコードを選択する(ステップS203)。また、パターン抽出部142は、カウンタjに0を設定し、変数Njに構成要素リスト15のレコード数を設定する(ステップS204)。
【0046】
そして、パターン抽出部142は、カウンタjをインクリメントした後、カウンタjの値が変数Njの値以下であるか否かを判定する(ステップS205)。その結果、カウンタjの値が変数Njの値を超えている場合(ステップS205;NO)、パターン抽出部142は、ステップS202の処理を再度実行する。
【0047】
一方、カウンタjの値が変数Njの値以下である場合(ステップS205;YES)、パターン抽出部142は、構成要素リスト15の先頭からカウンタjの値番目のレコードを選択する(ステップS206)。パターン抽出部142は、第1パターン情報リスト131の選択したレコードにおける要素種別と、構成要素リスト15の選択したレコードにおける要素種別とが一致し、且つ、第1パターン情報リスト131の選択したレコードにおける抽出条件が成立しているか否かを判定する(ステップS207)。
【0048】
その結果、ステップS207の判定がNOの場合、パターン抽出部142は、ステップS205の処理を再度実行する。一方、ステップS207の判定がYESの場合、パターン抽出部142は、構成要素リスト15の選択したレコードにおける要素名を、第1パターン情報リスト131の選択したレコードにおける実要素名に格納する(ステップS208)。
【0049】
次に、パターン抽出部142は、パターン情報記憶部13から第2パターン情報リスト132を読み出し、読み出した第2パターン情報リスト132において、第1パターン情報リスト131の選択したレコードにおける仮要素名と一致する仮依存元要素名を有するレコードがあるか否かを判定する(ステップS209)。その結果、ステップS209の判定がNOの場合、パターン抽出部142は、
図12のステップS211の処理を実行する。
【0050】
一方、ステップS209の判定がYESの場合、パターン抽出部142は、第2パターン情報リスト132の該当する全てのレコードについて、実依存元要素名に、構成要素リスト15の選択したレコードにおける要素名を格納する(ステップS210)。
【0051】
図12のステップS211では、パターン抽出部142は、第2パターン情報リスト132において、第1パターン情報リスト131の選択したレコードにおける仮要素名と一致する仮依存先要素名を有するレコードがあるか否かを判定する。その結果、ステップS211の判定がNOの場合、パターン抽出部142は、ステップS213の処理を実行する。
【0052】
一方、ステップS211の判定がYESの場合、パターン抽出部142は、第2パターン情報リスト132の該当する全てのレコードについて、実依存先要素名に、構成要素リスト15の選択したレコードにおける要素名を格納する(ステップS212)。
【0053】
続くステップS213では、パターン抽出部142は、カウンタkに0を設定し、変数Nkに依存関係リスト16のレコード数を設定する。そして、パターン抽出部142は、カウンタkをインクリメントした後、カウンタkの値が変数Nkの値以下であるか否かを判定する(ステップS214)。その結果、カウンタkの値が変数Nkの値を超えている場合(ステップS214;NO)、パターン抽出部142は、
図11のステップS205の処理を再度実行する。
【0054】
一方、カウンタkの値が変数Nkの値以下である場合(ステップS214;YES)、パターン抽出部142は、依存関係リスト16の先頭からカウンタkの値番目のレコードを選択する(ステップS215)。パターン抽出部142は、依存関係リスト16において、構成要素リスト15の選択したレコードにおける要素名と一致する依存元要素名又は依存先要素名を有するレコードがあるか否かを判定する(ステップS216)。その結果、ステップS216の判定がNOの場合、パターン抽出部142は、ステップS214の処理を再度実行する。
【0055】
一方、ステップS216の判定がYESの場合、パターン抽出部142は、カウンタlに0を設定し、変数Nlに第2パターン情報リスト132のレコード数を設定する(ステップS217)。そして、パターン抽出部142は、カウンタlをインクリメントした後、カウンタlの値が変数Nlの値以下であるか否かを判定する(ステップS218)。その結果、カウンタlの値が変数Nlの値を超えている場合(ステップS218;NO)、パターン抽出部142は、ステップS214の処理を再度実行する。
【0056】
一方、カウンタlの値が変数Nlの値以下である場合(ステップS218;YES)、パターン抽出部142は、第2パターン情報リスト132の先頭からカウンタlの値番目のレコードを選択する(ステップS219)。
【0057】
続く
図13のステップS220では、パターン抽出部142は、第2パターン情報リスト132の選択したレコードにおける実依存元要素名及び実依存先要素名と、依存関係リスト16の選択したレコードにおける依存元要素名及び依存先要素名とがそれぞれ一致し、且つ、第2パターン情報リスト132の選択したレコードにおける依存関係条件が、依存関係リスト16の選択したレコードにおける依存度数の内容に適合しているか否かを判定する。その結果、ステップS220の判定がNOの場合、パターン抽出部142は、
図12のステップS218の処理を再度実行する。
【0058】
一方、ステップS220の判定がYESの場合、パターン抽出部142は、第2パターン情報リスト132の選択したレコードにおけるチェック欄に1を格納する(ステップS221)。パターン抽出部142は、第2パターン情報リスト132の全レコードのチェック欄に1が格納されているか否かを判定する(ステップS222)。全レコードのチェック欄に1が格納されている場合(ステップS222;YES)、パターン抽出部142は、ステップS223の処理を実行する。一方、何れかのレコードのチェック欄に1が格納されていない場合(ステップS222;NO)、パターン抽出部142は、
図12のステップS218の処理を再度実行する。
【0059】
ステップS223では、パターン抽出部142は、第2パターン情報リスト132から、パターン一致リスト17を生成する(ステップS223)。具体的には、パターン抽出部142は、第2パターン情報リスト132から、チェック欄に1が設定されているレコードを全て抽出する。そして、パターン抽出部142は、抽出した各レコードから、「仮依存元要素名」、「仮依存先要素名」及び「チェック欄」の各項目を削除する。これにより、
図14に示すようなパターン一致リスト17が生成される。生成されたパターン一致リスト17は、ROM又は外部記憶装置に保存され、ユーザによる入力部10を介した所定操作により、その内容が表示部11にて所定態様で表示される。
【0060】
なお、第2パターン情報リスト132の何れのレコードにおいてもチェック欄に1が設定されていない場合、パターン抽出部142は、アンチパターンが検出されなかった旨を所定態様でユーザに報知する。この場合、例えば、パターン抽出部142は、“アンチパターンは検出されませんでした”等のメッセージを表示部11に表示させる。
【0061】
以上説明したように、本発明の本実施形態に係るソフトウェア評価支援装置1によれば、依存関係抽出部141は、ソースコード記憶部12に記憶されているソースコード121から、ソフトウェアの構成要素と、構成要素間の依存関係を抽出し、抽出したそれぞれに基づいて、構成要素リスト15及び依存関係リスト16を生成する。そして、パターン抽出部142は、構成要素リスト15及び依存関係リスト16と、ユーザが評価対象として抽出を所望する構成要素についての情報がリストアップされた第1パターン情報リスト131と、検出すべきアンチパターンについての情報がリストアップされた第2パターン情報リスト132と、に基づいて、ソースコード121に実際に含まれているアンチパターンを検出し、その結果として、パターン一致リスト17を生成する。このように、アノテーション等が付加されていないソースコードであっても、ソースコード121に内在するアンチパターンを自動検出できるため、ソフトウェアの品質評価作業の効率向上が図れる。
【0062】
なお、本発明は、上記実施形態に限定されず、本発明の要旨を逸脱しない範囲での種々の変更は勿論可能である。
【0063】
例えば、上記実施形態では、ソフトウェア評価支援装置1の制御部14は、依存関係抽出部141を備え、ソースコード記憶部12に記憶されているソースコード121から、構成要素リスト15及び依存関係リスト16を生成していたが、かかる構成に限定されることはない。本発明には、依存関係抽出部141を備えない構成のソフトウェア評価支援装置も含まれる。その場合のソフトウェア評価支援装置は、他の装置で生成された構成要素リスト15及び依存関係リスト16を用いてパターン一致リスト17を生成する。
【0064】
また、上記実施形態のソフトウェア評価支援装置1が実行したプログラムを、既存のパーソナルコンピュータ(PC)等に適用することで、当該PCを本発明に係るソフトウェア評価支援装置として機能させることも可能である。
【0065】
このようなプログラムの配布方法は任意であり、例えば、CD−ROM(Compact Disk Read-Only Memory)、DVD(Digital Versatile Disk)、MO(Magneto Optical Disk)、メモリカードなどのコンピュータ読み取り可能な記録媒体に格納して配布してもよいし、インターネットなどの通信ネットワークを介して配布してもよい。
【0066】
本発明は、本発明の広義の精神と範囲を逸脱することなく、様々な実施の形態及び変形が可能とされるものである。また、上述した実施の形態は、本発明を説明するためのものであり、本発明の範囲を限定するものではない。つまり、本発明の範囲は、実施の形態ではなく、特許請求の範囲によって示される。そして、特許請求の範囲内及びそれと同等の発明の意義の範囲内で施される様々な変形が、本発明の範囲内とみなされる。