(57)【要約】【課題】ソースプログラムより不変情報を抽出し、この不変情報を動的及び静的に解析することにより、意味情報を測定及び定量化し、より正確な凝集度測定を可能にする凝集度測定装置、凝集度測定方法及び凝集度測定プログラムを提供する。【解決手段】凝集度測定装置１００は、中央演算装置（ＣＰＵ）１、プログラム記憶部２、データ記憶部３と、制御の指示及びデータの入力を行う入力部５と、データの出力を行う出力部４を含む。ＣＰＵ１内には不変情報検出モジュール１１、機能単位検出モジュール１２及び凝集度算出モジュール１３が内蔵されている。不変情報検出モジュール１１は、凝集度測定の指標となるプログラム内の不変情報を検出する。機能単位検出モジュール１２は、不変情報より機能単位を検出する。凝集度算出モジュール１３は、機能単位の分布状態を分析して凝集度を算出する。【選択図】　　　図１
2004062452.tif 000002
【特許請求の範囲】
【請求項１】
凝集度測定の指標となるプログラム内の不変情報を検出する不変情報検出モジュールと、
前記不変情報を記憶する不変情報記憶部と、
前記不変情報より機能単位を検出する機能単位検出モジュールと、
検出された前記機能単位を記憶する機能単位情報記憶部と、
前記機能単位の分布状態を分析して凝集度を算出する凝集度算出モジュール
とを有することを特徴とする凝集度測定装置。
【請求項２】
前記プログラムの静的解析に基づき静的凝集度を測定する静的凝集度測定モジュールを更に備えることを特徴とする請求項１に記載の凝集度測定装置。
【請求項３】
凝集度測定の指標となるプログラム内の不変情報を不変情報検出モジュールが検出し、検出した前記不変情報を不変情報記憶部に記憶させるステップと、
前記不変情報より機能単位検出モジュールが機能単位を検出し、前記機能単位を機能単位情報記憶部に記憶させるステップと、
前記機能単位の分布状態を分析して凝集度算出モジュールが凝集度を算出するステップ
とを有することを特徴とする凝集度測定方法。
【請求項４】
前記プログラムの静的解析に基づき静的凝集度測定モジュールが静的凝集度を測定するステップを更に備えることを特徴とする請求項３に記載の凝集度測定方法。
【請求項５】
凝集度測定の指標となるプログラム内の不変情報を不変情報検出モジュールが検出し、検出した前記不変情報を不変情報記憶部に記憶させる命令と、
前記不変情報より機能単位検出モジュールが機能単位を検出し、前記機能単位を機能単位情報記憶部に記憶させる命令と、
前記機能単位の分布状態を分析して凝集度算出モジュールが凝集度を算出する命令
とを有することを特徴とする凝集度測定プログラム。
【請求項６】
前記プログラムの静的解析に基づき静的凝集度測定モジュールが静的凝集度を測定する命令を更に備えることを特徴とする請求項５に記載の凝集度測定プログラム。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明はプログラムの品質の目安となる凝集度を計測するための凝集度測定装置、凝集度測定方法及び凝集度測定プログラムに関するものである。
【０００２】
【従来の技術】
コンピュータシステムの性能を評価する際の目安として、よくＲＡＳ（リライアビリティ、アバイラビリティ、サービスビリティ：信頼性、可用性、保守性）が使用されている。このうち「保守性」とは、ＩＳＯによれば「機能単位を、要求された機能を果たさせる状態に保つ、又は、修復することを意図した諸活動」と定義されている。ソフトウェアの開発において、保守性を維持する、若しくは保守性を高める為のコストがその大半を占めることは周知である。
【０００３】
保守性の一つの尺度として良く用いられるものとしてプログラムの凝集度が挙げられる。凝集度とは、端的にいえばプログラムの各構成要素がどの程度機能的にまとまっているかということを示す尺度であり、スティーブン、メイヤー及びコンスタンティンらによって凝集度の定義である「構造的設計」が提唱されている。これは、凝集度を、全く無関係な機能が一つにまとまってしまっている最も低いレベルから、単一の構成要素が単一の機能を果たしている最も高いレベルまでを、偶然的（暗号的）凝集、論理的凝集、時間的凝集、手続き的凝集、連絡的凝集、連続的凝集及び機能的凝集と大きく７段階に分類したものである。
【０００４】
このスティーブンらの凝集度の定義やこれに類するものに従って、これまで数多くの定量化手法が提案されてきた。更に、近年ではオブジェクト指向言語への凝集度測定の適用が進み、凝集度の測定対象である構成要素の定義も、従来の関数単位に留まらず、クラス単位、モジュール単位等に拡張されている。
【０００５】
【発明が解決しようとする課題】
しかしながら、従来の手法はいずれもプログラムの静的解析を基礎にし、主に構文情報の分析によって凝集度を測定しているものであり、プログラマが意図しているプログラムの真の意味を考慮することが出来ないという問題がある。例えば、プログラムの品質改善を意図して凝集度が計測された場合、低い凝集度をもったモジュール等は、通常、「適切な機能分割が行われる必要がある」等の評価を受ける。これは、具体的には、プログラマが、プログラムの読みやすさを優先してコード名や変数名を別にした場合でも同様の評価となる。つまり、静的な構文解析だけではその意図が汲み取れないために、プログラマにとって不本意な品質測定結果が示される事となる。
【０００６】
また一般に、特定の操作を実現するためのプログラムの記述方式は、無限に存在し得る。特に顕著な例は、ＩＦ文等の条件分岐の表現方法である。つまり意味的には同じことを実現していても、実装の仕方は異なるといった例が数多く存在し得る。静的解析だけに頼った方法では、この実装の違いによって凝集度の算出結果が異なる可能性がある。例えば一つのメソッド内で２つの異なる条件分岐が存在するようなケースを考える。構文上は条件分岐は別のものとして記述されているが、実は実行時にはこの２つの条件判断の真偽が常に一致する場合、これは実際には単一の条件判断で書き直せることになる。すなわち実装の仕方によって、実際より凝集度が低く見積もられてしまう可能性がある。
【０００７】
このような場合、プログラム内において、プログラムの実行後でもその関係が恒常的で変化しないプログラムの不変情報（ｉｎｖａｒｉａｎｔ）を用いて解析を行う手法が存在する。例えば、ソースプログラムを入力して不変情報を検出する手段としてＭＩＴのＤａｉｋｏｎシステムがある。これは動的解析情報に基づいてプログラムの不変情報を検出する事を目的としたシステムである。しかし、動的解析のみに依存して凝集度を測定する場合、静的解析のみでは検出不可能な実行時の情報を検出することが可能になるが、解析に使用される適切な試験データを準備することが困難であるという問題がある。全ての可能なパターンを考慮した動的解析を実施することはコスト的に問題があるため、動的解析と静的解析の適度な連携関係を備えた凝集度の測定が重要である。
【０００８】
本発明はこれらの問題を解決するためのものであり、ソースプログラムを動的及び静的に解析することにより得られた不変情報を処理して、意味情報を測定及び定量化し、より正確な凝集度測定を可能にする凝集度測定装置、凝集度測定方法及び凝集度測定プログラムを提供することを目的とする。
【０００９】
【課題を解決するための手段】
上記の目的を解決するために本発明の第１の特徴は、（イ）凝集度測定の指標となるプログラム内の不変情報を検出する不変情報検出モジュールと、（ロ）検出した不変情報を記憶する不変情報記憶部と、（ハ）不変情報より機能単位を検出する機能単位検出モジュールと、（ニ）検出された機能単位を記憶する機能単位情報記憶部と、（ホ）機能単位の分布状態を分析して凝集度を算出する凝集度算出モジュールとを有する凝集度測定装置であることを要旨とする。更に、本発明の第１の特徴は、（ヘ）プログラムの静的解析に基づき静的凝集度を測定する静的凝集度測定モジュールを更に備えることを加えても良い。
【００１０】
本発明の第１の特徴によると、プログラムの不変情報を検出する不変情報検出モジュールを備えることにより、プログラムの意味情報を検出することを可能にする。不変情報が、実装の仕方に依存しない本質的な性質を含んでいるため、この不変情報を解析することにより、プログラマが意図する意味情報に関する情報を考慮して凝集度の測定を行うことができる。又、凝集度算出モジュールに、静的解析に基づく凝集度測定手段を採用した静的凝集度測定モジュールを付加することにより、測定される凝集度の高精度化を図ることができる。これは特に、動的解析のみに頼った不変情報検出を行っている際に有効である。本発明の第１の特徴では、凝集度測定装置と、従来からある静的解析に基づく凝集度測定結果とを組み合わせることにより、効率よく高精度の凝集度測定を行うことを可能としている。
【００１１】
本発明の第２の特徴は、（イ）凝集度測定の指標となるプログラム内の不変情報を不変情報検出モジュールが検出し、検出した不変情報を不変情報記憶部に記憶させるステップと、（ロ）不変情報より機能単位検出モジュールが機能単位を検出し、機能単位を機能単位情報記憶部に記憶させるステップと、（ハ）機能単位の分布状態を分析して凝集度算出モジュールが凝集度を算出するステップとを有する凝集度測定方法であることを要旨とする。更に本発明の第２の特徴は、（ニ）プログラムの静的解析に基づき静的凝集度測定モジュールが静的凝集度を測定するステップを更に備えることを加えても良い。
【００１２】
本発明の第３の特徴は、（イ）プログラムの凝集度測定の指標となるプログラム内の不変情報を不変情報検出モジュールが検出し、検出した不変情報を不変情報記憶部に記憶させる命令と、（ロ）不変情報より機能単位検出モジュールが機能単位を検出し、機能単位を機能単位情報記憶部に記憶させる命令と、（ハ）機能単位の分布状態を分析して凝集度算出モジュールが凝集度を算出する命令とを有する凝集度測定プログラムであることを要旨とする。更に本発明の第３の特徴は、（ニ）プログラムの静的解析に基づき静的凝集度測定モジュールが静的凝集度を測定する命令を更に備えることを加えても良い。
【００１３】
【発明の実施の形態】
一般にプログラムの各モジュールは、プログラムの入り口点となるメインモジュールを頂点として、２階層目、３階層目と順次多くの処理モジュールに枝分かれして分割される。更に下位の層では、共通機能を実行する少数のモジュールに集約される。この際、各モジュールの大きさ等のステップ数やモジュール階層の数等がモジュールの分割の正当性を判断する基準となるが、各モジュールの視点からは、他のモジュールとの関連性が少ないこと、つまり独立性が高いことが要求される。この独立性を高める為には他のモジュールとの係わり合い等の結合度が必要最小限度であることと、各モジュールが単機能であること、つまり凝集度の高さが要求される。
【００１４】
しかし、発明者らの知見によると、結合度及び凝集度の高低は、必ずしも一定の尺度で測れるものではなく、あくまでプログラマがどのようなプログラム設計を優先しているかによるものであり、結合度及び凝集度による測定、定量化には限界がある。そこで、発明者らは、凝集度を求める際に、凝集度測定の機能単位の基となる不変情報を抽出し、利用することを試みた。ここで不変情報とは、静的及び動的解析の双方により検出可能な意味情報である。プログラマが意図的に作成してある意味情報には、具体的に、等価関係、不等関係及び順序関係等が挙げられる。
【００１５】
先ず「等価関係」とは、特定のデータ間が、常に、等価である関係を指す。これは例えば、変数として設計してあるデータが、ある一定の値しかとらない場合、この一定の値が不変情報として検出される。この際、そのデータを変数として設計した事が適切か否か、プログラマが意図的に設計したものか否か等を再考する必要性があることになる。また、独立データとして設計されているデータが、常に等価値を取ると、この等価値が不変情報として検出される。この際、この独立データには冗長なデータが含まれているのではないか、プログラマが意図的に設計したものか否か等を再考する必要性が問われる。
【００１６】
「不等関係」は、特定のデータ間に、常に一定の不等式が成り立っている関係を指す。例えば、ＩＦ文等の条件式で、等価関係のチェックが行われている２つのデータに関して、常に一定の不等関係が成り立っているような場合、この条件式による判断が本当に必要か否か、プログラマが意図的に設計したものか否か等を再考する必要がある。
【００１７】
「順序関係」は、特定のデータの並びに、常に一定の昇順、降順等の順序が成り立っている関係を指す。例えば、ある２つのデータが常に一定の大小関係にあるような場合、一方のデータが他方のデータの番人として働いている等の動きが推測される。また、ある配列要素が、特定の処理後に常に整列されているような場合、この処理が整列の機能を有しているという事が推測される。この他、写像関係特定の複数データ間に一定の写像関係が成り立っている、例えばある３つのデータａ、ｂ、及びｃの間に、ａ＝ｆ（ｂ，ｃ）という関係がある場合、ａはスコープの中で不要であるという場合が考えられる。このような場合にも、プログラマが意図的に設計したものか否か等について再考する必要がある。尚、この他にも不変情報は多種多様な方法により検出される。
【００１８】
上記のように不変情報を抽出し、抽出された不変情報を動的及び静的なプログラム解析を行い、新たなプログラム品質の定量化を行う為の装置、方法及びプログラムの実施の形態について、図面に基づいて以下に説明する。第１の実施の形態では不変情報を用いて実装機能単位を検出し、凝集度を測定する装置、方法及びプログラムについて、第２の実施の形態では、第１の実施の形態に、更に、静的解析による解析を加えて凝集度を算出する装置、方法及びプログラムについて説明する。尚、本発明は以下の実施の形態にとらわれず、その趣旨を脱しない範囲で種々変更して実施できることは勿論である。
【００１９】
（第１の実施の形態）
（凝集度測定装置）
本発明の第１の実施の形態に係る凝集度測定装置１００は、図１に示すように、中央演算装置（ＣＰＵ）１、プログラム記憶部２、データ記憶部３と、制御の指示及びデータの入力を行う入力部５と、データの出力を行う出力部４と、ホストコンピュータ６及びインタフェース７及びこれらを接続するシステムバス８等からなる。
【００２０】
データ記憶部３は、図１に示すように、ソースプログラム記憶部３１、不変情報記憶部３２、機能単位情報記憶部３３及び凝集度記憶部３４を備えている。ソースプログラム記憶部３１は、入力部５より入力されたソースプログラム３１ａを格納する。不変情報記憶部３２は、不変情報検出モジュール１１が検出した不変情報３２ａを記憶する。機能単位情報記憶部３３は、機能単位検出モジュール１２が検出した機能単位情報３３ａを記憶する。凝集度記憶部３４は、凝集度算出モジュール１３が算出した凝集度情報３４ａを記憶する。データ記憶部３に格納された情報は蓄積され、凝集度算出式の生成等といった凝集度値の適正化の際に利用する、外部からの補助的情報として今後利用する。
【００２１】
ＣＰＵ１は、不変情報検出モジュール１１、機能単位検出モジュール１２及び凝集度算出モジュール１３等をプログラム記憶部２より取り出し、適宜実行する。また、これらのモジュールはそれぞれソフトウェアの論理的な機能単位であり、それぞれが互いに物理的に異なるシステム上で動作することも可能である。
【００２２】
不変情報検出モジュール１１は、不変情報３２ａを検出する為のモジュールであり、図２に示すように、構文解析部１１ａと抽出部１１ｂを備えている。構文解析部１１ａはソースプログラム記憶部３１に記憶されたソースプログラム３１ａの構文を動的又は静的に解析する。抽出部１１ｂは、構文解析部１１ａが解析したソースプログラム３１ａより、等価関係、不等関係及び順序関係等を有する不変情報３２ａを抽出する。ソースプログラムを入力として不変情報３２ａを検出する手段としては、静的解析に基づく手法や動的解析を利用する手法等、様々な手段が存在する。
【００２３】
機能単位検出モジュール１２は、図３に示すように、不変情報３２ａを入力して、機能単位情報３３ａを出力する。機能単位検出モジュール１２は、機能単位決定部１２ａと機能単位検出部１２ｂを備えている。機能単位決定部１２ａは、機能としてカウントする為の単位を決定する。この単位は、具体的には、不変情報３２ａに関連付けられている出力変数やプログラム内の処理、あるいは不変情報３２ａそのもの等を指す。機能単位検出部１２ｂは、不変情報３２ａの観点より、機能単位情報３３ａの数等を検出する。
【００２４】
凝集度算出モジュール１３は、機能単位情報記憶部３３に記憶された機能単位情報３３ａの分布状態を分析して凝集度を算出する為のモジュールであり、図４に示すように、単位決定部１３ａ、単位探索部１３ｂ及び凝集度算出モジュール１３ｃを備えている。単位決定部１３ａは、凝集度を測定する為の特定の単位を決定する。具体的には、オブジェクト指向でいうメソッド単位、クラス単位、ブロック単位、変数単位及びプログラム単位等が考えられる。単位探索部１３ｂは、単位決定部１３ａで決定された単位にしたがってプログラムを分割し、プログラム内に存在する機能単位３３ａの探索を単位毎に行う。例えば、プログラムをメソッド単位等に分割し、機能単位３３ａが存在するメソッド等を探索する。凝集度算出部１３ｃは、機能単位３３ａが存在する単位毎に凝集度を算出する。この際、機能単位３３ａが存在するメソッド等より凝集度を算出するが、ここで重要な事は、特定の単位内に幾つの機能が、お互いにどのような関係を持ちながら関連しているのかという事を考慮して凝集度を算出する事である。単位辺りの機能の数とお互いの機能関係から凝集度をどのように定義するかは基本的にはプログラマの任意であるが、例えば前述した構造的設計に記載のような古典的定義、離散的定義に従う事が考えられる。また特開平１１−２２４２１０号公報「凝集度計測装置及び凝集度計測方法」等に紹介されているようなデータフロー解析、出力解析、影響解析の結果に基づいたアルゴリズムに従った算出や、この他にも、機能数と関係にそれぞれ定量的尺度を与えた上で、連続的な値をとる凝集度尺度を定義することも可能である。
【００２５】
入力部５は、キーボード、マウス等を設けソースプログラム３１ａ、不変情報３２ａの設定データ及び機能単位の設定データ等の入力を行う。尚、入力部５は、上記の他に、インタフェース７を介したホストコンピュータ６やフレキシブルディスク等の記憶装置から入力させるようにしても良い。出力部４は、表示部、プリンタ等を設けデータの出力を行う。尚、出力部４は、上記の他に出力結果をファイルやフレキシブルディスク等の記憶装置に格納したり、インタフェース７を介してホストコンピュータ６に出力するようにしても良い。
【００２６】
（凝集度測定方法）
次に、本発明の第１の実施の形態に係る凝集度測定装置１００を用いた測定方法について図５に示すフローチャートを用いて説明する。
【００２７】
（ａ）ステップＳ１０１では、オペレータ等がソースプログラム３１ａを入力部５より入力する。読み込まれたソースプログラム３１ａは、ソースプログラム記憶部３１に格納される。
【００２８】
（ｂ）ステップＳ１０２では、ステップＳ１０１で格納されたソースプログラム３１ａを、再びソースプログラム記憶部３１より読み出し、構文解析部１１ａがこれを動的及び静的に構文解析し、構文構造、変数定義等の各情報より不変情報３２ａを作成する。構文等を解析するアルゴリズムは、コンパイラ等に使われる公知の技術を用いる。これは、記号表（変数定義情報）と構文木（構文構造情報）から構成されており、登録されている情報には、変数名、定義されている行番号、変数の型、変数の初期値、上位（親）の変数の情報へのポインタ、下位の先頭（長子）の変数の情報へのポインタ、同じ親をもち次に定義されている変数（弟）へのポインタ、その変数が再定義している変数の情報へのポインタ、その変数を再定義している変数の情報のリストへのポインタ、構文木上でその変数が設定されている箇所へのポインタのリスト、構文木上でその変数が参照されている箇所へのポインタのリスト、その変数と包含関係にある変数の情報等がある。
【００２９】
構文木はプログラムの実行順序に応じて得られる文のつながりを表すことによりプログラムの構文構造を表現する。構文木の個々のノードはプログラムの命令文や式に相当し、各々情報を持ち、情報全体でプログラムを構成する。構文木が持ち合わせる情報には、代入文の場合には、文種別（＝代入）情報として、行番号、ベーシックブロックへのポインタ、代入元の式へのポインタ、代入先の変数に対応する名前表のコラムへのポインタ、次の文へのポインタ等がある。条件分岐文の場合には、文種別（＝条件分岐）情報として、行番号、ベーシックブロックへのポインタ、条件式情報へのポインタ、ｔｈｅｎ部の文の先頭へのポインタ、ｅｌｓｅ部の文の先頭へのポインタ、次の文へのポインタ等がある。また、条件式の情報としては、演算子の種別、右辺の式の情報へのポインタ、左辺の式の情報へのポインタ等がある。
【００３０】
（ｃ）ステップＳ１０３では、抽出部１１ｂが、ソースプログラム３１ａ内より不変情報３２ａの抽出処理を行う。抽出された不変情報３２ａは不変情報記憶部３２に送信され、格納される。
【００３１】
（ｄ）ステップＳ１０４では、機能単位決定部１２ａが、不変情報記憶部３２に記憶された不変情報３２ａを抽出する為の機能単位を決定する。この機能単位は、不変情報３２ａの依存関係を求めた後、この依存関係を元に検出された相互関連によってまとめられた単位である。
【００３２】
（ｅ）ステップＳ１０５では、機能単位検出モジュール１２が、ステップＳ１０４にて決定された機能単位毎に、不変情報３２ａの観点より、機能単位の位置や数等を検出する。検出された機能単位の情報は機能単位情報３３ａとして機能単位情報記憶部３３に送信され、記憶される。
【００３３】
（ｆ）ステップＳ１０６では、凝集度算出モジュール１３が、凝集度情報３４ａを算出する。先ず、単位決定部１３ａが単位決定部１３ａは、凝集度を測定する為、メソッド単位、クラス単位、ブロック単位、変数単位及びプログラム単位等の単位を決定する。この決定はオペレータ等が入力しても、プログラムを自動制御してもよい。次に、単位探索部１３ｂが、決定された単位にしたがってプログラムを分割し、プログラム内に存在する機能単位情報３３ａの探索を行う。探索された機能単位情報３３ａは、凝集度算出部１３ｃによって、凝集度情報３４ａを算出される。算出された凝集度情報３４ａは凝集度記憶部３４に送信され、格納される。この後、オペレータ等は、凝集度記憶部３４に格納された凝集度情報３４ａによって、プログラムリファクタリング（プログラム再構成）等の方針、指針を決定する。
【００３４】
（実施例）
次に、本発明の第１の実施の形態の凝集度測定装置を用いて凝集度を測定する際の具体例を挙げる。
【００３５】
図６のプログラムについて考えると、構造的設計等の古典的、かつ離散的な定義では出力変数の個数を機能の数ととらえている為、この場合出力変数と見られるのはｔｅｍｐのみであるから、機能数は１と測定される。しかしながら不変情報３２ａの観点でとらえると、このｔｅｍｐは実は２つの別の役割、すなわち縦の長さが＿ｈｅｉｇｈｔ、横の長さが＿ｗｉｄｔｈの長方形の周囲長と面積とに使用されている出力変数であることがわかる。図８に不変情報３２ａの観点で検出された機能単位を示す。この例では不変情報３２ａがそのまま機能単位となっている。よってこのケースでは機能数は２と考えるのが妥当である。
【００３６】
次に図７のプログラムについて考えると、この例では２つのｉｆ−ｔｈｅｎ−ｅｌｓｅブロックが存在する。単純に考えるとそれぞれのブロックには２つの異なる処理が含まれているので、全体では合計４つの異なる処理が含まれていることになる。しかしながら、構文解析部１１ａにて動的解析を行い不変情報３２ａを検出した時に、一つ目の条件式“ｉｓ　Ｔｏｏ　Ｅｘｐｅｎｓｉｖｅ（ｂａｓｋｅｔ．　ｇｅｔＰｒｉｃｅ（））”と２つ目の条件式“ｂａｓｋｅｔ．　ｇｅｔＡｖｅｒａｇｅ　Ｐｒｉｃｅ（）　＞　ＬＩＭＩＴ”の真偽が全く一致している事がわかった。この場合、実質的に２つの独立した処理が存在していると考えるのが妥当である。
【００３７】
尚、図９に不変情報３２ａの観点で検出された機能単位を示す。図中で条件と条件及び条件と不変情報３２ａを結ぶ実線矢印は、解析によって検出された依存関係を示し、不変情報３２ａと不変情報３２ａを結ぶ破線矢印は、依存関係を元に検出された不変情報３２ａ間の相互関連を示す。このような相互関連によってまとめられる単位をもって機能単位とする。
【００３８】
このように、不変情報３２ａを用いることにより、単純な構文解析等によるよりもより正確な実装機能単位の検出が可能になり、後段の凝集度算出の精度向上に大きな効果を与えることができ、ひいては、プログラマの意向を慮った凝集度測定が可能となる。
【００３９】
（第２の実施の形態）
（凝集度測定装置）
本発明の第２の実施の形態に係る凝集度測定装置２００は、図１０に示すように、ソースプログラム３１ａを記憶するソースプログラム記憶部３１、不変情報３２ａを記憶する不変情報記憶部３２、機能単位情報３３ａを記憶する機能単位情報記憶部３３、静的凝集度情報３５ａを記憶する静的凝集度記憶部３５、凝集度情報３６ａを記憶する凝集度記憶部３６、不変情報検出モジュール１１、機能単位検出モジュール１２、静的凝集度測定モジュール１４及び凝集度算出モジュール１５を備えている。尚、図示しないが、凝集度測定装置２００は、この他、中央演算装置（ＣＰＵ）、ＣＰＵが実行するプログラムを記憶するプログラム記憶部、制御の指示及びデータの入力を行う入力部、データの出力を行う出力部、ホストコンピュータ、インタフェース及びこれらを接続するシステムバスを備えていてもよい。
【００４０】
第２の実施の形態に係る凝集度測定装置２００は、凝集度を静的に解析し、測定する静的凝集度測定モジュール１４が、静的凝集度情報３５ａを作成する機能を付加する以外は、第１の実施の形態に係る凝集度測定装置１００と本質的に変わらない。凝集度測定装置２００の特徴は、静的凝集度測定モジュール１４が出力する静的凝集度情報３５ａを、凝集度算出モジュール１５への別の情報として入力するように構成してある点である。この目的は、主に動的解析の健全性の欠如を補うためである。
【００４１】
動的解析では、実際にプログラムを動作させた結果を利用して解析を行うことで、動作時の特性等を検出することを目的としている。しかしながらプログラムを動作させる際に利用するデータに偏りがあったり、サンプル数が不十分なケースでは、必ずしも真ではない結果が得られる、すなわち結果が健全ではない可能性がある。この問題を解決するために、第２の実施の形態では、静的解析技術を併用して健全性の確保を目指す。
【００４２】
（凝集度測定方法）
次に、本発明の第２の実施の形態に係る凝集度測定装置２００を用いた測定方法について説明する。
【００４３】
（ａ）ステップＳ２０１では、オペレータ等がソースプログラム３１ａを入力する。入力されたソースプログラム３１ａは、静的凝集度測定モジュール１４及び不変情報検出モジュール１１に送信される。尚、ステップＳ２０２〜Ｓ２０５は、ステップＳ１０２〜Ｓ１０５と同様である為記載を省略する。
【００４４】
（ｂ）ステップＳ２０６では、静的凝集度測定モジュール１４は、受け取ったソースプログラム３１ａの静的凝集度を測定する。静的凝集度としては、例えば、機能単位情報３３ａのプログラム中での参照頻度、他の機能単位情報３３ａとの相互依存関係等を扱う。次にステップＳ２０７で、測定された静的凝集度は、静的凝集度情報３５ａとして静的凝集度記憶部３５に記憶される。
【００４５】
（ｃ）ステップＳ２０８では、凝集度算出モジュール１５によって、凝集度の算出、格納が行われる。例えば、最終的な凝集度Ｃｆを算出するために、動的解析に基づく凝集度Ｃｄと静的解析に基づく凝集度ＣＳとをもちいて以下の式によって算出する。
【００４６】
Ｃｆ＝ＫｄＣｄ＋ＫｓＣｓ（Ｋｄ、Ｋｓ＞０、　Ｋｄ＋Ｋｓ＝１）・・・（１）
このＫｄ、Ｋｓの値は、具体的には動的解析に用いたテストケースの選定の適切さ等を考慮して決める事になる。例えばテストケースの全事象に対する網羅度ｃｖｅの関数として、以下の式を用いる。
【００４７】
Ｋｄ＝（ｃｖｅ）２　　（０≦ｃｖｅ≦１）・・・・・（２）
又、Ｋｄを用いてＫｓを以下のように決めることで、Ｃｆの値が正規化される。
【００４８】
Ｋｓ＝１−Ｋｄ・・・・・（３）
尚、網羅度測定や定量化の為に使用する式はこれらの式に限られるものではない。
【００４９】
上記のように、構文解析に意味的解析を加え、さらに、意味的解析に静的凝集度情報を付加することで、動的解析に使用したテストデータに偏りがあった場合でも、正確な不変情報を抽出することが出来、更に高精度な凝集度の測定を行う事が出来、ひいては、プログラムの保守性の評価をより的確に行う事が出来る。
【００５０】
【発明の効果】
本発明によると、ソースプログラムより不変情報を抽出し、この不変情報を動的及び静的に解析することにより、意味情報を測定及び定量化し、より正確な凝集度測定を可能にする凝集度測定装置、凝集度測定方法及び凝集度測定プログラムを提供することが出来る。
【図面の簡単な説明】
【図１】本発明の第１の実施の形態に係る凝集度測定装置の構成を示すブロック図である。
【図２】不変情報検出モジュールの構成を示す構成図である。
【図３】機能単位検出モジュールの構成を示す構成図である。
【図４】凝集度算出モジュールの構成を示す構成図である。
【図５】本発明の第１の実施の形態に係る凝集度測定方法の流れを示すフロー図である。
【図６】本発明の第１の実施の形態に係る凝集度測定装置の作用を示す為に用いられるプログラムである。
【図７】本発明の第１の実施の形態に係る凝集度測定装置の作用を示す為に用いられるプログラムである。
【図８】図６のプログラムに対応した機能単位分析の結果を示す図である。
【図９】図７のプログラムに対応した機能単位分析の結果を示す図である。
【図１０】本発明の第２の実施の形態に係る凝集度測定装置の構成を示すブロック図である。
【図１１】本発明の第２の実施の形態に係る凝集度測定方法の流れを示すフロー図である。
【符号の説明】
１…ＣＰＵ
２…プログラム記憶部
３…データ記憶部
４…出力部
５…入力部
６…ホストコンピュータ
７…インタフェース
８…システムバス
１１…不変情報検出モジュール
１１ａ…構文解析部
１１ｂ…抽出部
１２…機能単位検出モジュール
１２ａ…機能単位決定部
１２ｂ…機能単位検出部
１３…凝集度算出モジュール
１３ａ…単位決定部
１３ｂ…単位探索部
１３ｃ…凝集度算出部
１４…静的凝集度測定モジュール
１５…凝集度算出モジュール
３１…ソースプログラム記憶部
３１ａ…ソースプログラム
３２…不変情報記憶部
３２ａ…不変情報
３３…機能単位情報記憶部
３３ａ…機能単位情報
３４…凝集度記憶部
３４ａ…凝集度情報
３５…静的凝集度記憶部
３５ａ…静的凝集度情報
３６…凝集度記憶部
３６ａ…凝集度情報
１００…凝集度測定装置
２００…凝集度測定装置
【図１】
2004062452.tif 000003
【図２】
2004062452.tif 000004
【図３】
2004062452.tif 000005
【図４】
2004062452.tif 000006
【図５】
2004062452.tif 000007
【図６】
2004062452.tif 000008
【図７】
2004062452.tif 000009
【図８】
2004062452.tif 000010
【図９】
2004062452.tif 000011
【図１０】
2004062452.tif 000012
【図１１】
2004062452.tif 000013