(57)【要約】【課題】モジュールの構造化を促進し、独立性、保守性及び再利用性の高いモジュールの作成を実現すること。【解決手段】ソフトウェアを構成するモジュールの構造化を支援するモジュール構造化支援装置において、モジュール内のブロックの特性データを測定する特性測定部２と、前記測定した特性データに基づきモジュール分割の指針をユーザに提示するためのモジュール分割指針データを形成し、該形成したモジュール分割指針データに基づいてモジュール分割の指針をユーザに提示する特性判定部３とを備える。【選択図】      図１
2004295425.tif 000002
【特許請求の範囲】
【請求項１】
ソフトウェアを構成するモジュールの構造化を支援するモジュール構造化支援装置において、
モジュール内のブロックの特性データを測定する特性測定部と、
前記測定した特性データに基づきモジュール分割の指針をユーザに提示するためのモジュール分割指針データを形成し、該形成したモジュール分割指針データに基づいてモジュール分割の指針をユーザに提示する特性判定部と、
を備えることを特徴とするモジュール構造化支援装置。
【請求項２】
前記特性測定部は、前記特性データとして、各ブロック内で使用されている各変数の使用状況を示す変数情報を測定し、
前記特性判定部は、前記変数情報に基づいて同じ変数を使用しているブロックの組を示すデータをモジュール分割指針データとして形成し、同じ変数を使用している前記ブロックの組をユーザに提示することを特徴とする請求項１に記載のモジュール構造化支援装置。
【請求項３】
前記特性測定部は、前記特性データとして、各ブロックの複雑度を測定して前記各ブロック毎の複雑度情報を形成し、
前記特性判定部は、前記複雑度情報に基づいて各ブロックの複雑度が所定の設定値を越えたブロックを抽出したデータをモジュール分割指針データとして形成し、このモジュール分割指針データをユーザに提示することを特徴とする請求項１に記載のモジュール構造化支援装置。
【請求項４】
前記特性測定部は、前記特性データとして、各ブロックのネストの深さを測定して前記各ブロック毎のネスト深さ情報を形成し、
前記特性判定部は、前記ネスト深さ情報に基づいて各ブロックのネスト深さが所定の設定値を越えたブロックを抽出したデータをモジュール分割指針データとして形成し、このモジュール分割指針データをユーザに提示することを特徴とする請求項１に記載のモジュール構造化支援装置。
【請求項５】
前記特性測定部は、前記特性データとして、各ブロックのサイズを測定して前記各ブロック毎のサイズ情報を形成し、
前記特性判定部は、前記サイズ情報に基づいて各ブロックのサイズが所定の設定値を越えたブロックを抽出したデータをモジュール分割指針データとして形成し、このモジュール分割指針データをユーザに提示することを特徴とする請求項１に記載のモジュール構造化支援装置。
【請求項６】
ソフトウェアを構成するモジュールの構造化を支援するモジュール構造化支援装置において、
モジュールをブロックとして扱ってモジュールの特性を測定し、外部変数のモジュールでの使用状況を抽出し、同じ外部変数または同じ外部変数の組を使用しているモジュールの組をモジュール構造化の指針としてユーザに提示することを特徴とするモジュール構造化支援装置。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
この発明は、ソフトウェアを構成するモジュール（部分ソフトウェア）の構造化を行う指針として、モジュールを構成するブロックの特性またはブロックとして扱ったモジュールの特性を利用して独立性、保守性及び再利用性の高いモジュールを作成する指針をユーザに示すことが可能なモジュール構造化支援装置に関するものである。
【０００２】
【従来の技術】
様々なシステムや製品におけるソフトウェアが占める割合は年々大きくなっており、開発すべきソフトウェア量自体も増大し続けている。しかし、これに反して開発の期間はシステムや製品を早急に市場に投入する必要性からますます短縮することが求められてきている。
【０００３】
このような事態に対応する一つの方法として、ソフトウェアを構成するモジュールの構造化を行い、各モジュールの機能の単純化を図ってモジュールの開発効率を高めるとともに、モジュールの品質、独立性、理解性、可搬性、保守性や再利用性を向上させること、すなわちモジュール性の向上が行われている。このような構造でソフトウェアを構成することで、ソフトウェア自体の新規の開発効率を向上させるだけでなく、ソフトウェアに何らかの不具合が発生した場合の修正やそのソフトウェアの流用を行いやすくし、過去のソフトウェア資産の有効利用によるソフトウェア開発効率を向上させることが行われている。
【０００４】
しかしながら、実際にはソフトウェア開発期間の短さからモジュールの分割を検討する十分な時間がない、構造化されたモジュールの開発に慣れていないソフトウェア開発経験の浅いプログラマも開発に参加せざるを得ないということが多い。また、十分なモジュール性を持つモジュールを作成してもこれを修正しながら流用したことによってモジュール性が悪化してしまう場合も多い。
【０００５】
このような事態を打開するための手段として、モジュールを理解しやすくし、品質、保守性、再利用性の高いモジュールを得るための一つの指針としてモジュールの複雑度を測定し、複雑度の高いモジュールをユーザに報告する静的解析システムが存在している（例えば、非特許文献１、非特許文献２、非特許文献３）。
【０００６】
また、特許文献１には、変数の使用状況を示すメトリクス値を測定することでソフトウェアの構造化についての助言を行うシステムが開示されている。
【０００７】
【非特許文献１】
東陽テクニカ、Ｃディープフロー静的解析ツールＱＡ  Ｃ（登録商標）、［ｏｎｌｉｎｅ］、［平成１５年３月３日検索］、インターネット＜ＵＲＬ：ｈｔｔｐ：／／ｗｗｗ．ｔｏｙｏ．ｃｏ．ｊｐ／ｓｓ／ｑａｃ／ｉｎｄｅｘ．ｈｔｍｌ＞
【非特許文献２】
富士通ミドルウェア株式会社、組み込み開発支援システムＥＹＤＳシリーズ、［ｏｎｌｉｎｅ］、［平成１５年３月３日検索］、インターネット＜ＵＲＬ：ｈｔｔｐ：／／ｓｏｆｔｗａｒｅ．ｆｕｊｉｔｓｕ．ｃｏｍ／ｊｐ／ｐｒｏｄｕｃｔ／ｉｎｄｕｓｔ／ｅｙｄｓ／＞
【非特許文献３】
エー・アイ・コーポレーションア、ＭｃＣａｂｅ  ＩＱソフトウェア品質向上支援ツール、［ｏｎｌｉｎｅ］、［平成１５年３月３日検索］、インターネット＜ＵＲＬ：ｈｔｔｐ：／／ｗｗｗ．ａｉｃｐ．ｃｏ．ｊｐ／ｐｒｏｄｕｃｔ／ｍｃｃａｂｅ．ｈｔｍｌ＞
【特許文献１】
特開平６−１１９２０５号公報
【０００８】
【発明が解決しようとする課題】
しかしながら、しかし、上記のようなこれまでのシステムには次のような問題点があった。
【０００９】
（１）上記非特許文献１〜３に示されている静的解析システムは、複雑度の高いモジュールを検出し、モジュールを分割すべきであるという報告は行うようにしているが、分割の方法については何の指標も示さないため、具体的にどのようにモジュールを分割し、複雑度を下げるかについてはシステムのユーザが考えなければならない。
【００１０】
（２）特許文献１に示されたモジュール分解支援システムでは、変数の使用状況を元にソフトウェアの構造化のための判断、助言を行っているため、システムのユーザはどの変数に注目してモジュールの分割を行うべきかという点については助言を有効に使用することができるが、具体的にどのようにモジュールを分割するかについてはシステムのユーザが考えなければならない。また、特許文献１に示されたモジュール分解支援システムは、変数の使用状況をモジュールの分割の指針として使用しているのみで、逆にモジュール群で使用されている外部変数を局所化して情報を隠蔽するため、すなわち、複数のモジュールをグループ化するためには有効に使用されていない。
【００１１】
このように従来技術では、モジュールの複雑度を報告するのみであったり、モジュール中の変数の使用状況を示すメトリクス値によってモジュールの分割の指針は示すものの具体的なモジュールの分割の方法についてはユーザが判断する必要があった。また、得られた変数の使用状況の情報がモジュールの分割のためにのみ利用され、複数のモジュールをグループ化するために有効に用いられていなかった。
【００１２】
この発明は上記に鑑みてなされたもので、モジュールの構造化を促進し、独立性、保守性及び再利用性の高いモジュールの作成を実現するモジュール構造化支援装置を得ることを目的とする。
【００１３】
【課題を解決するための手段】
上記目的を達成するため、この発明にかかるモジュール構造化支援装置は、ソフトウェアを構成するモジュールの構造化を支援するモジュール構造化支援装置において、モジュール内のブロックの特性データを測定する特性測定部と、前記測定した特性データに基づきモジュール分割の指針をユーザに提示するためのモジュール分割指針データを形成し、該形成したモジュール分割指針データに基づいてモジュール分割の指針をユーザに提示する特性判定部とを備えることを特徴とする。
【００１４】
この発明によれば、モジュール内のブロックの特性データを測定し、測定した特性データに基づきモジュール分割の指針をユーザに提示するためのモジュール分割指針データを形成し、形成したモジュール分割指針データに基づいてモジュール分割の指針をユーザに提示するようにしたので、モジュールの分割の対象ブロックがユーザに明確に示されることになり、これを用いてユーザがモジュール構造化処理を行うようにすれば、モジュールの構造化が促進され、これによりモジュールの品質、メンテンナンス性および再利用性を向上させることができる。
【００１５】
【発明の実施の形態】
以下に添付図面を参照して、この発明にかかるモジュール構造化支援装置の好適な実施の形態を詳細に説明する。
【００１６】
実施の形態１．
図１は、この発明の実施の形態１であるモジュール構造化支援装置の構成を示すブロック図である。
【００１７】
図１に示すモジュール構造化支援装置は、ソースファイル記憶部１０、特性データ記憶部２０、モジュール分割指針データ記憶部３０、入出力装置９、特性測定部２、特性判定部３、表示制御部４および制御部１を備えている。
【００１８】
ソースファイル記憶部１０には、モジュール分割（モジュール構造化）を行う対象となるソースファイルＳＦが記憶される。特性測定部２は、ソースファイル記憶部１０からのソースファイルＳＦを入力として、ソースファイルＳＦ内に含まれるモジュール毎に各モジュール中に含まれるブロック毎の特性を測定し、測定した特性データＣＤを特性データ記憶部２０に出力する。この特性データＣＤには、モジュール内のブロックを抽出した結果として得られるブロック情報２１と、モジュール内の各ブロックに含まれる変数と変数の使用状況を保存するための変数情報２２とが含まれる（図６参照）。特性データ記憶部２０は、特性測定部２によって測定された特性データＣＤを各モジュール毎に記憶する。
【００１９】
特性判定部３は、特性データ記憶部２０に記憶される特性データＣＤを入力とし、その特性データＣＤを調べることによりモジュール分割の指針を出力可能な否かを判断し、モジュール分割の指針を出力可能な場合は、モジュール分割の指針をユーザに示す情報の元となるモジュール分割指針データＥＤを形成し、形成したモジュール分割指針データＥＤをモジュール分割指針データ記憶部３０に出力する。モジュール分割指針データ記憶部３０は、特性判定部３によって形成されたモジュール分割指針データＥＤを記憶する。表示制御部４は、ソースファイルＳＦ、特性データＣＤおよびモジュール分割指針データＥＤを入力として、これらを制御部１を介して入出力装置（表示部）に表示するとともに、特性判定部３がモジュール分割すべきである判断したモジュールに関するモジュール分割指針データ記憶部３０内のモジュール分割指針データＥＤに基づきモジュール分割の指針を入出力装置を介してユーザに提示するなどの制御を実行する。入出力装置９は、システムのユーザからの入力を受け付けてこれを制御部１に入力するとともに、制御部１から入力されるシステムからユ−ザに対する出力を表示する。制御部１は、モジュール構造化支援装置の上記各構成要素を統括的に制御するものである。
【００２０】
図２は特性データ記憶部２０に記憶される特性データＣＤのデータ構造を示すものである。特性データＣＤは、モジュール内のブロックを抽出した結果として得られるブロック情報２１と、モジュール内の各ブロックに含まれる変数と変数の使用状況を保存するための変数情報２２とを有している。
【００２１】
図２に示すブロック情報は、１つのブロックについてのブロック情報２１のデータ構造を示すもので、ブロック情報２１は、各ブロックを一意に識別するためのブロックＩＤ（ブロック識別情報）２１１と、ブロックのネストの深さを示すネスト数２１２と、ブロックの種類（モジュール定義、ｆｏｒ文などの制御構造を有するブロック、単純ブロック（制御構造を持たず、ブロック中の実行文をブロック開始から終了まで順次に実行する）等）を示すブロックタイプ２１３と、ブロックの開始行を示すブロック開始行２１４と、ブロックの開始桁を示すブロック開始桁２１５と、ブロックの終了行を示すブロック終了行２１６と、ブロックの終了桁を示すブロック終了桁２１７とを有して構成されている。
【００２２】
変数情報２２は、当該変数が含まれるブロックを示すブロックＩＤ２２１と、変数を一意に識別するための変数ＩＤ２２２と、変数名２２３と、変数の型を示す型情報（ブロック内で変数の実体宣言が行われている場合にのみ使用する）２２４と、ブロック内で変数に値が設定されたことを示す設定フラグ２２５と、ブロック内で変数の値が参照されたことを示す参照フラグ２２６とを有して構成されている。
【００２３】
図３は、モジュール分割指針データ記憶部３０に記憶される１つのモジュール分割指針データＥＤのデータ構造を示すものである。このモジュール分割指針データＥＤは、同じ変数を使用しているネストしていないブロックの組を一意に識別するための組ＩＤ３０１と、使用されている変数を示す変数ＩＤと、その組に含まれるブロックを示すブロックＩＤとを有して構成されている。
【００２４】
図４は図１に示した実施の形態１のモジュール構造化支援装置の動作の手順を示すフローチャートである。図５はソースコード（ソースファイル）ＳＦの一例を示すものであり、図６は図５のソースファイルＳＦから得られる特性データＣＤのブロック情報２１を示すものであり、図７は図５のソースファイルＳＦから得られる特性データＣＤの変数情報２２を示すものであり、図８は図５のソースファイルＳＦから得られるモジュール分割指針データＥＤを例示するものである。なお、図７では説明を簡単にするためにモジュールの引数を変数の情報として含めていないが含めるようにしても良い。また、図５のソースコードには、説明を簡単にするために外部変数を加えていないが外部変数が存在する場合は変数情報に外部変数を加えても良い。
【００２５】
以下、これら図４〜図８を用いて図１に示したモジュール構造化支援装置の動作について説明する。
【００２６】
（１）ステップＳ１…ユーザは入出力装置９を用いてソースファイル記憶部１０に記憶されているソースファイルのうちモジュール分割対象のソースファイルＳＦを指定する。制御部１は、ユーザによって指定されたソースファイルＳＦの情報を特性測定部２に通知する。
【００２７】
（２）ステップＳ２…制御部１は、特性測定部２を介して、ユーザによって指定されたソースファイルＳＦ中に定義されているモジュールの存在を確認し、モジュールが存在している場合は、各モジュールについて、ステップＳ３からステップＳ８までの処理が終了したか否かを確認する。ソースファイルＳＦ中に定義されている全てのモジュールについてステップＳ３からステップＳ８までの処理が終了した場合は、ステップＳ９で処理を終了する。すなわち、ステップＳ３からステップＳ８までの処理は、制御部１が、特性測定部２、特性判定部３及び表示制御部４を制御することで、指定されたソースファイルＳＦ中に定義されている一つ一つのモジュールに対し夫々実行される。
【００２８】
（３）ステップＳ３…特性測定部２は、指定されたソースファイルＳＦに定義されている１つのモジュールに対してそのモジュールの特性データＣＤのブロック情報２１を抽出生成する。生成された特性データＣＤのブロック情報２１は、特性データ記憶部２０に記憶される。なお、ブロック情報２１の生成方法としては、ブロックの情報が正確に抽出できる方法である限りどのような方法を用いてもよい。図５のソースファイルで定義されているモジュール：ｆｕｎｃｔｉｏｎに対する特性データＣＤのブロック情報２１は図６に示す通りとなる。
【００２９】
すなわち、図５のソースファイルは、１つのモジュール：ｆｕｎｃｔｉｏｎを有し、このモジュール：ｆｕｎｃｔｉｏｎ内には、図６に示すように、各種ブロックタイプおよびネスト数を持つ７つのブロックが含まれている。なお、便宜上、図５のソースファイルの例ではモジュールをｆｕｎｃｔｉｏｎ一つとしているが、ソースファイルＳＦで定義されるモジュールは勿論複数存在していて良い。
【００３０】
（４）ステップＳ４…特性測定部２は、モジュール内で使用されている変数自体の情報と変数の使用状況（変数定義、値設定及び値参照）を抽出し、該抽出した変数の情報とステップＳ３で生成されたブロック情報２１とを用いて特性データＣＤの変数情報２２を生成する。生成された特性データＣＤの変数情報２２は、特性データ記憶部２０に記憶される。図５のソースファイルの例で定義されているモジュール：ｆｕｎｃｔｉｏｎに対する特性データＣＤの変数情報２２は図７に示す通りとなる。
【００３１】
すなわち、図７に示すように、モジュール内に存在する各ブロック毎に、各ブロックに含まれる変数が抽出され、抽出された変数毎に、型情報、設定フラグの有無、参照フラグの有無が付加されることによって変数情報２２が生成される。
【００３２】
（５）ステップＳ５…制御部１は、特性判定部３と表示制御部４を介して、ステップＳ４で抽出した各変数に対して、ステップＳ６からステップＳ８までの処理が終了したか否かを確認する。全ての変数について、ステップＳ６からステップＳ８までの処理が終了していない場合は、手順をステップＳ６に移行させ、これ以降１つの変数毎に、ステップＳ６からステップＳ８までの処理を実行させる。また、ステップＳ５において、全ての変数について、ステップＳ６からステップＳ８までの処理が終了していると判断された場合は、手順をステップＳ２に復帰させる。ステップＳ２においては、ソースファイルの中に次のモジュールが存在すると判断された場合は、再度ステップＳ３からステップＳ８までの処理を繰り返す。ステップＳ２において、ソースファイルの中に次のモジュールが存在しないと判断された場合は、前述したように、全てのモジュールについての処理が終了したとして、今回指定されたソースファイルについての処理を終了する。
【００３３】
（６）ステップＳ６…特性判定部３は、変数情報２２を参照して、注目している１つの変数に関して、その変数を値設定及び値参照しており（設定フラグおよび参照フラグがオン（○）である）かつネストしていない即ちネスト数が同じである二つ以上の異なるブロックの組を抽出し、抽出した組データをモジュール分割指針データＥＤとして記録し、このモジュール分割指針データＥＤをモジュール分割指針データ記憶部３０に記憶する。
【００３４】
（７）ステップＳ７，Ｓ８…制御部１は、モジュール分割指針データＥＤに記録されたブロックの組が存在するかどうかを判定し、もし、ブロックの組が存在しない場合は次の変数に対する処理を行うため、手順をステップＳ５に復帰させる。一方、制御部１は、モジュール分割指針データＥＤに記録されたブロックの組が存在すると判断した場合は、表示制御部４に表示指令を与える。表示指令を与えられた表示制御部４は、入出力装置９を経由してモジュール分割指針データＥＤに記録されたブロックの組の情報を適宜の形態で表示するなどして、モジュール分割指針データＥＤに記録されたブロックの組の情報をモジュール分割の指針としてユーザに提示する。
【００３５】
図８は、図５のソースファイルの例で定義されているモジュール：ｆｕｎｃｔｉｏｎに対するモジュール分割指針データＥＤを示すものである。図８に示すように、図５のソースファイルの場合は、変数ｉに対してはブロックＩＤが「２」と「５」のブロックが１つの組となり、変数ｊに対してはブロックＩＤが「２」と「５」の各ブロックが１つの組となり、さらに変数ｊに対してはブロックＩＤが「３」と「６」の各ブロックが１つの組となる。すなわち、変数ｉに関してはブロックＩＤが「２」と「５」の１組がブロックがモジュール分割の指針としてユーザに提示され、変数ｊに関してはブロックＩＤが「２」と「５」および「３」と「６」の２組のブロックがモジュール分割の対象ブロックを示す指針情報としてユーザに提示される。この指針を見ることにより、ユーザは、指定したソースファイルをどのように分割するべきかを知ることができるので、提示された指針情報が妥当な場合、その後指針に従ってモジュール分割した修正ソースファイルを作成するようにすればよい。
【００３６】
このように実施の形態１においては、ソースファイルからブロック情報さらには変数情報を各モジュール毎に作成し、作成した変数情報を用いてモジュール分割の対象ブロックを具体的に示すモジュール分割指針データを求め、このモジュール分割指針データによって各ブロックの関連性の程度をユーザに提示するようにしているので、モジュールの分割の対象ブロックがユーザに明確に示されることになり、これを用いてモジュール構造化処理を行うようにすれば、モジュール構造化が促進され、独立性、保守性及び再利用性の高いモジュールから構成されるソフトウェアを実現することができる。
【００３７】
実施の形態２．
つぎに、この発明の実施の形態２について説明する。図９はこの発明の実施の形態２であるモジュール構造化支援装置の構成を示すブロック図である。この実施の形態２においては、先の実施の形態１で用いた変数情報の変わりに、図１０にそのデータ構造を示す複雑度情報を用い、この複雑度情報に基づき形成したモジュール分割指針データを元にモジュール分割の指針をユーザに提示するようにしている。
【００３８】
複雑度情報とは、ソフトウェアの複雑度を示す情報であり、複雑度としては、例えばマッケーブの循環的複雑度（ＭｃＣａｂｅ’ｓ  ｃｙｃｌｏｍａｔｉｃ  ｃｏｍｐｌｅｘｉｔｙ）等、ソフトウェアの複雑度を客観的に示す値であるならば任意の値を採用すればよい。また、複雑度を示す値は一つの値ではなく、複数の値の組からなるものを使用するようにしてもよい。
【００３９】
図９に示す実施の形態２のモジュール構造化支援装置は、ソースファイル記憶部１０、特性データ記憶部２０、モジュール分割指針データ記憶部４０、入出力装置９、特性測定部２、特性判定部３、表示制御部４および制御部１を備えている。
【００４０】
ソースファイル記憶部１０には、モジュール分割を行う対象となるソースファイルＳＦが記憶される。特性測定部２は、ソースファイル記憶部１０からのソースファイルＳＦを入力として、ソースファイルＳＦ内に含まれるモジュール毎に各モジュール中に含まれるブロック毎の特性を測定し、測定した特性データＣＤ´を特性データ記憶部２０に出力する。先の実施の形態１においては、特性データＣＤには、ブロック情報２１と、変数情報２２とが含まれていたが、実施の形態２においては、特性データＣＤ´には、ブロック情報２１と、図１０にそのデータ構造を示す複雑度情報２３とが含まれる。特性データ記憶部２０には、特性測定部２によって測定された特性データＣＤ´（ブロック情報２１＋複雑度情報２３）が、各モジュール毎に記憶される。
【００４１】
特性判定部３は、特性データ記憶部２０に記憶される特性データＣＤ´（ブロック情報２１＋複雑度情報２３）を入力として、その特性データＣＤを調べることによりモジュール分割の指針を出力可能な否かを判断し、モジュール分割の指針を出力可能な場合は、モジュール分割の指針をユーザに示す情報の元となるモジュール分割指針データＦＤを形成し、形成したモジュール分割指針データＦＤをモジュール分割指針データ記憶部４０に出力する。モジュール分割指針データ記憶部４０は、特性判定部３によって形成されたモジュール分割指針データＦＤを記憶する。
【００４２】
表示制御部４は、ソースファイルＳＦ、特性データＣＤおよびモジュール分割指針データＥＤを入力として、これらを制御部１を介して入出力装置（表示部）に表示するとともに、特性判定部３がモジュール分割すべきである判断したモジュールに関するモジュール分割指針データ記憶部３０内のモジュール分割指針データＥＤに基づきモジュール分割の指針を入出力装置を介してユーザに提示するなどの制御を実行する。入出力装置９は、システムのユーザからの入力を受け付けてこれを制御部１に入力するとともに、制御部１から入力されるシステムからユ−ザに対する出力を表示する。制御部１は、モジュール構造化支援装置の上記各構成要素を統括的に制御するものである。
【００４３】
図１０は特性データ記憶部２０に記憶される１つのブロックについての複雑度情報２３のデータ構造を示すものである。複雑度情報２３は、ブロックＩＤ２３１と、このブロックＩＤの複雑度を示す複雑度値とで構成されている。図１１は図９に示したモジュール構造化支援装置の動作の手順を示すフローチャートである。図１２は図５に示したソースコードＳＦから得られる特性データＣＤ´の複雑度情報２３の例である。使用した複雑度はサイクロマティック複雑度である。
【００４４】
以下、これら図１０〜図１２などを用いて図９に示した実施の形態２のモジュール構造化支援装置の動作について説明する。
【００４５】
（１）ステップＳ１０１…ユーザは入出力装置９を用いてソースファイル記憶部１０に記憶されているソースファイルのうちからモジュール分割対象のソースファイルＳＦを指定するとともに、モジュール分割の基準値とする複雑度値を指定する。制御部１は、ユーザによって指定されたソースファイルＳＦの情報を特性測定部２に通知するとともに、モジュール分割の基準値とする複雑度値を特性判定部３に通知する。
【００４６】
（２）ステップＳ１０２…制御部１は、特性測定部２を介して、ユーザによって指定されたソースファイルＳＦ中に定義されているモジュールの存在を確認し、モジュールが存在している場合は、各モジュールについて、ステップＳ１０３からステップＳ１０７までの処理が終了したか否かを確認する。ソースファイルＳＦ中に定義されている全てのモジュールについてステップＳ１０３からステップＳ１０７までの処理が終了した場合は、ステップＳ１０８で処理を終了する。すなわち、ステップＳ１０３からステップＳ１０７までの処理は、制御部１が、特性測定部２、特性判定部３及び表示制御部４を制御することで、指定されたソースファイルＳＦ中に定義されている一つ一つのモジュールに対し夫々実行される。
【００４７】
（３）ステップＳ１０３…特性測定部２は、先の実施の形態１と同様にして、指定されたソースファイルＳＦに定義されている１モジュールに対してそのモジュールの特性データＣＤ´のブロック情報２１を抽出生成する。生成された特性データＣＤ´のブロック情報２１は、特性データ記憶部２０に記憶される。図５のソースファイルで定義されているモジュール：ｆｕｎｃｔｉｏｎに対する特性データＣＤ´のブロック情報２１は先の図６に示す通りとなる。
【００４８】
（４）ステップＳ１０４…特性測定部２は、ステップＳ１０３で抽出したブロック毎にその複雑度を測定し、ステップＳ１０３で生成されたブロック情報２１とブロック毎に測定した複雑度から複雑度情報２３を生成する。生成された特性データＣＤ´の複雑度情報２３は、特性データ記憶部２０に記憶される。図５のソースファイルの例で定義されているモジュール：ｆｕｎｃｔｉｏｎに対する特性データＣＤ´の複雑度情報２３は図１２に示す通りとなる。
【００４９】
すなわち、図１２に示すように、ある１つのモジュールについての複雑度情報２３は、モジュール内に存在する複数のブロックについて、ブロックＩＤと複雑度を示す複雑度値との対応関係を示すものとなる。
【００５０】
（５）ステップＳ１０５…制御部１は、特性判定部３と表示制御部４を介して、ステップＳ４で抽出した各ブロックに対して、ステップＳ１０６からステップＳ１０７までの処理が終了したか否かを確認する。全てのブロックについて、ステップＳ１０６からステップＳ１０７までの処理が終了していない場合は、手順をステップＳ１０６に移行させ、これ以降１つのブロック毎に、ステップＳ１０６からステップＳ１０７までの処理を実行させる。また、ステップＳ１０５において、全ての変数について、ステップＳ１０６からステップＳ１０７までの処理が終了していると判断された場合は、手順をステップＳ１０２に復帰させる。ステップＳ１０２においては、ソースファイルの中に次のモジュールが存在すると判断された場合は、再度ステップＳ１０３からステップＳ１０７までの処理を繰り返す。ステップＳ１０２において、ソースファイルの中に次のモジュールが存在しないと判断された場合は、前述したように、全てのモジュールについての処理が終了したとして、今回指定されたソースファイルについての処理を終了する（ステップＳ１０８）。
【００５１】
（６）ステップＳ１０６…特性判定部３は、ブロック情報２１および複雑度情報２３から成る特性データＣＤ´を参照して、現在注目しているブロックのブロックタイプが「モジュール定義」でなく、かつ、そのブロックの複雑度がステップＳ１０１で指定された基準複雑度値を越えているブロックの場合は、この現在注目しているブロックを抽出し、抽出したブロックを例えばその複雑度とともにモジュール分割指針データＥＤとして記録し、このモジュール分割指針データＥＤをモジュール分割指針データ記憶部３０に記憶する。ステップＳ１０６の条件が成立しない場合は、手順をステップＳ１０５に移行させて、次のブロックについてのステップＳ１０６の条件判定を実行させる。
【００５２】
（７）ステップＳ１０７…制御部１は、モジュール分割指針データＥＤに記録されたブロックが存在する場合、すなわちステップＳ１０６の判断がＹｅｓの場合は、表示制御部４に表示指令を与える。表示指令を与えられた表示制御部４は、入出力装置９を経由してモジュール分割指針データＥＤに記録されたブロックの情報を適宜の形態で表示するなどして、モジュール分割指針データＥＤに記録されたブロックの情報をモジュール分割の指針としてユーザに提示する。図１２の例では、基準複雑度を「２」に設定した場合には、ブロックＩＤが「２」と「５」の２つのブロックがモジュール分割指針データＥＤとしてモジュール分割指針データ記憶部３０に記憶されるとともに、これら２つのブロックがモジュール分割の対象ブロックを示す指針情報としてユーザに提示されることになる。この指針を見ることにより、ユーザは、指定したソースファイルをどのように分割するべきかを知ることができるので、提示された指針情報が妥当な場合、その後指針に従ってモジュール分割した修正ソースファイルを作成するようにすればよい。
【００５３】
このように実施の形態２においては、ソースファイルから各ブロック毎のブロック情報、複雑度情報を各モジュール毎に作成し、作成したブロック情報、複雑度情報を用いてモジュール分割の対象ブロックを具体的に示すモジュール分割指針データを求め、このモジュール分割指針データによって各ブロックの複雑度の分布をユーザに提示するようにしているので、モジュールの分割の対象ブロックがユーザに明確に示されることになり、これを用いてモジュール構造化処理を行うようにすれば、モジュール構造化が促進され、より独立性、保守性及び再利用性の高いモジュールを備えるソフトウェアを実現することができる。
【００５４】
なお、上記実施の形態２においては、複雑度情報２３として、マッケーブの循環的複雑度を用いるようにしたが、他の複雑度の指標を用いるようにしてもよい。例えば、モジュールを構成する複数のブロックで定義されている式の複雑度を測定することが可能なＨａｌｓｔｅａｄの複雑度などを用いるようにしてもよい。Ｈａｌｓｔｅａｄの複雑度を採用した場合は、比較用に指定する基準複雑度値もこれに対応した値を採用する必要がある。
【００５５】
実施の形態３．
つぎに、実施の形態３について説明する。実施の形態３においては、実施の形態２で使用した複雑度情報２３の代わりにブロックのサイズを示すブロックサイズ情報を使用する。各ブロックのサイズを示すブロックサイズ情報としては、ステップ数等を採用する。
【００５６】
この実施の形態３においては、特性測定部２は、指定されたソースファイルからブロック情報とブロックサイズ情報を形成する。特性判定部は、ブロックサイズ情報に基づいて各ブロックのサイズが、指定した基準値サイズを越えたブロックを抽出し、該抽出したブロックに対応するブロックＩＤが記録されたモジュール分割指針データを先の実施の形態２と同様にして形成する。そして、指定した基準値サイズを越えたブロックのブロックＩＤを実施の形態２と同様にしてユーザに提示する。
【００５７】
この実施の形態３においては、ソースファイルから各ブロック毎のブロック情報、ブロックサイズ情報を各モジュール毎に作成し、作成したブロック情報、ブロックサイズ情報を用いてモジュール分割の対象ブロックを具体的に示すモジュール分割指針データを求め、このモジュール分割指針データによって各ブロックのブロックサイズの分布をユーザに提示するようにしているので、モジュールの分割の対象ブロックがユーザに明確に示されることになり、これを用いてモジュール構造化処理を行うようにすれば、モジュール構造化が促進され、より独立性、保守性及び再利用性の高いモジュールを備えるソフトウェアを実現することができる。
【００５８】
実施の形態４．
つぎに、実施の形態４について説明する。実施の形態４においては、実施の形態２で使用した複雑度情報２３の代わりにネストの深さを示すネスト深さ情報（ネスト数情報）を使用する。ネスト数情報は、各ブロックＩＤと、各ブロックがもつネスト数との対応関係を示す情報である。
【００５９】
実施の形態４においては、特性測定部２は、指定されたソースファイルからブロック情報とネスト数情報を形成する。特性判定部は、ネスト数情報に基づいて各ブロックのネスト数が、指定した基準値を越えたブロックを抽出し、該抽出したブロックに対応するブロックＩＤが記録されたモジュール分割指針データを先の実施の形態２と同様にして形成する。そして、指定した基準値を越えたネスト数を持つブロックのブロックＩＤを実施の形態２と同様にしてユーザに提示する。
【００６０】
この実施の形態４においては、ソースファイルから各ブロック毎のブロック情報、ネスト数情報を各モジュール毎に作成し、作成したブロック情報、ネスト数情報を用いてモジュール分割の対象ブロックを具体的に示すモジュール分割指針データを求め、このモジュール分割指針データによって各ブロックのネスト深さの分布をユーザに提示するようにしているので、モジュールの分割の対象ブロックがユーザに明確に示されることになり、これを用いてモジュール構造化処理を行うようにすれば、モジュール構造化が促進され、より独立性、保守性及び再利用性の高いモジュールを備えるソフトウェアを実現することができる。
【００６１】
実施の形態５．
つぎに、実施の形態５について説明する。先の実施の形態１においては、モジュール内のブロックを単位としてモジュール内でモジュール分割すべき部分をユーザに指針として示すようにした。実施の形態５においては、モジュールを一つのブロックと見なし、処理に用いる変数を外部変数のみとする。そして、先の実施の形態１と同様に、各モジュールでの外部変数の使用状況（変数への値設定及び変数の値参照）を抽出し、同じ外部変数または同じ外部変数の組を使用しているモジュールの組を抽出し、抽出したモジュールの組をモジュール構造化指針データとしてユーザに提示するようにする。この実施の形態５の処理としては、扱う変数が外部変数となること、ブロック＝モジュールに置き換える以外は、先の実施の形態１と同様である。
【００６２】
この実施の形態５によれば、モジュールを一つのブロックと見なしているので、情報の隠蔽度が強化され、モジュールのモジュール性を向上させることができる。また、外部変数の使用状況から見てモジュールを構造化することが可能となり、外部変数の使用を局所化でき、情報の隠蔽度を向上させることが可能となる。
【００６３】
なお、上記各実施の形態において、ブロックの概念を制御構造としてのブロックだけでなく、モジュール中の空白行又はコメントからのみ構成される行で区切られた領域もブロックと見なして処理を行うようにしてもよい。すなわち、この場合は、モジュール中の空白行又はコメントからのみ構成される行で区切られた領域も制御構造としてのブロックと同等に扱う。
【００６４】
また、表示制御部４は、ユーザに提示するモジュール分割の指針として、ブロックＩＤに対応するモジュールのブロックのみを表示するようにしてもよいが、各モジュールを表示し、その中のどの部分をモジュール分割すべきかを強調表示するようにしてもよい。図１３に示すように、分割すべき部分を持つモジュールを表示し、さらに分割すべきブロックを例えば太字及び斜字体で表示するようにする。この場合は、ステップ番号「１４」〜「１６」のブロックと、ステップ番号「１９」〜「２１」のブロックを太字及び斜字体で表示するようにしており、これらのブロックがモジュール分割対象ブロックとなる。なお、強調表示の手法は、色を変えるなど他の任意の手法を用いるようにしてもよい。
【００６５】
【発明の効果】
以上説明したように、この発明によれば、モジュール内のブロックの特性データを測定し、測定した特性データに基づきモジュール分割の指針をユーザに提示するためのモジュール分割指針データを形成し、形成したモジュール分割指針データに基づいてモジュール分割の指針をユーザに提示するようにしたので、モジュールの分割の対象ブロックがユーザに明確に示されることになり、これを用いてユーザがモジュール構造化処理を行うようにすれば、モジュールの構造化が促進され、これによりモジュールの品質、メンテンナンス性および再利用性を向上させることができる。
【図面の簡単な説明】
【図１】本発明の実施の形態１のモジュール構造化支援装置の構成を示すブロック図である。
【図２】図１の特性測定部が生成する特性データのデータ構造を示す図である。
【図３】図１の特性判定部が生成するモジュール分割指針データのデータ構造を示す図である。
【図４】実施の形態１のモジュール構造化支援装置の動作手順を示すフローチャートである。
【図５】モジュール分割の対象となるソースコードの例を示す図である。
【図６】図５のソースコードから得られるブロック情報の例を示す図である。
【図７】図５のソースコードから得られる変数情報の例を示す図である。
【図８】図５のソースコードから得られるモジュール分割指針データの例を示す図である。
【図９】本発明の実施の形態２のモジュール構造化支援装置の構成を示すブロック図である。
【図１０】図９の特性測定部が生成する複雑度情報のデータ構造を示す図である。
【図１１】実施の形態２のモジュール構造化支援装置の動作手順を示すフローチャートである。
【図１２】実施の形態２において、図５のソースコードから得られる複雑度情報の例を示す図である。
【図１３】モジュール分割対象の強調表示の一例を示す図である。
【符号の説明】
１  制御部、２  特性測定部、３  特性判定部、４  表示制御部、９  入出力装置、１０  ソースファイル記憶部、２０  特性データ記憶部、２１  ブロック情報、２２  変数情報、２３  複雑度情報、３０，４０  モジュール分割指針データ記憶部、ＣＤ  特性データ、ＥＤ，ＦＤ  モジュール分割指針データ、ＳＦソースファイル（ソースコード）。
【図１】
2004295425.tif 000003
【図２】
2004295425.tif 000004
【図３】
2004295425.tif 000005
【図４】
2004295425.tif 000006
【図５】
2004295425.tif 000007
【図６】
2004295425.tif 000008
【図７】
2004295425.tif 000009
【図８】
2004295425.tif 000010
【図９】
2004295425.tif 000011
【図１０】
2004295425.tif 000012
【図１１】
2004295425.tif 000013
【図１２】
2004295425.tif 000014
【図１３】
2004295425.tif 000015