JP2004295425A - モジュール構造化支援装置 - Google Patents
モジュール構造化支援装置 Download PDFInfo
- Publication number
- JP2004295425A JP2004295425A JP2003086239A JP2003086239A JP2004295425A JP 2004295425 A JP2004295425 A JP 2004295425A JP 2003086239 A JP2003086239 A JP 2003086239A JP 2003086239 A JP2003086239 A JP 2003086239A JP 2004295425 A JP2004295425 A JP 2004295425A
- Authority
- JP
- Japan
- Prior art keywords
- module
- block
- data
- characteristic
- information
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Landscapes
- Stored Programmes (AREA)
Abstract
【課題】モジュールの構造化を促進し、独立性、保守性及び再利用性の高いモジュールの作成を実現すること。
【解決手段】ソフトウェアを構成するモジュールの構造化を支援するモジュール構造化支援装置において、モジュール内のブロックの特性データを測定する特性測定部2と、前記測定した特性データに基づきモジュール分割の指針をユーザに提示するためのモジュール分割指針データを形成し、該形成したモジュール分割指針データに基づいてモジュール分割の指針をユーザに提示する特性判定部3とを備える。
【選択図】 図1
【解決手段】ソフトウェアを構成するモジュールの構造化を支援するモジュール構造化支援装置において、モジュール内のブロックの特性データを測定する特性測定部2と、前記測定した特性データに基づきモジュール分割の指針をユーザに提示するためのモジュール分割指針データを形成し、該形成したモジュール分割指針データに基づいてモジュール分割の指針をユーザに提示する特性判定部3とを備える。
【選択図】 図1
Description
【0001】
【発明の属する技術分野】
この発明は、ソフトウェアを構成するモジュール(部分ソフトウェア)の構造化を行う指針として、モジュールを構成するブロックの特性またはブロックとして扱ったモジュールの特性を利用して独立性、保守性及び再利用性の高いモジュールを作成する指針をユーザに示すことが可能なモジュール構造化支援装置に関するものである。
【0002】
【従来の技術】
様々なシステムや製品におけるソフトウェアが占める割合は年々大きくなっており、開発すべきソフトウェア量自体も増大し続けている。しかし、これに反して開発の期間はシステムや製品を早急に市場に投入する必要性からますます短縮することが求められてきている。
【0003】
このような事態に対応する一つの方法として、ソフトウェアを構成するモジュールの構造化を行い、各モジュールの機能の単純化を図ってモジュールの開発効率を高めるとともに、モジュールの品質、独立性、理解性、可搬性、保守性や再利用性を向上させること、すなわちモジュール性の向上が行われている。このような構造でソフトウェアを構成することで、ソフトウェア自体の新規の開発効率を向上させるだけでなく、ソフトウェアに何らかの不具合が発生した場合の修正やそのソフトウェアの流用を行いやすくし、過去のソフトウェア資産の有効利用によるソフトウェア開発効率を向上させることが行われている。
【0004】
しかしながら、実際にはソフトウェア開発期間の短さからモジュールの分割を検討する十分な時間がない、構造化されたモジュールの開発に慣れていないソフトウェア開発経験の浅いプログラマも開発に参加せざるを得ないということが多い。また、十分なモジュール性を持つモジュールを作成してもこれを修正しながら流用したことによってモジュール性が悪化してしまう場合も多い。
【0005】
このような事態を打開するための手段として、モジュールを理解しやすくし、品質、保守性、再利用性の高いモジュールを得るための一つの指針としてモジュールの複雑度を測定し、複雑度の高いモジュールをユーザに報告する静的解析システムが存在している(例えば、非特許文献1、非特許文献2、非特許文献3)。
【0006】
また、特許文献1には、変数の使用状況を示すメトリクス値を測定することでソフトウェアの構造化についての助言を行うシステムが開示されている。
【0007】
【非特許文献1】
東陽テクニカ、Cディープフロー静的解析ツールQA C(登録商標)、[online]、[平成15年3月3日検索]、インターネット<URL:http://www.toyo.co.jp/ss/qac/index.html>
【非特許文献2】
富士通ミドルウェア株式会社、組み込み開発支援システムEYDSシリーズ、[online]、[平成15年3月3日検索]、インターネット<URL:http://software.fujitsu.com/jp/product/indust/eyds/>
【非特許文献3】
エー・アイ・コーポレーションア、McCabe IQソフトウェア品質向上支援ツール、[online]、[平成15年3月3日検索]、インターネット<URL:http://www.aicp.co.jp/product/mccabe.html>
【特許文献1】
特開平6−119205号公報
【0008】
【発明が解決しようとする課題】
しかしながら、しかし、上記のようなこれまでのシステムには次のような問題点があった。
【0009】
(1)上記非特許文献1〜3に示されている静的解析システムは、複雑度の高いモジュールを検出し、モジュールを分割すべきであるという報告は行うようにしているが、分割の方法については何の指標も示さないため、具体的にどのようにモジュールを分割し、複雑度を下げるかについてはシステムのユーザが考えなければならない。
【0010】
(2)特許文献1に示されたモジュール分解支援システムでは、変数の使用状況を元にソフトウェアの構造化のための判断、助言を行っているため、システムのユーザはどの変数に注目してモジュールの分割を行うべきかという点については助言を有効に使用することができるが、具体的にどのようにモジュールを分割するかについてはシステムのユーザが考えなければならない。また、特許文献1に示されたモジュール分解支援システムは、変数の使用状況をモジュールの分割の指針として使用しているのみで、逆にモジュール群で使用されている外部変数を局所化して情報を隠蔽するため、すなわち、複数のモジュールをグループ化するためには有効に使用されていない。
【0011】
このように従来技術では、モジュールの複雑度を報告するのみであったり、モジュール中の変数の使用状況を示すメトリクス値によってモジュールの分割の指針は示すものの具体的なモジュールの分割の方法についてはユーザが判断する必要があった。また、得られた変数の使用状況の情報がモジュールの分割のためにのみ利用され、複数のモジュールをグループ化するために有効に用いられていなかった。
【0012】
この発明は上記に鑑みてなされたもので、モジュールの構造化を促進し、独立性、保守性及び再利用性の高いモジュールの作成を実現するモジュール構造化支援装置を得ることを目的とする。
【0013】
【課題を解決するための手段】
上記目的を達成するため、この発明にかかるモジュール構造化支援装置は、ソフトウェアを構成するモジュールの構造化を支援するモジュール構造化支援装置において、モジュール内のブロックの特性データを測定する特性測定部と、前記測定した特性データに基づきモジュール分割の指針をユーザに提示するためのモジュール分割指針データを形成し、該形成したモジュール分割指針データに基づいてモジュール分割の指針をユーザに提示する特性判定部とを備えることを特徴とする。
【0014】
この発明によれば、モジュール内のブロックの特性データを測定し、測定した特性データに基づきモジュール分割の指針をユーザに提示するためのモジュール分割指針データを形成し、形成したモジュール分割指針データに基づいてモジュール分割の指針をユーザに提示するようにしたので、モジュールの分割の対象ブロックがユーザに明確に示されることになり、これを用いてユーザがモジュール構造化処理を行うようにすれば、モジュールの構造化が促進され、これによりモジュールの品質、メンテンナンス性および再利用性を向上させることができる。
【0015】
【発明の実施の形態】
以下に添付図面を参照して、この発明にかかるモジュール構造化支援装置の好適な実施の形態を詳細に説明する。
【0016】
実施の形態1.
図1は、この発明の実施の形態1であるモジュール構造化支援装置の構成を示すブロック図である。
【0017】
図1に示すモジュール構造化支援装置は、ソースファイル記憶部10、特性データ記憶部20、モジュール分割指針データ記憶部30、入出力装置9、特性測定部2、特性判定部3、表示制御部4および制御部1を備えている。
【0018】
ソースファイル記憶部10には、モジュール分割(モジュール構造化)を行う対象となるソースファイルSFが記憶される。特性測定部2は、ソースファイル記憶部10からのソースファイルSFを入力として、ソースファイルSF内に含まれるモジュール毎に各モジュール中に含まれるブロック毎の特性を測定し、測定した特性データCDを特性データ記憶部20に出力する。この特性データCDには、モジュール内のブロックを抽出した結果として得られるブロック情報21と、モジュール内の各ブロックに含まれる変数と変数の使用状況を保存するための変数情報22とが含まれる(図6参照)。特性データ記憶部20は、特性測定部2によって測定された特性データCDを各モジュール毎に記憶する。
【0019】
特性判定部3は、特性データ記憶部20に記憶される特性データCDを入力とし、その特性データCDを調べることによりモジュール分割の指針を出力可能な否かを判断し、モジュール分割の指針を出力可能な場合は、モジュール分割の指針をユーザに示す情報の元となるモジュール分割指針データEDを形成し、形成したモジュール分割指針データEDをモジュール分割指針データ記憶部30に出力する。モジュール分割指針データ記憶部30は、特性判定部3によって形成されたモジュール分割指針データEDを記憶する。表示制御部4は、ソースファイルSF、特性データCDおよびモジュール分割指針データEDを入力として、これらを制御部1を介して入出力装置(表示部)に表示するとともに、特性判定部3がモジュール分割すべきである判断したモジュールに関するモジュール分割指針データ記憶部30内のモジュール分割指針データEDに基づきモジュール分割の指針を入出力装置を介してユーザに提示するなどの制御を実行する。入出力装置9は、システムのユーザからの入力を受け付けてこれを制御部1に入力するとともに、制御部1から入力されるシステムからユ−ザに対する出力を表示する。制御部1は、モジュール構造化支援装置の上記各構成要素を統括的に制御するものである。
【0020】
図2は特性データ記憶部20に記憶される特性データCDのデータ構造を示すものである。特性データCDは、モジュール内のブロックを抽出した結果として得られるブロック情報21と、モジュール内の各ブロックに含まれる変数と変数の使用状況を保存するための変数情報22とを有している。
【0021】
図2に示すブロック情報は、1つのブロックについてのブロック情報21のデータ構造を示すもので、ブロック情報21は、各ブロックを一意に識別するためのブロックID(ブロック識別情報)211と、ブロックのネストの深さを示すネスト数212と、ブロックの種類(モジュール定義、for文などの制御構造を有するブロック、単純ブロック(制御構造を持たず、ブロック中の実行文をブロック開始から終了まで順次に実行する)等)を示すブロックタイプ213と、ブロックの開始行を示すブロック開始行214と、ブロックの開始桁を示すブロック開始桁215と、ブロックの終了行を示すブロック終了行216と、ブロックの終了桁を示すブロック終了桁217とを有して構成されている。
【0022】
変数情報22は、当該変数が含まれるブロックを示すブロックID221と、変数を一意に識別するための変数ID222と、変数名223と、変数の型を示す型情報(ブロック内で変数の実体宣言が行われている場合にのみ使用する)224と、ブロック内で変数に値が設定されたことを示す設定フラグ225と、ブロック内で変数の値が参照されたことを示す参照フラグ226とを有して構成されている。
【0023】
図3は、モジュール分割指針データ記憶部30に記憶される1つのモジュール分割指針データEDのデータ構造を示すものである。このモジュール分割指針データEDは、同じ変数を使用しているネストしていないブロックの組を一意に識別するための組ID301と、使用されている変数を示す変数IDと、その組に含まれるブロックを示すブロックIDとを有して構成されている。
【0024】
図4は図1に示した実施の形態1のモジュール構造化支援装置の動作の手順を示すフローチャートである。図5はソースコード(ソースファイル)SFの一例を示すものであり、図6は図5のソースファイルSFから得られる特性データCDのブロック情報21を示すものであり、図7は図5のソースファイルSFから得られる特性データCDの変数情報22を示すものであり、図8は図5のソースファイルSFから得られるモジュール分割指針データEDを例示するものである。なお、図7では説明を簡単にするためにモジュールの引数を変数の情報として含めていないが含めるようにしても良い。また、図5のソースコードには、説明を簡単にするために外部変数を加えていないが外部変数が存在する場合は変数情報に外部変数を加えても良い。
【0025】
以下、これら図4〜図8を用いて図1に示したモジュール構造化支援装置の動作について説明する。
【0026】
(1)ステップS1…ユーザは入出力装置9を用いてソースファイル記憶部10に記憶されているソースファイルのうちモジュール分割対象のソースファイルSFを指定する。制御部1は、ユーザによって指定されたソースファイルSFの情報を特性測定部2に通知する。
【0027】
(2)ステップS2…制御部1は、特性測定部2を介して、ユーザによって指定されたソースファイルSF中に定義されているモジュールの存在を確認し、モジュールが存在している場合は、各モジュールについて、ステップS3からステップS8までの処理が終了したか否かを確認する。ソースファイルSF中に定義されている全てのモジュールについてステップS3からステップS8までの処理が終了した場合は、ステップS9で処理を終了する。すなわち、ステップS3からステップS8までの処理は、制御部1が、特性測定部2、特性判定部3及び表示制御部4を制御することで、指定されたソースファイルSF中に定義されている一つ一つのモジュールに対し夫々実行される。
【0028】
(3)ステップS3…特性測定部2は、指定されたソースファイルSFに定義されている1つのモジュールに対してそのモジュールの特性データCDのブロック情報21を抽出生成する。生成された特性データCDのブロック情報21は、特性データ記憶部20に記憶される。なお、ブロック情報21の生成方法としては、ブロックの情報が正確に抽出できる方法である限りどのような方法を用いてもよい。図5のソースファイルで定義されているモジュール:functionに対する特性データCDのブロック情報21は図6に示す通りとなる。
【0029】
すなわち、図5のソースファイルは、1つのモジュール:functionを有し、このモジュール:function内には、図6に示すように、各種ブロックタイプおよびネスト数を持つ7つのブロックが含まれている。なお、便宜上、図5のソースファイルの例ではモジュールをfunction一つとしているが、ソースファイルSFで定義されるモジュールは勿論複数存在していて良い。
【0030】
(4)ステップS4…特性測定部2は、モジュール内で使用されている変数自体の情報と変数の使用状況(変数定義、値設定及び値参照)を抽出し、該抽出した変数の情報とステップS3で生成されたブロック情報21とを用いて特性データCDの変数情報22を生成する。生成された特性データCDの変数情報22は、特性データ記憶部20に記憶される。図5のソースファイルの例で定義されているモジュール:functionに対する特性データCDの変数情報22は図7に示す通りとなる。
【0031】
すなわち、図7に示すように、モジュール内に存在する各ブロック毎に、各ブロックに含まれる変数が抽出され、抽出された変数毎に、型情報、設定フラグの有無、参照フラグの有無が付加されることによって変数情報22が生成される。
【0032】
(5)ステップS5…制御部1は、特性判定部3と表示制御部4を介して、ステップS4で抽出した各変数に対して、ステップS6からステップS8までの処理が終了したか否かを確認する。全ての変数について、ステップS6からステップS8までの処理が終了していない場合は、手順をステップS6に移行させ、これ以降1つの変数毎に、ステップS6からステップS8までの処理を実行させる。また、ステップS5において、全ての変数について、ステップS6からステップS8までの処理が終了していると判断された場合は、手順をステップS2に復帰させる。ステップS2においては、ソースファイルの中に次のモジュールが存在すると判断された場合は、再度ステップS3からステップS8までの処理を繰り返す。ステップS2において、ソースファイルの中に次のモジュールが存在しないと判断された場合は、前述したように、全てのモジュールについての処理が終了したとして、今回指定されたソースファイルについての処理を終了する。
【0033】
(6)ステップS6…特性判定部3は、変数情報22を参照して、注目している1つの変数に関して、その変数を値設定及び値参照しており(設定フラグおよび参照フラグがオン(○)である)かつネストしていない即ちネスト数が同じである二つ以上の異なるブロックの組を抽出し、抽出した組データをモジュール分割指針データEDとして記録し、このモジュール分割指針データEDをモジュール分割指針データ記憶部30に記憶する。
【0034】
(7)ステップS7,S8…制御部1は、モジュール分割指針データEDに記録されたブロックの組が存在するかどうかを判定し、もし、ブロックの組が存在しない場合は次の変数に対する処理を行うため、手順をステップS5に復帰させる。一方、制御部1は、モジュール分割指針データEDに記録されたブロックの組が存在すると判断した場合は、表示制御部4に表示指令を与える。表示指令を与えられた表示制御部4は、入出力装置9を経由してモジュール分割指針データEDに記録されたブロックの組の情報を適宜の形態で表示するなどして、モジュール分割指針データEDに記録されたブロックの組の情報をモジュール分割の指針としてユーザに提示する。
【0035】
図8は、図5のソースファイルの例で定義されているモジュール:functionに対するモジュール分割指針データEDを示すものである。図8に示すように、図5のソースファイルの場合は、変数iに対してはブロックIDが「2」と「5」のブロックが1つの組となり、変数jに対してはブロックIDが「2」と「5」の各ブロックが1つの組となり、さらに変数jに対してはブロックIDが「3」と「6」の各ブロックが1つの組となる。すなわち、変数iに関してはブロックIDが「2」と「5」の1組がブロックがモジュール分割の指針としてユーザに提示され、変数jに関してはブロックIDが「2」と「5」および「3」と「6」の2組のブロックがモジュール分割の対象ブロックを示す指針情報としてユーザに提示される。この指針を見ることにより、ユーザは、指定したソースファイルをどのように分割するべきかを知ることができるので、提示された指針情報が妥当な場合、その後指針に従ってモジュール分割した修正ソースファイルを作成するようにすればよい。
【0036】
このように実施の形態1においては、ソースファイルからブロック情報さらには変数情報を各モジュール毎に作成し、作成した変数情報を用いてモジュール分割の対象ブロックを具体的に示すモジュール分割指針データを求め、このモジュール分割指針データによって各ブロックの関連性の程度をユーザに提示するようにしているので、モジュールの分割の対象ブロックがユーザに明確に示されることになり、これを用いてモジュール構造化処理を行うようにすれば、モジュール構造化が促進され、独立性、保守性及び再利用性の高いモジュールから構成されるソフトウェアを実現することができる。
【0037】
実施の形態2.
つぎに、この発明の実施の形態2について説明する。図9はこの発明の実施の形態2であるモジュール構造化支援装置の構成を示すブロック図である。この実施の形態2においては、先の実施の形態1で用いた変数情報の変わりに、図10にそのデータ構造を示す複雑度情報を用い、この複雑度情報に基づき形成したモジュール分割指針データを元にモジュール分割の指針をユーザに提示するようにしている。
【0038】
複雑度情報とは、ソフトウェアの複雑度を示す情報であり、複雑度としては、例えばマッケーブの循環的複雑度(McCabe’s cyclomatic complexity)等、ソフトウェアの複雑度を客観的に示す値であるならば任意の値を採用すればよい。また、複雑度を示す値は一つの値ではなく、複数の値の組からなるものを使用するようにしてもよい。
【0039】
図9に示す実施の形態2のモジュール構造化支援装置は、ソースファイル記憶部10、特性データ記憶部20、モジュール分割指針データ記憶部40、入出力装置9、特性測定部2、特性判定部3、表示制御部4および制御部1を備えている。
【0040】
ソースファイル記憶部10には、モジュール分割を行う対象となるソースファイルSFが記憶される。特性測定部2は、ソースファイル記憶部10からのソースファイルSFを入力として、ソースファイルSF内に含まれるモジュール毎に各モジュール中に含まれるブロック毎の特性を測定し、測定した特性データCD´を特性データ記憶部20に出力する。先の実施の形態1においては、特性データCDには、ブロック情報21と、変数情報22とが含まれていたが、実施の形態2においては、特性データCD´には、ブロック情報21と、図10にそのデータ構造を示す複雑度情報23とが含まれる。特性データ記憶部20には、特性測定部2によって測定された特性データCD´(ブロック情報21+複雑度情報23)が、各モジュール毎に記憶される。
【0041】
特性判定部3は、特性データ記憶部20に記憶される特性データCD´(ブロック情報21+複雑度情報23)を入力として、その特性データCDを調べることによりモジュール分割の指針を出力可能な否かを判断し、モジュール分割の指針を出力可能な場合は、モジュール分割の指針をユーザに示す情報の元となるモジュール分割指針データFDを形成し、形成したモジュール分割指針データFDをモジュール分割指針データ記憶部40に出力する。モジュール分割指針データ記憶部40は、特性判定部3によって形成されたモジュール分割指針データFDを記憶する。
【0042】
表示制御部4は、ソースファイルSF、特性データCDおよびモジュール分割指針データEDを入力として、これらを制御部1を介して入出力装置(表示部)に表示するとともに、特性判定部3がモジュール分割すべきである判断したモジュールに関するモジュール分割指針データ記憶部30内のモジュール分割指針データEDに基づきモジュール分割の指針を入出力装置を介してユーザに提示するなどの制御を実行する。入出力装置9は、システムのユーザからの入力を受け付けてこれを制御部1に入力するとともに、制御部1から入力されるシステムからユ−ザに対する出力を表示する。制御部1は、モジュール構造化支援装置の上記各構成要素を統括的に制御するものである。
【0043】
図10は特性データ記憶部20に記憶される1つのブロックについての複雑度情報23のデータ構造を示すものである。複雑度情報23は、ブロックID231と、このブロックIDの複雑度を示す複雑度値とで構成されている。図11は図9に示したモジュール構造化支援装置の動作の手順を示すフローチャートである。図12は図5に示したソースコードSFから得られる特性データCD´の複雑度情報23の例である。使用した複雑度はサイクロマティック複雑度である。
【0044】
以下、これら図10〜図12などを用いて図9に示した実施の形態2のモジュール構造化支援装置の動作について説明する。
【0045】
(1)ステップS101…ユーザは入出力装置9を用いてソースファイル記憶部10に記憶されているソースファイルのうちからモジュール分割対象のソースファイルSFを指定するとともに、モジュール分割の基準値とする複雑度値を指定する。制御部1は、ユーザによって指定されたソースファイルSFの情報を特性測定部2に通知するとともに、モジュール分割の基準値とする複雑度値を特性判定部3に通知する。
【0046】
(2)ステップS102…制御部1は、特性測定部2を介して、ユーザによって指定されたソースファイルSF中に定義されているモジュールの存在を確認し、モジュールが存在している場合は、各モジュールについて、ステップS103からステップS107までの処理が終了したか否かを確認する。ソースファイルSF中に定義されている全てのモジュールについてステップS103からステップS107までの処理が終了した場合は、ステップS108で処理を終了する。すなわち、ステップS103からステップS107までの処理は、制御部1が、特性測定部2、特性判定部3及び表示制御部4を制御することで、指定されたソースファイルSF中に定義されている一つ一つのモジュールに対し夫々実行される。
【0047】
(3)ステップS103…特性測定部2は、先の実施の形態1と同様にして、指定されたソースファイルSFに定義されている1モジュールに対してそのモジュールの特性データCD´のブロック情報21を抽出生成する。生成された特性データCD´のブロック情報21は、特性データ記憶部20に記憶される。図5のソースファイルで定義されているモジュール:functionに対する特性データCD´のブロック情報21は先の図6に示す通りとなる。
【0048】
(4)ステップS104…特性測定部2は、ステップS103で抽出したブロック毎にその複雑度を測定し、ステップS103で生成されたブロック情報21とブロック毎に測定した複雑度から複雑度情報23を生成する。生成された特性データCD´の複雑度情報23は、特性データ記憶部20に記憶される。図5のソースファイルの例で定義されているモジュール:functionに対する特性データCD´の複雑度情報23は図12に示す通りとなる。
【0049】
すなわち、図12に示すように、ある1つのモジュールについての複雑度情報23は、モジュール内に存在する複数のブロックについて、ブロックIDと複雑度を示す複雑度値との対応関係を示すものとなる。
【0050】
(5)ステップS105…制御部1は、特性判定部3と表示制御部4を介して、ステップS4で抽出した各ブロックに対して、ステップS106からステップS107までの処理が終了したか否かを確認する。全てのブロックについて、ステップS106からステップS107までの処理が終了していない場合は、手順をステップS106に移行させ、これ以降1つのブロック毎に、ステップS106からステップS107までの処理を実行させる。また、ステップS105において、全ての変数について、ステップS106からステップS107までの処理が終了していると判断された場合は、手順をステップS102に復帰させる。ステップS102においては、ソースファイルの中に次のモジュールが存在すると判断された場合は、再度ステップS103からステップS107までの処理を繰り返す。ステップS102において、ソースファイルの中に次のモジュールが存在しないと判断された場合は、前述したように、全てのモジュールについての処理が終了したとして、今回指定されたソースファイルについての処理を終了する(ステップS108)。
【0051】
(6)ステップS106…特性判定部3は、ブロック情報21および複雑度情報23から成る特性データCD´を参照して、現在注目しているブロックのブロックタイプが「モジュール定義」でなく、かつ、そのブロックの複雑度がステップS101で指定された基準複雑度値を越えているブロックの場合は、この現在注目しているブロックを抽出し、抽出したブロックを例えばその複雑度とともにモジュール分割指針データEDとして記録し、このモジュール分割指針データEDをモジュール分割指針データ記憶部30に記憶する。ステップS106の条件が成立しない場合は、手順をステップS105に移行させて、次のブロックについてのステップS106の条件判定を実行させる。
【0052】
(7)ステップS107…制御部1は、モジュール分割指針データEDに記録されたブロックが存在する場合、すなわちステップS106の判断がYesの場合は、表示制御部4に表示指令を与える。表示指令を与えられた表示制御部4は、入出力装置9を経由してモジュール分割指針データEDに記録されたブロックの情報を適宜の形態で表示するなどして、モジュール分割指針データEDに記録されたブロックの情報をモジュール分割の指針としてユーザに提示する。図12の例では、基準複雑度を「2」に設定した場合には、ブロックIDが「2」と「5」の2つのブロックがモジュール分割指針データEDとしてモジュール分割指針データ記憶部30に記憶されるとともに、これら2つのブロックがモジュール分割の対象ブロックを示す指針情報としてユーザに提示されることになる。この指針を見ることにより、ユーザは、指定したソースファイルをどのように分割するべきかを知ることができるので、提示された指針情報が妥当な場合、その後指針に従ってモジュール分割した修正ソースファイルを作成するようにすればよい。
【0053】
このように実施の形態2においては、ソースファイルから各ブロック毎のブロック情報、複雑度情報を各モジュール毎に作成し、作成したブロック情報、複雑度情報を用いてモジュール分割の対象ブロックを具体的に示すモジュール分割指針データを求め、このモジュール分割指針データによって各ブロックの複雑度の分布をユーザに提示するようにしているので、モジュールの分割の対象ブロックがユーザに明確に示されることになり、これを用いてモジュール構造化処理を行うようにすれば、モジュール構造化が促進され、より独立性、保守性及び再利用性の高いモジュールを備えるソフトウェアを実現することができる。
【0054】
なお、上記実施の形態2においては、複雑度情報23として、マッケーブの循環的複雑度を用いるようにしたが、他の複雑度の指標を用いるようにしてもよい。例えば、モジュールを構成する複数のブロックで定義されている式の複雑度を測定することが可能なHalsteadの複雑度などを用いるようにしてもよい。Halsteadの複雑度を採用した場合は、比較用に指定する基準複雑度値もこれに対応した値を採用する必要がある。
【0055】
実施の形態3.
つぎに、実施の形態3について説明する。実施の形態3においては、実施の形態2で使用した複雑度情報23の代わりにブロックのサイズを示すブロックサイズ情報を使用する。各ブロックのサイズを示すブロックサイズ情報としては、ステップ数等を採用する。
【0056】
この実施の形態3においては、特性測定部2は、指定されたソースファイルからブロック情報とブロックサイズ情報を形成する。特性判定部は、ブロックサイズ情報に基づいて各ブロックのサイズが、指定した基準値サイズを越えたブロックを抽出し、該抽出したブロックに対応するブロックIDが記録されたモジュール分割指針データを先の実施の形態2と同様にして形成する。そして、指定した基準値サイズを越えたブロックのブロックIDを実施の形態2と同様にしてユーザに提示する。
【0057】
この実施の形態3においては、ソースファイルから各ブロック毎のブロック情報、ブロックサイズ情報を各モジュール毎に作成し、作成したブロック情報、ブロックサイズ情報を用いてモジュール分割の対象ブロックを具体的に示すモジュール分割指針データを求め、このモジュール分割指針データによって各ブロックのブロックサイズの分布をユーザに提示するようにしているので、モジュールの分割の対象ブロックがユーザに明確に示されることになり、これを用いてモジュール構造化処理を行うようにすれば、モジュール構造化が促進され、より独立性、保守性及び再利用性の高いモジュールを備えるソフトウェアを実現することができる。
【0058】
実施の形態4.
つぎに、実施の形態4について説明する。実施の形態4においては、実施の形態2で使用した複雑度情報23の代わりにネストの深さを示すネスト深さ情報(ネスト数情報)を使用する。ネスト数情報は、各ブロックIDと、各ブロックがもつネスト数との対応関係を示す情報である。
【0059】
実施の形態4においては、特性測定部2は、指定されたソースファイルからブロック情報とネスト数情報を形成する。特性判定部は、ネスト数情報に基づいて各ブロックのネスト数が、指定した基準値を越えたブロックを抽出し、該抽出したブロックに対応するブロックIDが記録されたモジュール分割指針データを先の実施の形態2と同様にして形成する。そして、指定した基準値を越えたネスト数を持つブロックのブロックIDを実施の形態2と同様にしてユーザに提示する。
【0060】
この実施の形態4においては、ソースファイルから各ブロック毎のブロック情報、ネスト数情報を各モジュール毎に作成し、作成したブロック情報、ネスト数情報を用いてモジュール分割の対象ブロックを具体的に示すモジュール分割指針データを求め、このモジュール分割指針データによって各ブロックのネスト深さの分布をユーザに提示するようにしているので、モジュールの分割の対象ブロックがユーザに明確に示されることになり、これを用いてモジュール構造化処理を行うようにすれば、モジュール構造化が促進され、より独立性、保守性及び再利用性の高いモジュールを備えるソフトウェアを実現することができる。
【0061】
実施の形態5.
つぎに、実施の形態5について説明する。先の実施の形態1においては、モジュール内のブロックを単位としてモジュール内でモジュール分割すべき部分をユーザに指針として示すようにした。実施の形態5においては、モジュールを一つのブロックと見なし、処理に用いる変数を外部変数のみとする。そして、先の実施の形態1と同様に、各モジュールでの外部変数の使用状況(変数への値設定及び変数の値参照)を抽出し、同じ外部変数または同じ外部変数の組を使用しているモジュールの組を抽出し、抽出したモジュールの組をモジュール構造化指針データとしてユーザに提示するようにする。この実施の形態5の処理としては、扱う変数が外部変数となること、ブロック=モジュールに置き換える以外は、先の実施の形態1と同様である。
【0062】
この実施の形態5によれば、モジュールを一つのブロックと見なしているので、情報の隠蔽度が強化され、モジュールのモジュール性を向上させることができる。また、外部変数の使用状況から見てモジュールを構造化することが可能となり、外部変数の使用を局所化でき、情報の隠蔽度を向上させることが可能となる。
【0063】
なお、上記各実施の形態において、ブロックの概念を制御構造としてのブロックだけでなく、モジュール中の空白行又はコメントからのみ構成される行で区切られた領域もブロックと見なして処理を行うようにしてもよい。すなわち、この場合は、モジュール中の空白行又はコメントからのみ構成される行で区切られた領域も制御構造としてのブロックと同等に扱う。
【0064】
また、表示制御部4は、ユーザに提示するモジュール分割の指針として、ブロックIDに対応するモジュールのブロックのみを表示するようにしてもよいが、各モジュールを表示し、その中のどの部分をモジュール分割すべきかを強調表示するようにしてもよい。図13に示すように、分割すべき部分を持つモジュールを表示し、さらに分割すべきブロックを例えば太字及び斜字体で表示するようにする。この場合は、ステップ番号「14」〜「16」のブロックと、ステップ番号「19」〜「21」のブロックを太字及び斜字体で表示するようにしており、これらのブロックがモジュール分割対象ブロックとなる。なお、強調表示の手法は、色を変えるなど他の任意の手法を用いるようにしてもよい。
【0065】
【発明の効果】
以上説明したように、この発明によれば、モジュール内のブロックの特性データを測定し、測定した特性データに基づきモジュール分割の指針をユーザに提示するためのモジュール分割指針データを形成し、形成したモジュール分割指針データに基づいてモジュール分割の指針をユーザに提示するようにしたので、モジュールの分割の対象ブロックがユーザに明確に示されることになり、これを用いてユーザがモジュール構造化処理を行うようにすれば、モジュールの構造化が促進され、これによりモジュールの品質、メンテンナンス性および再利用性を向上させることができる。
【図面の簡単な説明】
【図1】本発明の実施の形態1のモジュール構造化支援装置の構成を示すブロック図である。
【図2】図1の特性測定部が生成する特性データのデータ構造を示す図である。
【図3】図1の特性判定部が生成するモジュール分割指針データのデータ構造を示す図である。
【図4】実施の形態1のモジュール構造化支援装置の動作手順を示すフローチャートである。
【図5】モジュール分割の対象となるソースコードの例を示す図である。
【図6】図5のソースコードから得られるブロック情報の例を示す図である。
【図7】図5のソースコードから得られる変数情報の例を示す図である。
【図8】図5のソースコードから得られるモジュール分割指針データの例を示す図である。
【図9】本発明の実施の形態2のモジュール構造化支援装置の構成を示すブロック図である。
【図10】図9の特性測定部が生成する複雑度情報のデータ構造を示す図である。
【図11】実施の形態2のモジュール構造化支援装置の動作手順を示すフローチャートである。
【図12】実施の形態2において、図5のソースコードから得られる複雑度情報の例を示す図である。
【図13】モジュール分割対象の強調表示の一例を示す図である。
【符号の説明】
1 制御部、2 特性測定部、3 特性判定部、4 表示制御部、9 入出力装置、10 ソースファイル記憶部、20 特性データ記憶部、21 ブロック情報、22 変数情報、23 複雑度情報、30,40 モジュール分割指針データ記憶部、CD 特性データ、ED,FD モジュール分割指針データ、SFソースファイル(ソースコード)。
【発明の属する技術分野】
この発明は、ソフトウェアを構成するモジュール(部分ソフトウェア)の構造化を行う指針として、モジュールを構成するブロックの特性またはブロックとして扱ったモジュールの特性を利用して独立性、保守性及び再利用性の高いモジュールを作成する指針をユーザに示すことが可能なモジュール構造化支援装置に関するものである。
【0002】
【従来の技術】
様々なシステムや製品におけるソフトウェアが占める割合は年々大きくなっており、開発すべきソフトウェア量自体も増大し続けている。しかし、これに反して開発の期間はシステムや製品を早急に市場に投入する必要性からますます短縮することが求められてきている。
【0003】
このような事態に対応する一つの方法として、ソフトウェアを構成するモジュールの構造化を行い、各モジュールの機能の単純化を図ってモジュールの開発効率を高めるとともに、モジュールの品質、独立性、理解性、可搬性、保守性や再利用性を向上させること、すなわちモジュール性の向上が行われている。このような構造でソフトウェアを構成することで、ソフトウェア自体の新規の開発効率を向上させるだけでなく、ソフトウェアに何らかの不具合が発生した場合の修正やそのソフトウェアの流用を行いやすくし、過去のソフトウェア資産の有効利用によるソフトウェア開発効率を向上させることが行われている。
【0004】
しかしながら、実際にはソフトウェア開発期間の短さからモジュールの分割を検討する十分な時間がない、構造化されたモジュールの開発に慣れていないソフトウェア開発経験の浅いプログラマも開発に参加せざるを得ないということが多い。また、十分なモジュール性を持つモジュールを作成してもこれを修正しながら流用したことによってモジュール性が悪化してしまう場合も多い。
【0005】
このような事態を打開するための手段として、モジュールを理解しやすくし、品質、保守性、再利用性の高いモジュールを得るための一つの指針としてモジュールの複雑度を測定し、複雑度の高いモジュールをユーザに報告する静的解析システムが存在している(例えば、非特許文献1、非特許文献2、非特許文献3)。
【0006】
また、特許文献1には、変数の使用状況を示すメトリクス値を測定することでソフトウェアの構造化についての助言を行うシステムが開示されている。
【0007】
【非特許文献1】
東陽テクニカ、Cディープフロー静的解析ツールQA C(登録商標)、[online]、[平成15年3月3日検索]、インターネット<URL:http://www.toyo.co.jp/ss/qac/index.html>
【非特許文献2】
富士通ミドルウェア株式会社、組み込み開発支援システムEYDSシリーズ、[online]、[平成15年3月3日検索]、インターネット<URL:http://software.fujitsu.com/jp/product/indust/eyds/>
【非特許文献3】
エー・アイ・コーポレーションア、McCabe IQソフトウェア品質向上支援ツール、[online]、[平成15年3月3日検索]、インターネット<URL:http://www.aicp.co.jp/product/mccabe.html>
【特許文献1】
特開平6−119205号公報
【0008】
【発明が解決しようとする課題】
しかしながら、しかし、上記のようなこれまでのシステムには次のような問題点があった。
【0009】
(1)上記非特許文献1〜3に示されている静的解析システムは、複雑度の高いモジュールを検出し、モジュールを分割すべきであるという報告は行うようにしているが、分割の方法については何の指標も示さないため、具体的にどのようにモジュールを分割し、複雑度を下げるかについてはシステムのユーザが考えなければならない。
【0010】
(2)特許文献1に示されたモジュール分解支援システムでは、変数の使用状況を元にソフトウェアの構造化のための判断、助言を行っているため、システムのユーザはどの変数に注目してモジュールの分割を行うべきかという点については助言を有効に使用することができるが、具体的にどのようにモジュールを分割するかについてはシステムのユーザが考えなければならない。また、特許文献1に示されたモジュール分解支援システムは、変数の使用状況をモジュールの分割の指針として使用しているのみで、逆にモジュール群で使用されている外部変数を局所化して情報を隠蔽するため、すなわち、複数のモジュールをグループ化するためには有効に使用されていない。
【0011】
このように従来技術では、モジュールの複雑度を報告するのみであったり、モジュール中の変数の使用状況を示すメトリクス値によってモジュールの分割の指針は示すものの具体的なモジュールの分割の方法についてはユーザが判断する必要があった。また、得られた変数の使用状況の情報がモジュールの分割のためにのみ利用され、複数のモジュールをグループ化するために有効に用いられていなかった。
【0012】
この発明は上記に鑑みてなされたもので、モジュールの構造化を促進し、独立性、保守性及び再利用性の高いモジュールの作成を実現するモジュール構造化支援装置を得ることを目的とする。
【0013】
【課題を解決するための手段】
上記目的を達成するため、この発明にかかるモジュール構造化支援装置は、ソフトウェアを構成するモジュールの構造化を支援するモジュール構造化支援装置において、モジュール内のブロックの特性データを測定する特性測定部と、前記測定した特性データに基づきモジュール分割の指針をユーザに提示するためのモジュール分割指針データを形成し、該形成したモジュール分割指針データに基づいてモジュール分割の指針をユーザに提示する特性判定部とを備えることを特徴とする。
【0014】
この発明によれば、モジュール内のブロックの特性データを測定し、測定した特性データに基づきモジュール分割の指針をユーザに提示するためのモジュール分割指針データを形成し、形成したモジュール分割指針データに基づいてモジュール分割の指針をユーザに提示するようにしたので、モジュールの分割の対象ブロックがユーザに明確に示されることになり、これを用いてユーザがモジュール構造化処理を行うようにすれば、モジュールの構造化が促進され、これによりモジュールの品質、メンテンナンス性および再利用性を向上させることができる。
【0015】
【発明の実施の形態】
以下に添付図面を参照して、この発明にかかるモジュール構造化支援装置の好適な実施の形態を詳細に説明する。
【0016】
実施の形態1.
図1は、この発明の実施の形態1であるモジュール構造化支援装置の構成を示すブロック図である。
【0017】
図1に示すモジュール構造化支援装置は、ソースファイル記憶部10、特性データ記憶部20、モジュール分割指針データ記憶部30、入出力装置9、特性測定部2、特性判定部3、表示制御部4および制御部1を備えている。
【0018】
ソースファイル記憶部10には、モジュール分割(モジュール構造化)を行う対象となるソースファイルSFが記憶される。特性測定部2は、ソースファイル記憶部10からのソースファイルSFを入力として、ソースファイルSF内に含まれるモジュール毎に各モジュール中に含まれるブロック毎の特性を測定し、測定した特性データCDを特性データ記憶部20に出力する。この特性データCDには、モジュール内のブロックを抽出した結果として得られるブロック情報21と、モジュール内の各ブロックに含まれる変数と変数の使用状況を保存するための変数情報22とが含まれる(図6参照)。特性データ記憶部20は、特性測定部2によって測定された特性データCDを各モジュール毎に記憶する。
【0019】
特性判定部3は、特性データ記憶部20に記憶される特性データCDを入力とし、その特性データCDを調べることによりモジュール分割の指針を出力可能な否かを判断し、モジュール分割の指針を出力可能な場合は、モジュール分割の指針をユーザに示す情報の元となるモジュール分割指針データEDを形成し、形成したモジュール分割指針データEDをモジュール分割指針データ記憶部30に出力する。モジュール分割指針データ記憶部30は、特性判定部3によって形成されたモジュール分割指針データEDを記憶する。表示制御部4は、ソースファイルSF、特性データCDおよびモジュール分割指針データEDを入力として、これらを制御部1を介して入出力装置(表示部)に表示するとともに、特性判定部3がモジュール分割すべきである判断したモジュールに関するモジュール分割指針データ記憶部30内のモジュール分割指針データEDに基づきモジュール分割の指針を入出力装置を介してユーザに提示するなどの制御を実行する。入出力装置9は、システムのユーザからの入力を受け付けてこれを制御部1に入力するとともに、制御部1から入力されるシステムからユ−ザに対する出力を表示する。制御部1は、モジュール構造化支援装置の上記各構成要素を統括的に制御するものである。
【0020】
図2は特性データ記憶部20に記憶される特性データCDのデータ構造を示すものである。特性データCDは、モジュール内のブロックを抽出した結果として得られるブロック情報21と、モジュール内の各ブロックに含まれる変数と変数の使用状況を保存するための変数情報22とを有している。
【0021】
図2に示すブロック情報は、1つのブロックについてのブロック情報21のデータ構造を示すもので、ブロック情報21は、各ブロックを一意に識別するためのブロックID(ブロック識別情報)211と、ブロックのネストの深さを示すネスト数212と、ブロックの種類(モジュール定義、for文などの制御構造を有するブロック、単純ブロック(制御構造を持たず、ブロック中の実行文をブロック開始から終了まで順次に実行する)等)を示すブロックタイプ213と、ブロックの開始行を示すブロック開始行214と、ブロックの開始桁を示すブロック開始桁215と、ブロックの終了行を示すブロック終了行216と、ブロックの終了桁を示すブロック終了桁217とを有して構成されている。
【0022】
変数情報22は、当該変数が含まれるブロックを示すブロックID221と、変数を一意に識別するための変数ID222と、変数名223と、変数の型を示す型情報(ブロック内で変数の実体宣言が行われている場合にのみ使用する)224と、ブロック内で変数に値が設定されたことを示す設定フラグ225と、ブロック内で変数の値が参照されたことを示す参照フラグ226とを有して構成されている。
【0023】
図3は、モジュール分割指針データ記憶部30に記憶される1つのモジュール分割指針データEDのデータ構造を示すものである。このモジュール分割指針データEDは、同じ変数を使用しているネストしていないブロックの組を一意に識別するための組ID301と、使用されている変数を示す変数IDと、その組に含まれるブロックを示すブロックIDとを有して構成されている。
【0024】
図4は図1に示した実施の形態1のモジュール構造化支援装置の動作の手順を示すフローチャートである。図5はソースコード(ソースファイル)SFの一例を示すものであり、図6は図5のソースファイルSFから得られる特性データCDのブロック情報21を示すものであり、図7は図5のソースファイルSFから得られる特性データCDの変数情報22を示すものであり、図8は図5のソースファイルSFから得られるモジュール分割指針データEDを例示するものである。なお、図7では説明を簡単にするためにモジュールの引数を変数の情報として含めていないが含めるようにしても良い。また、図5のソースコードには、説明を簡単にするために外部変数を加えていないが外部変数が存在する場合は変数情報に外部変数を加えても良い。
【0025】
以下、これら図4〜図8を用いて図1に示したモジュール構造化支援装置の動作について説明する。
【0026】
(1)ステップS1…ユーザは入出力装置9を用いてソースファイル記憶部10に記憶されているソースファイルのうちモジュール分割対象のソースファイルSFを指定する。制御部1は、ユーザによって指定されたソースファイルSFの情報を特性測定部2に通知する。
【0027】
(2)ステップS2…制御部1は、特性測定部2を介して、ユーザによって指定されたソースファイルSF中に定義されているモジュールの存在を確認し、モジュールが存在している場合は、各モジュールについて、ステップS3からステップS8までの処理が終了したか否かを確認する。ソースファイルSF中に定義されている全てのモジュールについてステップS3からステップS8までの処理が終了した場合は、ステップS9で処理を終了する。すなわち、ステップS3からステップS8までの処理は、制御部1が、特性測定部2、特性判定部3及び表示制御部4を制御することで、指定されたソースファイルSF中に定義されている一つ一つのモジュールに対し夫々実行される。
【0028】
(3)ステップS3…特性測定部2は、指定されたソースファイルSFに定義されている1つのモジュールに対してそのモジュールの特性データCDのブロック情報21を抽出生成する。生成された特性データCDのブロック情報21は、特性データ記憶部20に記憶される。なお、ブロック情報21の生成方法としては、ブロックの情報が正確に抽出できる方法である限りどのような方法を用いてもよい。図5のソースファイルで定義されているモジュール:functionに対する特性データCDのブロック情報21は図6に示す通りとなる。
【0029】
すなわち、図5のソースファイルは、1つのモジュール:functionを有し、このモジュール:function内には、図6に示すように、各種ブロックタイプおよびネスト数を持つ7つのブロックが含まれている。なお、便宜上、図5のソースファイルの例ではモジュールをfunction一つとしているが、ソースファイルSFで定義されるモジュールは勿論複数存在していて良い。
【0030】
(4)ステップS4…特性測定部2は、モジュール内で使用されている変数自体の情報と変数の使用状況(変数定義、値設定及び値参照)を抽出し、該抽出した変数の情報とステップS3で生成されたブロック情報21とを用いて特性データCDの変数情報22を生成する。生成された特性データCDの変数情報22は、特性データ記憶部20に記憶される。図5のソースファイルの例で定義されているモジュール:functionに対する特性データCDの変数情報22は図7に示す通りとなる。
【0031】
すなわち、図7に示すように、モジュール内に存在する各ブロック毎に、各ブロックに含まれる変数が抽出され、抽出された変数毎に、型情報、設定フラグの有無、参照フラグの有無が付加されることによって変数情報22が生成される。
【0032】
(5)ステップS5…制御部1は、特性判定部3と表示制御部4を介して、ステップS4で抽出した各変数に対して、ステップS6からステップS8までの処理が終了したか否かを確認する。全ての変数について、ステップS6からステップS8までの処理が終了していない場合は、手順をステップS6に移行させ、これ以降1つの変数毎に、ステップS6からステップS8までの処理を実行させる。また、ステップS5において、全ての変数について、ステップS6からステップS8までの処理が終了していると判断された場合は、手順をステップS2に復帰させる。ステップS2においては、ソースファイルの中に次のモジュールが存在すると判断された場合は、再度ステップS3からステップS8までの処理を繰り返す。ステップS2において、ソースファイルの中に次のモジュールが存在しないと判断された場合は、前述したように、全てのモジュールについての処理が終了したとして、今回指定されたソースファイルについての処理を終了する。
【0033】
(6)ステップS6…特性判定部3は、変数情報22を参照して、注目している1つの変数に関して、その変数を値設定及び値参照しており(設定フラグおよび参照フラグがオン(○)である)かつネストしていない即ちネスト数が同じである二つ以上の異なるブロックの組を抽出し、抽出した組データをモジュール分割指針データEDとして記録し、このモジュール分割指針データEDをモジュール分割指針データ記憶部30に記憶する。
【0034】
(7)ステップS7,S8…制御部1は、モジュール分割指針データEDに記録されたブロックの組が存在するかどうかを判定し、もし、ブロックの組が存在しない場合は次の変数に対する処理を行うため、手順をステップS5に復帰させる。一方、制御部1は、モジュール分割指針データEDに記録されたブロックの組が存在すると判断した場合は、表示制御部4に表示指令を与える。表示指令を与えられた表示制御部4は、入出力装置9を経由してモジュール分割指針データEDに記録されたブロックの組の情報を適宜の形態で表示するなどして、モジュール分割指針データEDに記録されたブロックの組の情報をモジュール分割の指針としてユーザに提示する。
【0035】
図8は、図5のソースファイルの例で定義されているモジュール:functionに対するモジュール分割指針データEDを示すものである。図8に示すように、図5のソースファイルの場合は、変数iに対してはブロックIDが「2」と「5」のブロックが1つの組となり、変数jに対してはブロックIDが「2」と「5」の各ブロックが1つの組となり、さらに変数jに対してはブロックIDが「3」と「6」の各ブロックが1つの組となる。すなわち、変数iに関してはブロックIDが「2」と「5」の1組がブロックがモジュール分割の指針としてユーザに提示され、変数jに関してはブロックIDが「2」と「5」および「3」と「6」の2組のブロックがモジュール分割の対象ブロックを示す指針情報としてユーザに提示される。この指針を見ることにより、ユーザは、指定したソースファイルをどのように分割するべきかを知ることができるので、提示された指針情報が妥当な場合、その後指針に従ってモジュール分割した修正ソースファイルを作成するようにすればよい。
【0036】
このように実施の形態1においては、ソースファイルからブロック情報さらには変数情報を各モジュール毎に作成し、作成した変数情報を用いてモジュール分割の対象ブロックを具体的に示すモジュール分割指針データを求め、このモジュール分割指針データによって各ブロックの関連性の程度をユーザに提示するようにしているので、モジュールの分割の対象ブロックがユーザに明確に示されることになり、これを用いてモジュール構造化処理を行うようにすれば、モジュール構造化が促進され、独立性、保守性及び再利用性の高いモジュールから構成されるソフトウェアを実現することができる。
【0037】
実施の形態2.
つぎに、この発明の実施の形態2について説明する。図9はこの発明の実施の形態2であるモジュール構造化支援装置の構成を示すブロック図である。この実施の形態2においては、先の実施の形態1で用いた変数情報の変わりに、図10にそのデータ構造を示す複雑度情報を用い、この複雑度情報に基づき形成したモジュール分割指針データを元にモジュール分割の指針をユーザに提示するようにしている。
【0038】
複雑度情報とは、ソフトウェアの複雑度を示す情報であり、複雑度としては、例えばマッケーブの循環的複雑度(McCabe’s cyclomatic complexity)等、ソフトウェアの複雑度を客観的に示す値であるならば任意の値を採用すればよい。また、複雑度を示す値は一つの値ではなく、複数の値の組からなるものを使用するようにしてもよい。
【0039】
図9に示す実施の形態2のモジュール構造化支援装置は、ソースファイル記憶部10、特性データ記憶部20、モジュール分割指針データ記憶部40、入出力装置9、特性測定部2、特性判定部3、表示制御部4および制御部1を備えている。
【0040】
ソースファイル記憶部10には、モジュール分割を行う対象となるソースファイルSFが記憶される。特性測定部2は、ソースファイル記憶部10からのソースファイルSFを入力として、ソースファイルSF内に含まれるモジュール毎に各モジュール中に含まれるブロック毎の特性を測定し、測定した特性データCD´を特性データ記憶部20に出力する。先の実施の形態1においては、特性データCDには、ブロック情報21と、変数情報22とが含まれていたが、実施の形態2においては、特性データCD´には、ブロック情報21と、図10にそのデータ構造を示す複雑度情報23とが含まれる。特性データ記憶部20には、特性測定部2によって測定された特性データCD´(ブロック情報21+複雑度情報23)が、各モジュール毎に記憶される。
【0041】
特性判定部3は、特性データ記憶部20に記憶される特性データCD´(ブロック情報21+複雑度情報23)を入力として、その特性データCDを調べることによりモジュール分割の指針を出力可能な否かを判断し、モジュール分割の指針を出力可能な場合は、モジュール分割の指針をユーザに示す情報の元となるモジュール分割指針データFDを形成し、形成したモジュール分割指針データFDをモジュール分割指針データ記憶部40に出力する。モジュール分割指針データ記憶部40は、特性判定部3によって形成されたモジュール分割指針データFDを記憶する。
【0042】
表示制御部4は、ソースファイルSF、特性データCDおよびモジュール分割指針データEDを入力として、これらを制御部1を介して入出力装置(表示部)に表示するとともに、特性判定部3がモジュール分割すべきである判断したモジュールに関するモジュール分割指針データ記憶部30内のモジュール分割指針データEDに基づきモジュール分割の指針を入出力装置を介してユーザに提示するなどの制御を実行する。入出力装置9は、システムのユーザからの入力を受け付けてこれを制御部1に入力するとともに、制御部1から入力されるシステムからユ−ザに対する出力を表示する。制御部1は、モジュール構造化支援装置の上記各構成要素を統括的に制御するものである。
【0043】
図10は特性データ記憶部20に記憶される1つのブロックについての複雑度情報23のデータ構造を示すものである。複雑度情報23は、ブロックID231と、このブロックIDの複雑度を示す複雑度値とで構成されている。図11は図9に示したモジュール構造化支援装置の動作の手順を示すフローチャートである。図12は図5に示したソースコードSFから得られる特性データCD´の複雑度情報23の例である。使用した複雑度はサイクロマティック複雑度である。
【0044】
以下、これら図10〜図12などを用いて図9に示した実施の形態2のモジュール構造化支援装置の動作について説明する。
【0045】
(1)ステップS101…ユーザは入出力装置9を用いてソースファイル記憶部10に記憶されているソースファイルのうちからモジュール分割対象のソースファイルSFを指定するとともに、モジュール分割の基準値とする複雑度値を指定する。制御部1は、ユーザによって指定されたソースファイルSFの情報を特性測定部2に通知するとともに、モジュール分割の基準値とする複雑度値を特性判定部3に通知する。
【0046】
(2)ステップS102…制御部1は、特性測定部2を介して、ユーザによって指定されたソースファイルSF中に定義されているモジュールの存在を確認し、モジュールが存在している場合は、各モジュールについて、ステップS103からステップS107までの処理が終了したか否かを確認する。ソースファイルSF中に定義されている全てのモジュールについてステップS103からステップS107までの処理が終了した場合は、ステップS108で処理を終了する。すなわち、ステップS103からステップS107までの処理は、制御部1が、特性測定部2、特性判定部3及び表示制御部4を制御することで、指定されたソースファイルSF中に定義されている一つ一つのモジュールに対し夫々実行される。
【0047】
(3)ステップS103…特性測定部2は、先の実施の形態1と同様にして、指定されたソースファイルSFに定義されている1モジュールに対してそのモジュールの特性データCD´のブロック情報21を抽出生成する。生成された特性データCD´のブロック情報21は、特性データ記憶部20に記憶される。図5のソースファイルで定義されているモジュール:functionに対する特性データCD´のブロック情報21は先の図6に示す通りとなる。
【0048】
(4)ステップS104…特性測定部2は、ステップS103で抽出したブロック毎にその複雑度を測定し、ステップS103で生成されたブロック情報21とブロック毎に測定した複雑度から複雑度情報23を生成する。生成された特性データCD´の複雑度情報23は、特性データ記憶部20に記憶される。図5のソースファイルの例で定義されているモジュール:functionに対する特性データCD´の複雑度情報23は図12に示す通りとなる。
【0049】
すなわち、図12に示すように、ある1つのモジュールについての複雑度情報23は、モジュール内に存在する複数のブロックについて、ブロックIDと複雑度を示す複雑度値との対応関係を示すものとなる。
【0050】
(5)ステップS105…制御部1は、特性判定部3と表示制御部4を介して、ステップS4で抽出した各ブロックに対して、ステップS106からステップS107までの処理が終了したか否かを確認する。全てのブロックについて、ステップS106からステップS107までの処理が終了していない場合は、手順をステップS106に移行させ、これ以降1つのブロック毎に、ステップS106からステップS107までの処理を実行させる。また、ステップS105において、全ての変数について、ステップS106からステップS107までの処理が終了していると判断された場合は、手順をステップS102に復帰させる。ステップS102においては、ソースファイルの中に次のモジュールが存在すると判断された場合は、再度ステップS103からステップS107までの処理を繰り返す。ステップS102において、ソースファイルの中に次のモジュールが存在しないと判断された場合は、前述したように、全てのモジュールについての処理が終了したとして、今回指定されたソースファイルについての処理を終了する(ステップS108)。
【0051】
(6)ステップS106…特性判定部3は、ブロック情報21および複雑度情報23から成る特性データCD´を参照して、現在注目しているブロックのブロックタイプが「モジュール定義」でなく、かつ、そのブロックの複雑度がステップS101で指定された基準複雑度値を越えているブロックの場合は、この現在注目しているブロックを抽出し、抽出したブロックを例えばその複雑度とともにモジュール分割指針データEDとして記録し、このモジュール分割指針データEDをモジュール分割指針データ記憶部30に記憶する。ステップS106の条件が成立しない場合は、手順をステップS105に移行させて、次のブロックについてのステップS106の条件判定を実行させる。
【0052】
(7)ステップS107…制御部1は、モジュール分割指針データEDに記録されたブロックが存在する場合、すなわちステップS106の判断がYesの場合は、表示制御部4に表示指令を与える。表示指令を与えられた表示制御部4は、入出力装置9を経由してモジュール分割指針データEDに記録されたブロックの情報を適宜の形態で表示するなどして、モジュール分割指針データEDに記録されたブロックの情報をモジュール分割の指針としてユーザに提示する。図12の例では、基準複雑度を「2」に設定した場合には、ブロックIDが「2」と「5」の2つのブロックがモジュール分割指針データEDとしてモジュール分割指針データ記憶部30に記憶されるとともに、これら2つのブロックがモジュール分割の対象ブロックを示す指針情報としてユーザに提示されることになる。この指針を見ることにより、ユーザは、指定したソースファイルをどのように分割するべきかを知ることができるので、提示された指針情報が妥当な場合、その後指針に従ってモジュール分割した修正ソースファイルを作成するようにすればよい。
【0053】
このように実施の形態2においては、ソースファイルから各ブロック毎のブロック情報、複雑度情報を各モジュール毎に作成し、作成したブロック情報、複雑度情報を用いてモジュール分割の対象ブロックを具体的に示すモジュール分割指針データを求め、このモジュール分割指針データによって各ブロックの複雑度の分布をユーザに提示するようにしているので、モジュールの分割の対象ブロックがユーザに明確に示されることになり、これを用いてモジュール構造化処理を行うようにすれば、モジュール構造化が促進され、より独立性、保守性及び再利用性の高いモジュールを備えるソフトウェアを実現することができる。
【0054】
なお、上記実施の形態2においては、複雑度情報23として、マッケーブの循環的複雑度を用いるようにしたが、他の複雑度の指標を用いるようにしてもよい。例えば、モジュールを構成する複数のブロックで定義されている式の複雑度を測定することが可能なHalsteadの複雑度などを用いるようにしてもよい。Halsteadの複雑度を採用した場合は、比較用に指定する基準複雑度値もこれに対応した値を採用する必要がある。
【0055】
実施の形態3.
つぎに、実施の形態3について説明する。実施の形態3においては、実施の形態2で使用した複雑度情報23の代わりにブロックのサイズを示すブロックサイズ情報を使用する。各ブロックのサイズを示すブロックサイズ情報としては、ステップ数等を採用する。
【0056】
この実施の形態3においては、特性測定部2は、指定されたソースファイルからブロック情報とブロックサイズ情報を形成する。特性判定部は、ブロックサイズ情報に基づいて各ブロックのサイズが、指定した基準値サイズを越えたブロックを抽出し、該抽出したブロックに対応するブロックIDが記録されたモジュール分割指針データを先の実施の形態2と同様にして形成する。そして、指定した基準値サイズを越えたブロックのブロックIDを実施の形態2と同様にしてユーザに提示する。
【0057】
この実施の形態3においては、ソースファイルから各ブロック毎のブロック情報、ブロックサイズ情報を各モジュール毎に作成し、作成したブロック情報、ブロックサイズ情報を用いてモジュール分割の対象ブロックを具体的に示すモジュール分割指針データを求め、このモジュール分割指針データによって各ブロックのブロックサイズの分布をユーザに提示するようにしているので、モジュールの分割の対象ブロックがユーザに明確に示されることになり、これを用いてモジュール構造化処理を行うようにすれば、モジュール構造化が促進され、より独立性、保守性及び再利用性の高いモジュールを備えるソフトウェアを実現することができる。
【0058】
実施の形態4.
つぎに、実施の形態4について説明する。実施の形態4においては、実施の形態2で使用した複雑度情報23の代わりにネストの深さを示すネスト深さ情報(ネスト数情報)を使用する。ネスト数情報は、各ブロックIDと、各ブロックがもつネスト数との対応関係を示す情報である。
【0059】
実施の形態4においては、特性測定部2は、指定されたソースファイルからブロック情報とネスト数情報を形成する。特性判定部は、ネスト数情報に基づいて各ブロックのネスト数が、指定した基準値を越えたブロックを抽出し、該抽出したブロックに対応するブロックIDが記録されたモジュール分割指針データを先の実施の形態2と同様にして形成する。そして、指定した基準値を越えたネスト数を持つブロックのブロックIDを実施の形態2と同様にしてユーザに提示する。
【0060】
この実施の形態4においては、ソースファイルから各ブロック毎のブロック情報、ネスト数情報を各モジュール毎に作成し、作成したブロック情報、ネスト数情報を用いてモジュール分割の対象ブロックを具体的に示すモジュール分割指針データを求め、このモジュール分割指針データによって各ブロックのネスト深さの分布をユーザに提示するようにしているので、モジュールの分割の対象ブロックがユーザに明確に示されることになり、これを用いてモジュール構造化処理を行うようにすれば、モジュール構造化が促進され、より独立性、保守性及び再利用性の高いモジュールを備えるソフトウェアを実現することができる。
【0061】
実施の形態5.
つぎに、実施の形態5について説明する。先の実施の形態1においては、モジュール内のブロックを単位としてモジュール内でモジュール分割すべき部分をユーザに指針として示すようにした。実施の形態5においては、モジュールを一つのブロックと見なし、処理に用いる変数を外部変数のみとする。そして、先の実施の形態1と同様に、各モジュールでの外部変数の使用状況(変数への値設定及び変数の値参照)を抽出し、同じ外部変数または同じ外部変数の組を使用しているモジュールの組を抽出し、抽出したモジュールの組をモジュール構造化指針データとしてユーザに提示するようにする。この実施の形態5の処理としては、扱う変数が外部変数となること、ブロック=モジュールに置き換える以外は、先の実施の形態1と同様である。
【0062】
この実施の形態5によれば、モジュールを一つのブロックと見なしているので、情報の隠蔽度が強化され、モジュールのモジュール性を向上させることができる。また、外部変数の使用状況から見てモジュールを構造化することが可能となり、外部変数の使用を局所化でき、情報の隠蔽度を向上させることが可能となる。
【0063】
なお、上記各実施の形態において、ブロックの概念を制御構造としてのブロックだけでなく、モジュール中の空白行又はコメントからのみ構成される行で区切られた領域もブロックと見なして処理を行うようにしてもよい。すなわち、この場合は、モジュール中の空白行又はコメントからのみ構成される行で区切られた領域も制御構造としてのブロックと同等に扱う。
【0064】
また、表示制御部4は、ユーザに提示するモジュール分割の指針として、ブロックIDに対応するモジュールのブロックのみを表示するようにしてもよいが、各モジュールを表示し、その中のどの部分をモジュール分割すべきかを強調表示するようにしてもよい。図13に示すように、分割すべき部分を持つモジュールを表示し、さらに分割すべきブロックを例えば太字及び斜字体で表示するようにする。この場合は、ステップ番号「14」〜「16」のブロックと、ステップ番号「19」〜「21」のブロックを太字及び斜字体で表示するようにしており、これらのブロックがモジュール分割対象ブロックとなる。なお、強調表示の手法は、色を変えるなど他の任意の手法を用いるようにしてもよい。
【0065】
【発明の効果】
以上説明したように、この発明によれば、モジュール内のブロックの特性データを測定し、測定した特性データに基づきモジュール分割の指針をユーザに提示するためのモジュール分割指針データを形成し、形成したモジュール分割指針データに基づいてモジュール分割の指針をユーザに提示するようにしたので、モジュールの分割の対象ブロックがユーザに明確に示されることになり、これを用いてユーザがモジュール構造化処理を行うようにすれば、モジュールの構造化が促進され、これによりモジュールの品質、メンテンナンス性および再利用性を向上させることができる。
【図面の簡単な説明】
【図1】本発明の実施の形態1のモジュール構造化支援装置の構成を示すブロック図である。
【図2】図1の特性測定部が生成する特性データのデータ構造を示す図である。
【図3】図1の特性判定部が生成するモジュール分割指針データのデータ構造を示す図である。
【図4】実施の形態1のモジュール構造化支援装置の動作手順を示すフローチャートである。
【図5】モジュール分割の対象となるソースコードの例を示す図である。
【図6】図5のソースコードから得られるブロック情報の例を示す図である。
【図7】図5のソースコードから得られる変数情報の例を示す図である。
【図8】図5のソースコードから得られるモジュール分割指針データの例を示す図である。
【図9】本発明の実施の形態2のモジュール構造化支援装置の構成を示すブロック図である。
【図10】図9の特性測定部が生成する複雑度情報のデータ構造を示す図である。
【図11】実施の形態2のモジュール構造化支援装置の動作手順を示すフローチャートである。
【図12】実施の形態2において、図5のソースコードから得られる複雑度情報の例を示す図である。
【図13】モジュール分割対象の強調表示の一例を示す図である。
【符号の説明】
1 制御部、2 特性測定部、3 特性判定部、4 表示制御部、9 入出力装置、10 ソースファイル記憶部、20 特性データ記憶部、21 ブロック情報、22 変数情報、23 複雑度情報、30,40 モジュール分割指針データ記憶部、CD 特性データ、ED,FD モジュール分割指針データ、SFソースファイル(ソースコード)。
Claims (6)
- ソフトウェアを構成するモジュールの構造化を支援するモジュール構造化支援装置において、
モジュール内のブロックの特性データを測定する特性測定部と、
前記測定した特性データに基づきモジュール分割の指針をユーザに提示するためのモジュール分割指針データを形成し、該形成したモジュール分割指針データに基づいてモジュール分割の指針をユーザに提示する特性判定部と、
を備えることを特徴とするモジュール構造化支援装置。 - 前記特性測定部は、前記特性データとして、各ブロック内で使用されている各変数の使用状況を示す変数情報を測定し、
前記特性判定部は、前記変数情報に基づいて同じ変数を使用しているブロックの組を示すデータをモジュール分割指針データとして形成し、同じ変数を使用している前記ブロックの組をユーザに提示することを特徴とする請求項1に記載のモジュール構造化支援装置。 - 前記特性測定部は、前記特性データとして、各ブロックの複雑度を測定して前記各ブロック毎の複雑度情報を形成し、
前記特性判定部は、前記複雑度情報に基づいて各ブロックの複雑度が所定の設定値を越えたブロックを抽出したデータをモジュール分割指針データとして形成し、このモジュール分割指針データをユーザに提示することを特徴とする請求項1に記載のモジュール構造化支援装置。 - 前記特性測定部は、前記特性データとして、各ブロックのネストの深さを測定して前記各ブロック毎のネスト深さ情報を形成し、
前記特性判定部は、前記ネスト深さ情報に基づいて各ブロックのネスト深さが所定の設定値を越えたブロックを抽出したデータをモジュール分割指針データとして形成し、このモジュール分割指針データをユーザに提示することを特徴とする請求項1に記載のモジュール構造化支援装置。 - 前記特性測定部は、前記特性データとして、各ブロックのサイズを測定して前記各ブロック毎のサイズ情報を形成し、
前記特性判定部は、前記サイズ情報に基づいて各ブロックのサイズが所定の設定値を越えたブロックを抽出したデータをモジュール分割指針データとして形成し、このモジュール分割指針データをユーザに提示することを特徴とする請求項1に記載のモジュール構造化支援装置。 - ソフトウェアを構成するモジュールの構造化を支援するモジュール構造化支援装置において、
モジュールをブロックとして扱ってモジュールの特性を測定し、外部変数のモジュールでの使用状況を抽出し、同じ外部変数または同じ外部変数の組を使用しているモジュールの組をモジュール構造化の指針としてユーザに提示することを特徴とするモジュール構造化支援装置。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2003086239A JP2004295425A (ja) | 2003-03-26 | 2003-03-26 | モジュール構造化支援装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2003086239A JP2004295425A (ja) | 2003-03-26 | 2003-03-26 | モジュール構造化支援装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2004295425A true JP2004295425A (ja) | 2004-10-21 |
Family
ID=33400953
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2003086239A Pending JP2004295425A (ja) | 2003-03-26 | 2003-03-26 | モジュール構造化支援装置 |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP2004295425A (ja) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2007293866A (ja) * | 2006-04-26 | 2007-11-08 | Sap Ag | プログラミングのための関連情報の使用 |
KR100815626B1 (ko) | 2005-07-05 | 2008-03-21 | 인벤텍 코오포레이션 | 컴퓨터 게임 개발 시스템 |
JP2012203777A (ja) * | 2011-03-28 | 2012-10-22 | Hitachi Ltd | ソフトウェア部品作成支援装置および方法 |
US8307326B2 (en) | 2007-07-19 | 2012-11-06 | Fujitsu Limited | Method and apparatus for supporting application enhancement |
WO2016092677A1 (ja) * | 2014-12-11 | 2016-06-16 | 株式会社日立製作所 | モジュール分割支援装置、方法、及びプログラム |
-
2003
- 2003-03-26 JP JP2003086239A patent/JP2004295425A/ja active Pending
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
KR100815626B1 (ko) | 2005-07-05 | 2008-03-21 | 인벤텍 코오포레이션 | 컴퓨터 게임 개발 시스템 |
JP2007293866A (ja) * | 2006-04-26 | 2007-11-08 | Sap Ag | プログラミングのための関連情報の使用 |
US8307326B2 (en) | 2007-07-19 | 2012-11-06 | Fujitsu Limited | Method and apparatus for supporting application enhancement |
JP2012203777A (ja) * | 2011-03-28 | 2012-10-22 | Hitachi Ltd | ソフトウェア部品作成支援装置および方法 |
WO2016092677A1 (ja) * | 2014-12-11 | 2016-06-16 | 株式会社日立製作所 | モジュール分割支援装置、方法、及びプログラム |
JPWO2016092677A1 (ja) * | 2014-12-11 | 2017-04-27 | 株式会社日立製作所 | モジュール分割支援装置、方法、及びプログラム |
US10025558B2 (en) | 2014-12-11 | 2018-07-17 | Hitachi, Ltd. | Module division assistance device, module division assistance method, and module division assistance program |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Li et al. | Fast and accurate long-read alignment with Burrows–Wheeler transform | |
US10353882B2 (en) | Packaging data science operations | |
CN101751333A (zh) | 用于支援程序解析的方法、及其计算机程序以及计算机系统 | |
Shahid et al. | Identification and annotation of small RNA genes using ShortStack | |
US20060004528A1 (en) | Apparatus and method for extracting similar source code | |
JP5588811B2 (ja) | データ分析支援システム及び方法 | |
JP2014199569A (ja) | ソースプログラム解析システム、ソースプログラム解析方法およびプログラム | |
JP6440895B2 (ja) | ソフトウェア分析装置及びソフトウェア分析方法 | |
Wiegreffe et al. | RNApuzzler: efficient outerplanar drawing of RNA-secondary structures | |
CA2781391A1 (en) | Identifying equivalent links on a page | |
CN106843141A (zh) | 数值控制装置 | |
JP2012088953A (ja) | データ伝送方法および制御システム | |
Huson et al. | Autumn algorithm—computation of hybridization networks for realistic phylogenetic trees | |
JP4189246B2 (ja) | データベース検索経路表示方法 | |
JP4826120B2 (ja) | 業務仕様作成支援システム及び方法 | |
CN111984669A (zh) | 一种支持动态变量的函数式sql查询方法、装置、设备和介质 | |
Haraldsson et al. | Exploring fitness and edit distance of mutated python programs | |
JP2004295425A (ja) | モジュール構造化支援装置 | |
JP5440287B2 (ja) | シンボリック実行支援プログラム、方法及び装置 | |
CN110188432B (zh) | 系统架构的验证方法、电子设备及计算机可读存储介质 | |
CN113468400B (zh) | 可视化网页的列表渲染方法、装置、设备及存储介质 | |
JP6437396B2 (ja) | トレース情報管理システム、方法、及びプログラム | |
JP2016051367A (ja) | データ解析装置、データ解析方法、および、プログラム。 | |
CN110309062A (zh) | 用例生成方法、装置、电子设备及存储介质 | |
Shi et al. | Gene Sequence Assembly Algorithm Model Based on the DBG Strategy and Its Application |