以下、図面に基づいて本発明の実施の形態を説明する。図2は、本発明の実施の形態におけるクラス図分割支援装置のハードウェア構成例を示す図である。図2のクラス図分割支援装置10は、それぞれバスBで相互に接続されているドライブ装置100と、補助記憶装置102と、メモリ装置103と、CPU104と、表示装置105と、入力装置106とを有する。
クラス図分割支援装置10での処理を実現するプログラムは、CD−ROM等の記録媒体101によって提供される。プログラムを記録した記録媒体101がドライブ装置100にセットされると、プログラムが記録媒体101からドライブ装置100を介して補助記憶装置102にインストールされる。但し、プログラムのインストールは必ずしも記録媒体101より行う必要はなく、ネットワークを介して他のコンピュータよりダウンロードするようにしてもよい。補助記憶装置102は、インストールされたプログラムを格納すると共に、必要なファイルやデータ等を格納する。
メモリ装置103は、プログラムの起動指示があった場合に、補助記憶装置102からプログラムを読み出して格納する。CPU104は、メモリ装置103に格納されたプログラムに従ってクラス図分割支援装置10に係る機能を実現する。表示装置105はプログラムによるGUI(Graphical User Interface)等を表示する。入力装置106はキーボード及びマウス等であり、様々な操作指示を入力させるために用いられる。
なお、ネットワークを介して遠隔的に操作される場合、クラス図分割支援装置10は、表示装置105及び入力装置106を備えていなくてもよい。
図3は、本発明の実施の形態におけるクラス図分割支援装置の機能構成例を示す図である。同図において、クラス図分割支援装置10は、入力部111、分割点探索部112、分割線作成部113、全体クラスパス作成部114、クラス図分割部115、部分クラス図作成部116、部分基準クラス判定部117、部分クラスパス作成部118、部分クラスモデル量算出部119、部分モデル量総和算出部120、分割パターン選択部121、及びモデル量比較部122等を有する。これら各部は、クラス図分割支援装置10にインストールされたプログラムがCPU104に実行させる処理によって実現されるソフトウェアである。クラス図分割支援装置10は、また、分割ルールデータ151、モデル量計算ルールデータ152、及びモデル量加算ルールデータ153等を有する。これら各データは、例えば、補助記憶装置102に予め保存(記憶)されている。但し、クラス図分割支援装置10とネットワークを介して通信可能な記憶装置内に保存されていてもよい。
図3に示される各部の機能を説明しつつ、クラス図分割支援装置10の処理概要を説明する。図4は、クラス図分割支援装置による処理手順の概要を説明するためのフローチャートである。
ステップS11において、入力部111は、ユーザより入力情報の指定を受け付ける。入力情報には、全体クラス図データ410の識別名及び全体クラス図の分割数が含まれる。入力部111は、全体クラス当該識別名によって識別される全体クラス図データ410をメモリ装置103に読み込む。
本実施の形態では、図5に示される全体クラス図を分割対象として説明する。図5は、本実施の形態において分割対象とする全体クラス図である。本実施の形態においてクラス図の表記はUML(Unified Modeling Language)に従う。
同図において、全体クラス図510は、クラスA、A1、A2、a1、a2、a3、B、及びB1を含む。クラスAは、1対nの多重度でクラスA1を集約し、1対1の多重度でクラスA2を集約する。クラスAは、また、1対nの多重度でクラスBを参照する。クラスA1は、1対1の多重度でクラスa1を集約する。クラスA2は、それぞれ1対nの多重度でクラスa2及びa3を集約する。クラスa2とクラスa3とは、n対1の多重度で相互参照の関係を有する。クラスB1は、クラスBを継承する。
図5に示される全体クラス図の全体クラス図データ410は、例えば、図6に示されるような構成を有する。図6は、全体クラス図データの構成例を示す図である。
同図において、全体クラス図データ410は、全体クラステーブル411及び全体関係テーブル412を含む。全体クラステーブル411は、全体クラス図に含まれるクラスごとに、クラスID及びクラス名が記録されたテーブルである。クラスIDは、各クラスを識別するためのID(識別子)である。クラス名は、クラスの名前である。
全体関係テーブル412は、全体クラス図におけるクラス間の関係ごとに関係ID、関係元クラスID、関係先クラスID、関係種別、関係元多重度、関係先多重度、及び単方向フラグが記録されたテーブルである。関係IDは、各関係を識別するためのID(識別子)である。関係元クラスID及び関係先クラスIDは、関係の一方と他方のクラスのクラスIDである。当該関係が単方向(一方向)である場合、関係元クラスIDに係るクラス(関係元クラス)は参照元、集約元、又は継承元となり、関係先クラスIDに係るクラス(関係先クラス)は参照先、集約先、又は継承先となる。関係種別は、関係の種別(参照、集約、継承等の別)である。関係元多重度は、関係元クラスの多重度である。関係先多重度は、関係先クラスの多重度である。単方向フラグは、関係が単方向であるか否かを示す情報である。「true」は単方向を示し、「false」は双方向を示す。
なお、図5の全体クラス図510には、図6の全体クラステーブル411又は全体関係テーブル412において対応するクラス又は関係のクラスID又は関係IDが示されている。
続いて、分割点探索部112は、分割ルールデータ151に基づいて、全体クラス図510におけるクラス間の関係の中で分割可能な関係(以下、「分割点」という。)を探索する。分割点探索部112は、探索された関係の関係IDの集合を分割点リスト311としてメモリ装置103に記録する(S12)。
図7は、分割ルールデータの構成例を示す図である。同図に示されるように、分割ルールデータ151には、関係種別ごとに分割の可否(分割対象であるか否か)が記録されている。同図では、継承関係については分割対象とされていない。継承関係の場合、サブクラス(継承先のクラス)の実体(オブジェクト)は、継承元のクラスと同一であるため、分割することによる利益よりも不利益の方が大きいと考えられるからである。但し、同図に示されるルールは絶対的なものではない。当該ルールは、運用に応じて適宜変更されてもよい。
図7の分割ルールデータ151に基づく場合、全体クラス図510において分割点とされる関係は、図8に示される通りである。
図8は、分割点の例を示す図である。同図において、破線P1〜P7が横切っている関係が分割点とされた関係である。全体クラス図510では、クラスBとクラスB1との関係のみが継承関係でるため、それ以外の関係は分割点とされている。したがって、ステップS21では、関係ID1〜7を含むリストが分割リストとして出力される。
続いて、分割線作成部113は、探索された分割点の組み合わせよって形成される線の中から、全体クラス図510を二つに分割することができる線(以下、「分割線」という。)を探索する。分割線作成部113は、探索された分割線(分割点の組み合わせ)のリストを分割線リスト312としてメモリ装置103に記録する(S13)。
図9は、分割線の例を示す図である。同図では、分割線L1、L2、L3、及びL4が示されている。分割線L1は分割点P1によって形成される分割線である。分割線L2は、分割点P2によって形成される分割線である。分割線L3は分割点P3によって形成される分割線である。分割線L4は、分割点P7によって形成される分割線である。いずれの分割線によっても全体クラス図510は、二分割されることが分かる。なお、仮に、分割点P1及びP2によって形成される線で分割された場合、全体クラス図510は、三つに分割されてしまう。また、分割点P4、P5、又はP6のいずれか一つの分割点によって形成される線によって分割された場合、全体クラス図510は分割されない。このように、三つ以上に分割されてしまったり、分割されなかったりするような分割点の組み合わせは分割線とはされない。したがって、ステップS22では、分割線L1〜L4を示すデータが分割線リスト312として出力される。分割不可能な分割点の組み合わせが除外されることにより、以降の処理の冗長性を排除することができる。なお、一つの分割線を示すデータは、当該分割線を形成する分割点のリスト(すなわち、関係IDのリスト)である。
続いて、全体クラスパス作成部114は、全体クラス図510における全てのパスを作成し、当該パスのリストを含むデータを全体パスリスト321としてメモリ装置103に記録する(S14)。ここで、パスとは、基準となるクラスから関係先となるクラスが無くなるまで(クラス間の関係が行き止まりとなるまで)クラス間の関係を辿ることにより形成される経路をいう。全体クラス図510において、基準となるクラスは既定であり、本実施の形態ではクラスAであるとする。例えば、基準となるクラスは、入力部111がユーザに指定させてもよい。または、全体クラスパス作成部114が、他のいずれのクラスの関係先とされていないクラスを基準クラスとして自動的に選択してもよい。基準クラスがクラスAである場合、全体クラス図510において作成されるパスは図10の通りとなる。
図10は、全体クラス図のパスの例を示す図である。同図では、パスT1〜T4の四つのパスが示されている。パスT1は、A→A1→a1を経路とするパスである。パスT2は、A→A2→a2→a3を経路とするパスである。パスT3は、A→A2→a3→a2を経路とするパスである。パスT4は、A→B→B1を経路とするパスである。なお、クラスa2とクラスa3との関係は双方向であるため、当該関係については二つのパス(T2及びT3)によって異なる方向の部分経路として利用されている。各パスは、当該パスが通過するクラスIDの一覧によって表現される。したがって、全体パスリスト321は、それぞれがクラスIDの一覧であるパスを要素とする一覧である。
続くステップS15〜S19は、分割パターンごとのループとなる。分割パターンとは、分割数−1の本数の分割線の組み合わせをいう。本実施の形態では、分割数は「2」であるとする。したがって、2−1=1本の分割線の全ての組み合わせごとにステップS15〜S20が実行される。ループごとに処理対象とされた分割線の組み合わせ(分割パターン)を、以下「カレント分割パターン」という。なお、分割線は分割点の組み合わせである。したがって、分割線の組み合わせである分割パターンは、分割点の組み合わせとして捉えることもできる。
ところで、図3において、部分クラス図作成部116、部分基準クラス判定部117、部分クラスパス作成部118、部分クラスモデル量算出部119、及び部分モデル量総和算出部120のそれぞれは、同一名称のデータを複数個出力している。これは、ループが繰り返されることによって、分割パターンごとに各データが出力されることが示す。したがって、1回のループ処理において各手段より出力されるデータは、1つ又は1セットずつである。
ステップS15において、部分クラス図作成部116は、カレント分割パターンに基づいて全体クラス図を部分クラス図に分割し、当該部分クラス図の集合を示す分割結果データ313を生成する。すなわち、分割結果データ313は、分割パターンと1対1に対応し、分割された複数の部分クラス図の情報を含む。
図11は、全体クラス図の分割結果の例を示す図である。同図では、カレント分割パターンに含まれる分割線が分割線L1である場合の分割結果を示す。すなわち、部分クラス図511は、分割された一方の範囲に含まれる部分クラス図であり、部分クラス図512は、分割された他方の範囲に含まれる部分クラス図である。また、関係クラス図513は、部分クラス図511と部分クラス図512との関係を示すクラス図である。すなわち、部分クラス図511及び512のみでは、クラスAとクラスA1との関係を示す情報が失われてしまう。そこで、当該情報を保持するために関係クラス図513が作成されるのである。したがって、関係クラス図は、部分クラス図間の関係ごとに作成される。1つの分割結果データ313には、部分クラス図511及び512と、関係クラス図513とに関する情報が含まれる。なお、ステップS16以降において、関係クラス図は一つの部分クラス図として処理される。すなわち、ステップS16以降において「部分クラス図」というとき、特に明記されない限り、関係クラス図も含まれる。
続いて、部分基準クラス判定部117は、分割結果データ313に含まれている部分クラス図ごとに、基準クラスを判定する(S16)。基準クラスとは、部分クラス図内の関係において基準となるクラスをいう。基本的に部分クラス図内において最も関係元に位置するクラスが基準クラスとして選択される。すなわち、分割線に含まれる分割点において関係先に位置するクラスである。したがって、図11の例において、部分クラス図511についてはクラスA1が基準クラスとして判定される。また、部分クラス図512については全体クラス図510の基準クラスであるクラスAが基準クラスとして判定される。同様に、関係クラス図513についても、全体クラス図510の基準クラスであるクラスAが基準くらすとして判定される。部分基準クラス判定部117による判定結果は、基準クラス一覧データ314としてメモリ装置103に記録される。基準クラス一覧データ314は、分割パターンと1対1に対応し、分割された複数の部分クラス図のそれぞれの基準クラスのクラスIDを要素として含む。
続いて、部分クラスパス作成部118は、カレント分割パターンに係る部分クラス図ごとにパスを作成し、当該パスのリストを含むデータを部分パスリスト315としてメモリ装置103に記録する(S17)。ここでいうパスは、部分クラス図における基準クラスからのパスである。
図12は、部分クラス図のパスの例を示す図である。同図には、部分クラス図512のパスの例が示されている。部分パスリスト315は、部分クラス図ごとに作成され、対応する部分クラス図のパスの一覧を含む。したがって、部分クラス図512に関しては、三つのパスに関する情報(クラスIDの一覧)が一つの部分パスリスト315に含まれる。ステップS17では、カレント分割パターンに基づいて分割された他の部分クラス図(例えば、部分クラス図511)についても同様に部分パスリスト315が作成される。
続いて、部分クラスモデル量算出部119は、カレント分割パターンに係る部分パスリスト315群と、モデル量計算ルールデータ152とに基づいて、部分クラス図ごとに、当該部分クラス図に含まれるクラスのモデル量を算出する(S18)。
図13は、モデル量計算ルールデータの構成例を示す図である。同図に示されるように、モデル量計算ルールデータ152には、関係種別、関係元多重度、及び関係先多重度ごとに、関係先モデル量(関係先クラスのモデル量)が記録されている。例えば、同図では、集約関係及び参照関係については、多重度が1対1の場合の関係先モデル量は「a」、多重度が1対nの場合の関係先モデル量は「an」(aにnを乗じた値)とされている。また、継承関係については、関係先モデル量は「a」とされている。「a」は、関係元のクラスのモデル量(関係元モデル量)である。すなわち、同図において関係先モデル量は、関係元のモデル量に対する相対値として示されている。なお、本実施の形態にいて、基準クラスのモデル量は「1」とする。但し、基準クラスのモデル量の値は、各部分クラス図間において統一された所定値である限りにおいて、どのような値であってもよい。
ここで、モデル量とは、クラスがインスタンス化された場合の、インスタンス数の推定量(又は推定値)を示す指標である。したがって、多重度が大きいほどモデル量は大きくなる傾向に有る。
部分クラスモデル量算出部119は、図13に示されるモデル量計算ルールデータ152に基づいて、部分クラス図内の各クラスのモデル量を算出する。算出結果は、部分クラス図ごとにモデル量リスト316としてメモリ装置103に記録される。したがって、カレント分割パターンに関して複数のモデル量リスト316が生成される。
続いて、部分モデル量総和算出部120は、カレント分割パターンに係るモデル量リスト316群とモデル量加算ルールデータ153とに基づいて、カレント分割パターンに係る各部分クラス図に含まれるクラスのモデル量の総和を算出する(S19)。
図14は、モデル量加算ルールデータの構成例を示す図である。同図に示されるように、モデル量加算ルールデータ153は、関係種別、関係元多重度、及び関係先多重度ごとに、加算ルールが記録されている。加算ルールは、関係元モデル量と関係先モデル量との和を算出するための演算ルールである。「+」は、関係先モデル量に対して関係先モデル量を足すことを示す。「=」は、関係元モデル量に一致することを示す。すなわち、継承関係の場合、関係元モデル量と関係先モデル量との和は、関係元モデル量に等しい。
部分モデル量総和算出部120は、図14に示されるモデル量加算ルールデータ153に基づいて、各クラスのモデル量の総和を算出する。算出結果は、モデル量総和データ317としてメモリ装置103に記録される。モデル量総和データ317は、カレント分割パターンに対して一つ生成される。
上記ステップS15〜S20が全ての分割パターンについて実行されると(S20でYes)、分割パターン選択部121は、分割パターンごとに生成されたモデル量総和データを比較して、モデル量の総和が最も小さい分割パターンを選択する(S21)。分割パターン選択部121は、選択の結果として、例えば、選択された分割パターンに係る部分クラス図データを補助記憶装置102に記録する。または、分割する部分(例えば、関連)を識別可能な情報を補助記憶装置102が記録されてもよいし、表示装置105に表示されてもよい。この場合、ユーザは、他のツール等を利用して、当該情報に従って全体クラス図を分割すればよい。
上記の通り、本実施の形態では、インスタンス数の推定量であるモデル量という概念を用いて全体クラス図の分割パターンを比較し、モデル量の総和が最小となる分割パターンを推薦する。したがって、モデルデータ(インスタンスレベルの情報(インスタンス図))の編集時において、分割単位ごとのインスタンス数の偏り(ばらつき)を小さくすることができる。
続いて、図4の各ステップの詳細について説明する。まず、ステップS12の詳細について説明する。
図15は、分割点の探索処理の処理手順を説明するためのフローチャートである。
ステップS121において、分割点探索部112は、空の分割点リスト311をメモリ装置103に生成する。分割点リスト311は、例えば、関係IDを要素とするリスト構造のデータである。続いて、分割点探索部112は、全体関係テーブル412の最初の行を処理対象の行(以下、「カレント行」という。)とする。続いて、分割点探索部112は、カレント行の関係種別を分割ルールデータ151に当てはめることにより、カレント行に係る関係は分割可能であるか否か(すなわち、分割点となるか否か)を判定する(S123)。カレント行に係る関係が分割点となる場合(S123でYes)、分割点探索部112は、カレント行の関係IDを分割点リスト311に追加する(S124)。続いて、分割点探索部112は、全体関係テーブル412においてカレント行の次の行をカレント行とし(S125)、ステップS123以降を繰り返す(S126)。全体関係テーブル412の全ての行に関して(すなわち、全体クラス図510の全ての関係に関して)処理が完了すると(S126でNo)、分割点探索部112は、図15の処理を終了させる。
続いて、図4のステップS13の詳細について説明する。図16は、分割線の作成処理の処理手順を説明するためのフローチャートである。
ステップS131において、分割線作成部113は、分割点リスト311に含まれている関係IDのベキ集合(以下、「分割点ベキ集合」という。)を生成する。ベキ集合の各要素は、分割点の組み合わせである。したがって、当該要素は、分割線の候補である。
続いて、分割線作成部113は、空の分割線リスト312をメモリ装置103に生成する(S132)。分割線リスト312は、例えば、分割点の組み合わせ(関係IDの組み合わせ)を要素とするリスト構造のデータである。続いて、分割点ベキ集合に含まれている要素ごとに処理が実行される(S133)。
ステップS134において、分割線作成部113は、分割点ベキ集合より要素を一つ取り出し、処理対象(カレント要素)とする。続いて、分割線作成部113は、カレント要素による全体クラス図510の分割をクラス図分割部115に実行させる(S135)。クラス図分割部115は、分割対象とするクラス図のクラステーブル、関係テーブル、及び分割線の一覧を入力情報とする。クラステーブルとは、全体クラス図510の全体クラステーブル411に相当するテーブルである。関係テーブルとは、全体クラス図510の全体関係テーブル412に相当するテーブルである。クラス図分割部115は、入力情報に含まれる分割線の一覧に基づいて分割対象のクラス図を部分クラス図に分割し、部分クラス図ごとに部分クラステーブル及び部分関係テーブルを作成する。部分クラステーブルは、クラステーブルが部分クラス図単位で分割されたテーブルである。部分関係テーブルは、関係テーブルが部分クラス図単位で分割されたテーブルである。
したがって、分割線作成部113は、全体クラス図510の全体クラステーブル411及び全体関係テーブル412を分割対象のクラス図に関する情報としてクラス図分割部115に入力する。また、分割線作成部113は、カレント要素(一つの分割線)を分割線の一覧としてクラス図分割部115に入力する。
続いて、分割線作成部113は、クラス図分割部115の処理結果に基づいて、全体クラス図510が二分割されたか否かを判定する(S136)。二分割された場合(S136でYes)、分割線作成部113は、カレント要素を一つの分割線を示すデータとして分割線リスト312に追加する(S137)。二分割されない場合、すなわち、分割されない場合又は三分割以上される場合(S136)、カレント要素は、分割線リスト312には追加されない。
ステップS134以降の処理が、分割点ベキ集合に含まれる全ての要素に対して完了すると(S133でNo)、図16の処理は終了さする。
続いて、図16のステップS135の詳細について説明する。図17は、全体クラス図の分割処理の処理手順を説明するためのフローチャートである。
ステップS501において、クラス図分割部115は、全体クラステーブル411、全体関係テーブル412、及び分割線一覧等の入力情報を受け付ける。続いて、クラス図分割部115は、入力された分割線一覧より未処理の分割線に係るデータを取り出し、当該データを処理対象(以下、「カレント分割線」という。)とする(S502)。なお、ステップS502からS507は、分割線一覧に含まれる分割線ごとのループ処理となる。但し、図15のステップS135より呼び出された場合、分割線一覧には一つ分割線に関するデータ(ステップS135におけるカレント要素)のみが含まれている。したがって、ループ回数は1回となる。
続いて、ステップS503〜S506は、カレント分割線に含まれる分割点ごとのループ処理となる。ステップS503において、クラス図分割部115は、カレント分割線より分割点を示すデータ(すなわち、関係ID)を一つ取り出し、当該分割点を処理対象(以下、「カレント分割点」という。)とする。続いて、クラス図分割部115は、カレント分割点の関係元クラス及び関係先クラスの双方の情報(クラス名及びクラスID)を作業用クラステーブルA1に追加する(S504)。カレント分割点の関係元クラス及び関係先クラスのそれぞれのクラスIDは、カレント分割点の関係IDと全体関係テーブル412とに基づいて判定される。当該クラスIDに対応するクラス名は、全体クラステーブル411に基づいて判定される。続いて、クラス図分割部115は、カレント分割点に関する情報を作業用関係テーブルA2に追加する(S505)。カレント分割点に関する情報は、カレント分割点の関係IDに基づいて全体関係テーブル412より取得される。なお、ステップS504又はS505において、作業用クラステーブルA1又は作業用関係テーブルA2におけるデータ(レコード)の重複は排除される。すなわち、追加対象とされたクラス又は関係に関するデータが既に作業用クラステーブルA1又は作業用関係テーブルA2に登録されている場合、当該クラス又は当該関係に関するデータの追加は行われない。
作業用クラステーブルA1及び作業用関係テーブルA2(以下、二つのテーブルを総称する場合、「作業用テーブルA」という。)は、関係クラス図(図11参照)の部分クラステーブル及び部分関係テーブルを作成するための作業用のテーブルである。
例えば、入力情報とされた全体クラステーブル411及び全体関係テーブル412が、図6に示される通りであり、カレント分割線の内容が{(1)}である場合、作業用テーブルAは、図18に示される通りとなる。なお、{(1)}は、関係IDの集合を示す。したがって、ここでは、カレント分割線は、関係1(関係IDが「1」の関係)における分割点のみによって形成される分割線である。
図18は、作業用テーブルAの例を示す図である。同図において、作業用関係テーブルA2には、関係1のデータが登録されている。作業用クラステーブルA1には、関係1の関係元クラス又は関係先クラスに関するデータが登録されている。
カレント分割線に含まれる全ての分割点についてステップS503からS505が実行されると(S506でNo)、クラス図分割部115は、分割線一覧に含まれる次の分割線を処理対象(カレント分割線)としてステップS502以降の処理を繰り返す(S507)。分割線一覧に含まれる全ての分割線についてステップS502からS506が実行されると(S507でNo)、クラス図分割部115は、入力情報に指定されている全体クラステーブル411の内容を作業用クラステーブルB1にコピーする(S508)。続いて、クラス図分割部115は、入力情報に指定されている全体関係テーブル412から、作業用関係テーブルA2に登録された関係を除いた関係に関するデータを作業用関係テーブルB2に登録する(S509)。作業用クラステーブルB1及び作業用関係テーブルB2(以下、二つのテーブルを総称する場合、「作業用テーブルB」という。)は、部分クラス図(図11参照)に関する部分クラステーブル及び部分関係テーブルを作成するための作業用のテーブルである。
例えば、図19は、作業用テーブルBの例を示す図である。同図の作業用クラステーブルB1は、図6の全体クラステーブル411の内容がコピーされた結果である。また、作業用関係テーブルB2は、図7の全体関係テーブル412より、図18の作業用関係テーブルA2に登録されているデータが除外された結果である。
続いて、クラス図分割部115は、作業用テーブルAを、分割線一覧に含まれている分割線によって分割される部分クラス図間の関係クラス図ごとに分割する(S510)。続いて、クラス図分割部115は、作業用テーブルBを、分割線一覧に含まれている分割線によって分割される部分クラス図ごとに分割する(S511)。
続いて、ステップS510及びS511の詳細について説明する。図20は、作業用テーブルの分割処理の処理手順を説明するためのフローチャートである。同図の処理は、ステップS510及びS511において共用される。すなわち、ステップS510及びS511は、処理対象となる作業用テーブルが異なるだけである。したがって、図20の説明では、作業用クラステーブルA1又はB1を単に「作業用クラステーブル」という。同様に、作業用関係テーブルA2又はB2を単に「作業用関係テーブル」という。
ステップS551において、クラス図分割部115は、作業用クラステーブルは空であるか否かを判定する。作業用クラステーブルは空でない場合(S551でNo)、クラス図分割部115は、空のサブクラステーブル及び空のサブ関係テーブルを一つずつメモリ装置103に生成する(S552)。サブクラステーブルは、作業用クラステーブルの一つの分割結果を格納するためのテーブルである。サブ関係テーブルは、作業用関係テーブルの一つの分割結果を格納するためのテーブルである。続いて、クラス図分割部115は、作業用クラステーブルからクラス(行)を一つ取得し、処理対象(以下、「カレントクラス」という。)とする(S553)。
続いて、クラス図分割部115は、カレントクラスをサブクラステーブルに追加し、作業用クラステーブルより削除する(S554)。続いて、クラス図分割部115は、作業用関係テーブルに、カレントクラスが関係元クラス又は関係先クラスとして登録されている関係(行)が有るか否かを判定する(S555)。当該関係が有る場合(S555でYes)、クラス図分割部115は、当該関係においてカレントクラスの関係先又は関係元のクラスを新たなカレントクラスとする(S556)。すなわち、関係が辿られて処理対象のクラスが更新される。続いて、クラス図分割部115は、当該関係をサブ関係テーブルに追加し、作業用関係テーブルより削除する(S557)。
続いて、クラス図分割部115は、新たなカレントクラスについてステップS554以降の処理を繰り返す。当該処理を繰り返す過程において、作業用関係テーブルが空となると、ステップS555においてNoと判定される。その結果、サブクラステーブル及びサブ関係テーブルは、一つの部分クラス図の部分クラステーブル若しくは部分関係テーブル又は一つの関係クラス図の部分クラステーブル若しくは部分関係テーブルとして確定される。
続けて、作業用クラステーブルが空となるまでステップS551以降が実行されることにより、他の部分クラス図又は関係クラス図について、部分クラステーブル又は部分関係テーブルが作成される。
例えば、図18の作業用テーブルAについて図20の処理が実行されると、図18と同様の構成を有する部分クラステーブル及び部分関係テーブルが作成される。すなわち、関係図については分割されない。
また、図19の作業用テーブルBについて図20の処理が実行されると、図21に示されるような部分クラステーブル及び部分関係テーブルが作成される。
図21は、作業用テーブルBの分割結果の例を示す図である。同図において、作業用テーブルBは二つに分割されている。すなわち、作業用クラステーブルB1は、部分クラステーブルB1−1及びB1−2に、作業用関係テーブルB2は、部分関係テーブルB2−1及びB2−2に、それぞれ分割されている。
なお、図16のステップS136において、分割線作成部113は、作業用テーブルBが二つに分割された場合、全体クラス図510は二分割されたと判定する。
続いて、図4のステップS14(すなわち、図10に例示されるパスの作成処理)の詳細について説明する。図22は、パスの作成処理を説明するためのフローチャートである。
ステップS1401において、全体クラスパス作成部114は、全体クラス図510の基準クラス(クラスA)を処理対象(以下、「カレントクラス」という。)とする。続いて、全体クラスパス作成部114は、空の全体パスリスト321をメモリ装置103に生成する(S1402)。続いて、全体クラスパス作成部114は、変数newPathの値をfalseに初期化する(S1403)。変数newPathは、処理の流れを制御するためのフラグ変数である。
続いて、全体クラスパス作成部114は、全体関係テーブル412内において、カレントクラスを関係元とする関係で未処理(パスの探索において辿られていない)の関係(行)の有無を判定する(S1404)。未処理の関係が有る場合(S1403でYes)、全体クラスパス作成部114は、カレントクラスを関係元とする未処理の関係を処理対象(以下、「カレント関係」という。)とする(S1405)。例えば、カレントクラスがクラスA(クラスID=1)である場合、関係1がカレント関係とされる。
続いて、全体クラスパス作成部114は、変数newPathの値がfalseであるか否かを判定する(S1406)。変数newPathの初期値はfalseであるため、最初にこのステップが実行される際の判定結果はYesとなる。変数newPathの値がfalseの場合(S1406でYes)、全体クラスパス作成部114は、パスデータをメモリ装置103に生成する(S1407)。パスデータは、一本分のパスを格納するためのデータである。一本分のパスは、当該パスに係るクラスのクラスIDのリストによって表現される。
続いて、全体クラスパス作成部114は、新たなパスの作成が開始されたことを示すため、変数newPathの値をtrueに更新する(S1408)。続いて、全体クラスパス作成部114は、基準クラスからカレントクラスまでのパスに係るクラスのクラスIDをパスデータに追加する(S1409)。最初は、カレントクラスは基準クラスである。したがって、基準クラスのクラスIDがパスデータに追加される。続いて、全体クラスパス作成部114は、カレント関係の関係先クラスを新たなカレントクラスとする(S1410)。続いて、全体クラスパス作成部114は、パスデータにカレントクラスのクラスIDを追加する(S1411)。
上記ステップS1405〜S1411は、ステップS1404の判定結果がNoとなるまで繰り返される。全体クラス図510については、クラスA、A1、a1の順でカレントクラスとされ、当該各クラスのクラスID(1、2、3)がパスデータに格納される。クラスa1についてステップS1404の判定が行われると、当該判定結果はNoとなり、ステップS1412に進む。クラスa1を関係元とする関係は無いからである。
ステップS1412において、全体クラスパス作成部114は、カレントクラスは基準クラスであるか否かを判定する。カレントクラスが基準クラスでない場合(S1412でNo)、全体クラスパス作成部114は、変数newPathの値はtrueであるか否かを判定する。すなわち、一つのパスの作成中であるか否かが判定される。なお、カレントクラスがクラスa1である場合、クラスa1は基準クラスでないため(基準クラスはクラスAである)、ステップS1413が実行される。
変数newPathの値がtrueである場合(S1413でYes)、全体クラスパス作成部114は、一つのパス(図10のパスT1)の作成が完了したとし、現在処理対象とされているパスデータを全体パスリスト321に追加する(S1414)。なお、全体パスリスト321は、パスデータのリスト(一覧)を格納するための構造を有する。続いて、全体クラスパス作成部114は、一つのパスの作成が完了したことを示すため、変数newPathの値をfalseに更新する(S1415)。続いて、全体クラスパス作成部114は、現在処理対象とされているパスデータにおいてカレントクラスの一つ前の要素に係るクラスをカレントクラスとする(S1416)。すなわち、関係が逆方向に辿られてカレントクラスが更新される。具体的には、クラスa1からクラスA1にカレントクラスが更新される。
続いて、更新されたカレントクラスについてステップS1404が実行される。クラスA1を関係元とする未処理の関係は無く(S1404でNo)、クラスA1は基準クラスではなく(S1412でNo)、変数newPathの値はfalseであるため(S1413でNo)、ステップS1416が実行される。すなわち、更に関係が逆方向に辿られ、クラスAがカレントクラスとなる。
クラスAについては、未処理のパスが有る。したがって、図10のパスT2、T3、及びT4のそれぞれに対応するパスデータが上述した手順によって生成され、全体パスリスト321に追加される。パスT4の作成完了後、クラスB1→B→Aの順でカレントクラスが逆に辿られ、再びクラスAがカレントクラスとなると、ステップS1404の判定結果はNoとなる。クラスAを関係元とする未処理の関係は無いからである。続いて、カレントクラスは基準クラスであるため(S1412でYes)、図22の処理は終了する。
続いて、図4のステップS15(すなわち、図11に示される部分クラス図の作成処理)の詳細について説明する。図23は、部分クラス図の作成処理の処理手順を説明するためのフローチャートである。
ステップS151において、部分クラス図作成部116は、カレント分割パターンを分割線一覧としてクラス図分割部115に入力し、カレント分割パターンによる全体クラス図510の分割をクラス図分割部115に実行させる(S151)。したがって、ステップS151では、図17及び図20において説明した処理手順が、カレント分割パターン、全体クラステーブル411、及び全体関係テーブル412等に基づいて実行される。
続いて、部分クラス図作成部116は、クラス図分割部115によって作成された、部分クラステーブル及び部分関係テーブルの集合を分割結果データ313としてメモリ装置103に記録する(S152)。すなわち、一つの分割結果データ313には、一つの分割パターンによって分割された結果として作成される、部分クラステーブル及び部分関係テーブルが含まれる。なお、分割結果に応じて同種のテーブルが複数含まれうる。例えば、二つの部分クラス図に分割された場合、部分クラス図ごとに部分クラステーブル及び部分関係テーブルが作成され、同じ分割結果データ313に含まれる。
続いて、図4のステップS16の詳細について説明する。図24は、部分クラス図の基準クラスの判定処理の処理手順を説明するためのフローチャートである。
ステップS161において、部分基準クラス判定部117は、空の基準クラス一覧データ314をメモリ装置103に生成する。基準クラス一覧データ314は、一つの分割パターンによって分割される部分クラス図ごとに基準クラスのリスト(後述される基準クラス部分リスト)を格納可能なデータ構造を有する。一つの部分クラス図について、基準クラスのリスト(一覧)を対応させるのは、分割点を複数有する部分クラス図が作成されうるためである。すなわち、部分クラス図の基準クラスは、分割点ごとに存在する可能性が有るからである。
続いて、部分基準クラス判定部117は、空の基準クラス部分リストをメモリ装置103に生成する(S162)。基準クラス部分リストは、一つの部分クラス図における基準クラスの一覧を格納するためのデータである。続いて、部分基準クラス判定部117は、全体クラス図の基準クラス(クラスA)のクラスIDを基準クラス部分リストに追加する(S163)。続いて、部分基準クラス判定部117は、基準クラス一覧データ314に基準クラス部分リストを追加する(S164)。すなわち、全体クラス図510の基準クラスは、当該基準クラスを含む部分クラス図において基準クラスとなる。したがって、ステップS163及びS164は、全体クラス図510の基準クラスを一つの部分クラス図の基準クラスとして基準クラス一覧データ314に登録するための処理である。
続いて、部分基準クラス判定部117は、カレント分割パターン内に含まれる分割線ごとにステップS166以降の処理を実行する(S165)。ステップS166において、部分基準クラス判定部117は、カレント分割パターン内において、未処理の分割線を処理対象(以下、「カレント分割線」という。)とする。続いて、部分基準クラス判定部117は、空の基準クラス部分リストをメモリ装置103に生成する(S167)。
続いて、部分基準クラス判定部117は、カレント分割線に含まれる分割点(関係ID)ごとにステップS169以降の処理を実行する(S168)。ステップS169において、部分基準クラス判定部117は、カレント分割線内において、未処理の分割点を処理対象(以下、「カレント分割点」という。)とする。続いて、部分基準クラス判定部117は、カレント分割点の関係元クラスIDを含むパスデータを全体パスリスト321の中から検索する(S170)。カレント分割点の関係元クラスIDは、カレント分割点の関係IDに基づいて全体関係テーブル412より取得することができる。続いて、部分基準クラス判定部117は、検索されたパスデータにおいてカレント分割点の関係元クラスIDの次に格納されているクラスID(パスの経路順において次のクラスのクラスID)を基準クラス部分リストに追加する(S171)。すなわち、当該クラスIDに係るクラスが、カレント分割線によって分割される関係先の部分クラス図の基準クラスとなる。
ステップS169以降の処理がカレント分割線に含まれる全ての分割点について完了すると(S168でNo)、一つの分割線に係る各分割点に対応する基準クラスについて基準クラス部分リストへの登録が完了する。このことは、カレント分割線によって分割された一つの部分クラス図における基準クラスの登録の完了を意味する。そこで、部分基準クラス判定部117は、基準クラス部分リストをカレント分割線と対応付けて基準クラス一覧データ314に追加する(S172)。したがって、例えば、基準クラス一覧データ314は、map形式のデータとしてもよい。この場合、keyにカレント分割線を登録し、valueに基準クラス部分リストを登録すればよい。なお、全体クラス図510の基準クラスには対応する分割線は無い。したがって、ステップS164においては分割線との対応付けは行われない。
続いて、カレント分割パターンに含まれる他の分割線のそれぞれについてステップS166以降が実行される(S165)。その結果、基準クラス一覧データ314は、カレント分割パターンによって分割された部分クラス図ごとに、基準クラス部分データが登録された状態となる。
なお、図24の処理は、分割結果データ313を用いて行ってもよい。具体的には、部分クラス図ごとの部分クラステーブル及び部分関係テーブル(例えば、図21参照)に基づいて、各部分クラス図の基準クラスが判定されてもよい。この場合、部分クラステーブルに登録されているクラスIDの中で、部分関係テーブルの関係先クラスIDとして登録されていないクラスIDに係るクラスを、部分クラス図の基準クラスとすればよい。
続いて、図4のステップS17の詳細について説明する。ステップS17において、部分クラスパス作成部118は、基準クラス一覧データ314に含まれている基準クラスごとに、図22と同様の処理手順を実行する。すなわち、全体クラスパス作成部114は、全体クラス図510の基準クラスからのパスを作成したが、部分クラスパス作成部118は、同じ処理手順によって部分クラス図の基準クラスごとにパスを作成する。したがって、ステップS1401における基準クラスは、処理対象とされた基準クラスとなる。また、全体関係テーブル412の代わりに、処理対象とされた基準クラス(部分クラス図)に係る部分関係テーブル(例えば、図21参照)が利用される。当該部分関係テーブルに基づいて、ステップS1401の判定や、カレントクラスの関係先クラス等の判定等が行われる。また、ステップS1402では、空の部分パスリスト315が生成され、ステップS1414では当該部分パスリスト315にパスデータが追加される。
その結果、カレント分割パターンによって分割された部分クラス図ごとに部分パスリスト315がメモリ装置103に生成される。なお、一つの部分パスリスト315は、一つの部分クラス図におけるパスの一覧を示すデータである。例えば、図12に例示される部分クラス図512であれば、3つのパスに関するパスデータが一つの部分パスリスト315に格納される。
続いて、図4のステップS18の詳細について説明する。図25は、部分クラス図の各クラスのモデル量の算出処理の処理手順を説明するためのフローチャートである。同図の処理手順は、一つの部分クラス図に含まれている各クラスのモデル量を算出するものである。したがって、ステップS18では、カレント分割パターンによって分割された部分クラス図ごとに(部分パスリスト315ごとに)同図の処理手順がくり返し実行される。図25の説明において、「部分パスリスト315」は、処理対象とされた部分クラス図に対応する一つの部分パスリスト315をいう。
ステップS1801において、部分クラスモデル量算出部119は、空のモデル量リスト316をメモリ装置103に生成する。続いて、処理対象とされている部分クラス図の基準クラスのモデル量を(1,0)とし、当該モデル量と基準クラスのクラスIDとが対応付けられたデータをモデル量リスト316の要素として追加する(S1802)。すなわち、モデル量リスト316は、クラスIDとモデル量との組の一覧を格納可能なデータ構造を有する。したがって、モデル量リスト316は、クラスIDをkeyとし、モデル量をvalueとするmap形式のデータとしてもよい。なお、処理対象とされている部分クラス図の基準クラスとは、部分パスリスト315内のパスデータにおいて先頭の要素である。各パスの基準クラスが重複する場合(例えば、図12では、3つの全てのパスの基準クラスはクラスAである。)、重複は排除されて基準クラス一つ分のモデル量がモデル量リスト316に追加される。また、本実施の形態において、モデル量は、(a,b)と表記される。aは係数であり、bは次数である。したがって、基準クラスのモデル量は「1」となる。なお、モデル量の表現の仕方は任意である。例えば、多重度が整数で特定されている場合は、モデル量は単に整数によって表現してもよい。本実施の形態では、多重度は不定値(n)である。したがって、モデル量は、nの関数として表現される。
続いて、部分クラスモデル量算出部119は、部分パスリスト315内に未処理のパスデータ(一つ分のパスに関するクラスIDのリスト)が残っているか否かを判定する(S1803)。未処理のパスデータが残っている場合、部分クラスモデル量算出部119は、未処理のパスデータの一つを処理対象(以下、「カレントパスデータ」という。)とする(S1804)。続いて、部分クラスモデル量算出部119は、カレントパスデータ内で未処理のクラスIDの有無を判定する(S1805)。未処理のクラスIDが有る場合(S1804でYes)、部分クラスモデル量算出部119は、カレント部分パスリスト315内の並び順において基準クラス側から順に一つのクラスIDを処理対象(以下、「カレントクラスID」という。)とする(S1806)。したがって、最初にステップS1804が実行されるときは、基準クラスのクラスIDがカレントクラスIDとされる。
続いて、部分クラスモデル量算出部119は、処理対象の部分クラス図の部分関係テーブルより関係元クラスIDがカレントクラスIDであり、関係先クラスIDがカレントクラスIDの次のクラスIDであるデータ(行)を取得する(S1807)。なお、カレントクラスIDの次のクラスIDとは、カレントパスデータの並び順においてカレントクラスIDの次のクラスIDをいう。
続いて、部分クラスモデル量算出部119は、取得されたデータに含まれている関係種別、関係元多重度、及び関係先多重とモデル量計算ルールデータ152とに基づいて、カレントクラスIDに係るクラス(カレントクラス)の関係先のクラスのモデル量を算出する(S1808)。より詳しくは、部分クラスモデル量算出部119は、取得されたデータに含まれている関係種別、関係元多重度、及び関係先多重に対応する関係先モデル量をモデル量計算ルールデータ152(図13参照)より取得する。取得された関係先モデル量の「a」にカレントクラスのモデル量を代入することにより、当該関係先クラスのモデル量を算出する。したがって、例えば、カレントクラスのモデル量が「1」であり、カレントクラスと関係先のクラスとが1対nの多重度による集約関係を有する場合、当該関係先のクラスのモデル量はnとなる。
続いて、部分クラスモデル量算出部119は、当該関係先のクラスのモデル量について、算出された結果と既にモデル量リスト316に登録されているモデル量とを比較する(S1809)。ステップS1808でモデル量が算出されたクラスと同一のクラスについて既にモデル量リスト316にモデル量が登録されているケースとしては、当該クラスが二つ以上のパスに含まれているケースが挙げられる。例えば、図12において、クラスa1及びa2は、それぞれ二つのパスに含まれている。このようなクラスについては、各パスにおいて算出されたモデル量のうちの最大値が採用される。したがって、部分クラスモデル量算出部119は、新たに算出されたモデル量の方が大きい場合に(S1809でYes)、当該モデル量と当該関係先のクラスのクラスIDとが対応付けられたデータをモデル量リスト316の要素として追加する(S1810)。なお、当該関係先のクラスに対するモデル量がモデル量リスト316に登録されていない場合もステップS1810は実行される。例えば、モデル量がnである場合、(n,1)を含む要素がモデル量リスト316に登録される。
ステップ1806以降がカレントパスデータ内の全てクラスIDについて実行されると(S1805でNo)、次のパスデータがカレントパスデータとされてステップS1805以降が実行される。更に、部分パスリスト315内の全てのパスデータについてステップS1803以降が実行されると(S1803でNo)、図25の処理は終了する。
図25の処理がカレント分割パターンの部分クラス図ごとに実行されることにより、図26に示されるように、各部分クラス図に含まれる各クラスのモデル量が算出され、算出結果が各モデル量リスト316に格納される。
図26は、一つの分割パターンにおける各部分クラス図の各クラスのモデル量の算出結果の例を示す図である。図26中、図11と同一部分には同一符号を付している。
図26において、各クラスの矩形内の括弧内にモデル量が記載されている。例えば、部分クラス図511において、クラスA1のモデル量は1であり、クラスa1のモデル量は1である。部分クラス図512において、クラスA、A2、a1、a2、B、B1のモデル量は、それぞれ、1、n、n3、n3、n、nである。関係クラス図513において、クラスA、A1のモデル量は、それぞれ、1、nである。図26の分割パターンの場合、部分クラス図511、部分クラス図512、関係クラス図513のそれぞれについてモデル量リスト316が生成され、各部分クラス図(関係クラス図も含む)の各クラスのモデル量が各モデル量リスト316に格納される。
続いて、図4のステップS19の詳細について説明する。図27は、各部分クラス図に含まれるクラスのモデル量の総和の算出処理の処理手順を説明するためのフローチャートである。同図の処理手順は、一つの分割パターンに係る全部分クラス図に含まれている各クラスのモデル量の総和を算出するものである。なお、本実施の形態において、モデル量は(係数,次数)の形式で表現されている。したがって、図27の処理は、単純な整数の足し算ではなく、モデル量リスト316に格納されているモデル量の中で次数が共通するモデル量同士を統合する処理となる。但し、モデル量を整数で表現している場合、図27の処理は、各クラスのモデル量をモデル量加算ルールデータ153に従って足し算すればよい。
ステップS1901において、部分モデル量総和算出部120は、空のモデル量総和データ317をカレント分割パターンに関連付けてメモリ装置103に生成する。モデル量総和データ317は、次数が共通する同士が統合されたモデル量の一覧を格納可能なデータ構造を有する。続いて、部分モデル量総和算出部120は、カレント分割パターンに係るモデル量リスト316ごとにステップS1903以降の処理を実行する(S1902)。ステップS1903において、部分モデル量総和算出部120は、モデル量リスト316のうち、未処理のモデル量リスト316を処理対象(以下、「カレントモデル量リスト316」という。)とする。
続いて、部分モデル量総和算出部120は、カレントモデル量リスト316に含まれる要素ごとにステップS1905以降の処理を実行する(S1904)。なお、要素とは、クラスIDとモデル量とが対応付けられたデータである。ステップS1905において、部分モデル量総和算出部120は、カレントモデル量における未処理の要素を一つ処理対象(以下、「カレント要素」という。)とする。続いて、部分モデル量総和算出部120は、カレント要素のクラスIDが関係先クラスIDであるデータ(行)をカレントモデル量リスト316に対応する部分関係テーブルより取得する(S1906)。なお、カレントモデル量リスト316に対応する部分関係テーブルとは、カレントモデル量リスト316に対応する部分クラス図の部分関係テーブルをいう。
続いて、部分モデル量総和算出部120は、取得されたデータとモデル量加算ルールデータ153(図14参照)とに基づいて、カレント要素のモデル量は加算対象であるか否かを判定する(S1907)。例えば、図14のモデル量加算ルールデータ153に基づく場合、取得されたデータに含まれている関係種別が継承以外であれば、加算対象であると判定される。当該関係種別が継承であれば加算対象ではないと判定される。なお、カレント要素が基準クラスに対応する場合、無条件に加算対象とされる。カレント要素が基準クラスに対応する場合とは、カレント要素のクラスIDが部分クラス図の関係先クラスIDとして登録されていない場合である。
カレント要素のモデル量が加算対象でない場合(S1907でNo)、カレントモデル量リスト316における次の要素が処理対象とされる。カレント要素のモデル量が加算対象である場合(S1907でYes)、部分モデル量総和算出部120は、モデル量総和データ317に既に登録されているモデル量の中で、カレント要素のモデル量と次数が一致するモデル量を取得する(S1908)。なお、取得されたモデル量はモデル量総和データ317より除去(削除)される。
該当するモデル量が取得されなかった場合(S1909でNo)、部分モデル量総和算出部120は、カレント要素のモデル量をモデル量総和データ317の要素として追加する(S1910)。該当するモデル量が取得された場合(S1909でYes)、部分モデル量総和算出部120は、取得されたモデル量の係数とカレント要素のモデル量の係数を合算する(S1911)。なお、該当するモデル量は複数存在する場合が有る。この場合、複数の全てのモデル量の係数が合算される。続いて、部分モデル量総和算出部120は、合算された係数を係数とし、カレント要素のモデル量の次数を次数とするモデル量をモデル量総和データ317の要素として追加する(S1912)。
ステップS1910又はS1912に続いて、カレントモデル量リスト316における他の要素についてステップS1904以降の処理が実行される。カレントモデル量リスト316に含まれる全ての要素についてステップS1905以降の処理が完了すると(S1904でNo)、カレント分割パターンに係る他の部分クラス図に係るモデル量リスト316をカレントモデル量リスト316としてステップS1903以降の処理が実行される。カレント分割パターンに係る全てのモデル量リスト316についてステップS1903以降の処理が完了すると(S1902でNo)、図27の処理は終了する。
図27の処理の結果、モデル量総和データ317には、カレント分割パターンに係る全ての部分クラス図に含まれるクラスのモデル量の総和が格納される。したがって、モデル量総和データ317は分割パターンと1対1に対応する。例えば、図26の分割パターンの場合、1+1+1+n+n3+n3+n+1+nの総和として4+3n+2n3が算出され、各項(4、3n、2n3)がモデル量総和データ317の要素となる。
また、図28は、別の分割パターンのモデル量を示す図である。同図は、関係3を分割点とする分割線による分割パターンを示す。この場合、部分クラス図514、部分クラス図515、関係クラス図516に関する分割結果データ313が生成される。同図の各クラスのモデル量の総和は、1+1+n+n+n+1+n2+n2+1+n=4+3n+2n2となる。したがって、当該分割パターンついては、4、3n、2n2がモデル量総和データ317の要素となる。
続いて、図4のステップS21の詳細について説明する。図29は、モデル量が最小の分割パターンの選択処理の処理手順を説明するためのフローチャートである。なお、図4より明らかなように、ステップS21(図29の処理)は、全ての分割パターン(全ての分割線の組み合わせ)ごとにモデル量総和データ317が生成された後に実行される。
ステップS211において、分割パターン選択部121は、全てのモデル量総和データ317のうちの一つのモデル量総和データ317を最小モデル量とする。続いて、分割パターン選択部121は、全てのモデル量総和データ317について比較が行われたか否かを判定する(S212)。比較されていないモデル量総和データ317が存在する場合(S212でNo)、分割パターン選択部121は、比較されていないモデル量総和データ317のうちの一つを比較対象とする(S213)。続いて、分割パターン選択部121は、最小モデル量と比較対象とをモデル量比較部122に入力し、二つのモデル量の比較をモデル量比較部122に実行させる(S214)。
モデル量比較部122によって、最小モデル量より比較対象の方が小さいと判定された場合(S215でYes)、分割パターン選択部121は、比較対象によって最小モデル量を更新する(S216)。最小モデル量より比較対象の方が小さいと判定されなかった場合(S215でNo)、最小モデル量の更新は行われない。
全てのモデル量総和データ317についてステップS213以降の処理が完了すると(S212でYes)、分割パターン選択部121は、当該処理の完了時点における最小モデル量に対応する分割パターンを示す情報を出力する(S217)。例えば、当該分割パターンを示す情報を表示装置105に表示させてもよいし、補助記憶装置102に記憶させてもよい。また、当該分割パターンに対応する部分クラス図データ、部分クラス図データ(部分クラステーブル、部分関係テーブル、関係図テーブル)が補助記憶装置102を記憶させてもよい。また、選択される分割パターンはモデル量の総和が最小のものに限定されなくてもよい。相対的にモデル量の総和が小さい数件の分割パターンを分割候補として提示し、いずれの分割パターンを採用するかはユーザに選択させるようにしてもよい。そうすることにより、ユーザの都合をも勘案した分割パターンに基づいて、全体クラス図510の分割を行うことができる。
続いて、図29のステップS214の詳細について説明する。図30は、二つのモデル量総和データの比較処理の処理手順を説明するためのフローチャートである。
ステップS601において、モデル量比較部122は、比較される二つのモデル量総和データ317の入力を受け付ける。ここでは、一方をモデル量総和データAと呼び、他方をモデル量総和データBと呼ぶ。続いて、モデル量比較部122は、モデル量総和データA及びBの双方について、各要素(各項)を次数の降順にソートする(S602)。続いて、モデル量比較部122は、変数kの値を1に初期化する(S603)。変数kは、二つのモデル量総和データ317の間で比較対象とする要素を示す変数である。
続いて、モデル量比較部122は、モデル量総和データAにおけるk番目の要素の有無を確認する(S604)。モデル量総和データAにk番目の要素が有る場合(S604でYes)、モデル量比較部122は、モデル量総和データBにおけるk番目の要素の有無を確認する(S605)。モデル量総和データBにk番目の要素が無い場合(S605でNo)、モデル量比較部122は、モデル量総和データBの方が小さいと判定し、判定結果を分割パターン選択部121に通知する(S606)。
モデル量総和データBにk番目の要素が有る場合(S605でYes)、モデル量比較部122は、二つのモデル量総和データ317のk番目の要素について比較を行う。以下の説明における次数又は係数は、k番目の要素に関するものである。
モデル量総和データBの次数の方がモデル量総和データAの次数より小さい場合(S607でYes)、モデル量比較部122は、モデル量総和データBの方が小さいと判定し、判定結果を分割パターン選択部121に通知する(S608)。モデル量総和データAの次数の方がモデル量総和データAの次数より小さい場合(S609でYes)、モデル量比較部122は、モデル量総和データAの方が小さいと判定し、判定結果を分割パターン選択部121に通知する(S610)。
双方のモデル量総和データ317の次数が等しい場合(S609でNo)、モデル量比較部122は係数を比較する。すなわち、モデル量総和データBの係数の方がモデル量総和データAの係数より小さい場合(S611でYes)、モデル量比較部122は、モデル量総和データBの方が小さいと判定し、判定結果を分割パターン選択部121に通知する(S612)。モデル量総和データAの係数の方がモデル量総和データAの係数より小さい場合(S613でYes)、モデル量比較部122は、モデル量総和データAの方が小さいと判定し、判定結果を分割パターン選択部121に通知する(S614)。
双方のモデル量総和データ317の係数も等しい場合(S613でNo)、モデル量比較部122は、変数kの値をインクリメントし、次の要素(項)を処理対象とする(S615)。
また、モデル量総和データAにk番目の要素が無い場合(S604でNo)、モデル量比較部122は、モデル量総和データBにおけるk番目の要素の有無を確認する(S616)。モデル量総和データBにk番目の要素が有る場合(S616でYes)、モデル量比較部122は、モデル量総和データAの方が小さいと判定し、判定結果を分割パターン選択部121に通知する(S617)。モデル量総和データBもk番目の要素が無い場合(S616でNo)、モデル量比較部122は、双方のモデル量総和データ317は等しいと判定し、判定結果を分割パターン選択部121に通知する(S618)。
例えば、図26の分割パターンのモデル量総和データ317の要素を次数で降順にソートすると、2n3、3n、4となる。また、図28の分割パターンのモデル量総和データ317の要素を次数で降順にソートすると、2n2、3n、4となる。二つのモデル量総和データ317の1番目の要素の次数は図28の分割パターンの方が小さい。したがって、この場合、図28の分割パターンのモデル量総和データ317の方が小さいと判定される。このように、本実施の形態では、nを十分大きくしたときにおいてモデル量総和データ317の大小関係が比較される。
なお、モデル量が整数によって表現されている場合は、二つのモデル量総和データ317の比較は、単純に整数の大小の判定に基づいて行えばよい。
続いて、より複雑な全体クラス図について、クラス図分割支援装置10による分割の具体例を示す。図31は、より複雑な全体クラス図の例を示す図である。同図には、各クラスとクラス間の関係とが全体クラス図610として示されている。全体クラス図610において、分割点となりうる関係は、分割点P11〜P34として示されている。分割点P11〜P34のベキ集合の要素の中で、クラス図610を二分割できるものが分割線とされる。また、分割数−1個分の分割線の組み合わせが分割パターンとされる。
ここでは、クラス図610を2分割する例について示す。したがって、1つの分割線によって1つの分割パターンが形成される。なお、クラス図610において、画面クラス611が基準クラス図であるとする。
図32は、一部の分割パターンのそれぞれのモデル量の総和を示す図である。同図には、クラス図610に対する一部の分割パターンごとに、モデル量の総和が示されている。分割パターンの表記において、一つの()は、一つの分割線を示す。()内の記号は、分割線を形成する分割点を示す。同図に示される分割パターンの中では、分割パターン4(4は識別番号)のモデル量の総和が最小である。したがって、同図の中では分割パターン4が選択される。
図33は、分割パターン4による分割例を示す図である。同図に示されるように、分割パターン4の場合、全体クラス図610は、部分クラス図651と部分クラス図652とに分割される。また、部分クラス図651と部分クラス図652との関係を保持するための関係クラス図653が生成される。
上述したように、本実施の形態によれば、クラス図を分割可能な複数のパターン(分割パターン)の中で、モデル量の総和が最小となるものが適切な分割パターンとして選択される。ここで、モデル量は、多重度に基づいて算出される値であり、多重度がnの関係先クラスのモデル量は、関係元クラスのモデル量に対してnを乗じた値となる。したがって、多重度が1対nの関係がm段階に形成された場合、末端のクラスのモデル量はnmとなる。すなわち、nの値が十分大きいと仮定すれば、クラス図の分割において、1対nの関係や多段階の関係を解消することでモデル量の総和を小さくすることができる。このことは、結果としてモデル量の総和が最小となる分割パターンによって分割された各部分クラス図のモデル量の差は、他の分割パターンの場合に比べて小さくなることを意味する。そして、モデル量はインスタンス数を推定する値であることに鑑みれば、モデル量の総和が最小となる分割パターンによって分割された各クラス図に基づいて作成される各インスタンス図において、インスタンス数は略均等に配分される可能性が高いといえる。
以上、本発明の実施例について詳述したが、本発明は斯かる特定の実施形態に限定されるものではなく、特許請求の範囲に記載された本発明の要旨の範囲内において、種々の変形・変更が可能である。
以上の説明に関し、更に以下の項を開示する。
(付記1)
コンピュータが実行するクラス図分割支援方法であって、
クラス図のクラス間の関係ごとに関係元及び関係先のクラスの識別子、関係の多重度を示す関係情報を記憶した関係情報記憶手段を用いて、前記関係を前記クラス図の分割点とする分割パターンごとに、分割された各部分クラス図内の関係において基準となる基準クラスを判定する基準クラス判定手順と、
前記分割パターンごとに、各部分クラス図内の各クラスのインスタンス数の推定量を、前記基準クラスから当該クラスまでに係る各関係の多重度に基づいて、該基準クラスのインスタンス数の推定量を所定値として算出する推定量算出手順と、
前記分割パターンごとに、算出された前記推定量の総和を算出する総和算出手順と、
前記推定量の総和が相対的に小さい分割パターンを選択する選択手順とを有するクラス図分割支援方法。
(付記2)
前記推定量算出手順は、関係元のクラスの前記推定量に関係先のクラスの多重度を乗じた値を該関係先のクラスの前記推定量とする付記1記載のクラス図分割支援方法。
(付記3)
前記推定量算出手順は、前記多重度が不定値のときは、該多重度の関数として前記推定量を算出し、
前記選択手順は、前記多重度の次数が相対的に小さい分割パターンを選択する付記1又は2記載のクラス図分割支援方法。
(付記4)
一つ以上の前記分割点の組み合わせついて、前記クラス図を二分割可能か否かを判定する判定手順と、
二分割可能な前記分割点の組み合わせを分割線とし、前記分割線の組み合わせによって分割パターンが形成される付記1乃至3いずれか一項記載のクラス図分割支援方法。
(付記5)
前記関係情報は、関係の種別を含み、
分割対象となる関係を前記種別に基づいて判定可能な分割規則情報を記憶した分割記憶情報記憶手段に基づいて分割対象とされる関係を前記分割点とする付記1乃至4いずれか一項記載のクラス図分割支援方法。
(付記6)
前記分割規則情報において、継承関係は分割対象とされない付記5記載のクラス図分割支援方法。
(付記7)
クラス図のクラス間の関係ごとに関係元及び関係先のクラスの識別子、関係の多重度を示す関係情報を記憶した関係情報記憶手段と、
前記関係を前記クラス図の分割点とする分割パターンごとに、分割された各部分クラス図内の関係において基準となる基準クラスを前記関係情報に基づいて判定する基準クラス判定手段と、
前記分割パターンごとに、各部分クラス図内の各クラスのインスタンス数の推定量を、前記基準クラスから当該クラスまでに係る各関係の多重度に基づいて、該基準クラスのインスタンス数の推定量を所定値として算出する推定量算出手段と、
前記分割パターンごとに、算出された前記推定量の総和を算出する総和算出手段と、
前記推定量の総和が相対的に小さい分割パターンを選択する選択手段とを有するクラス図分割支援装置。
(付記8)
コンピュータに、
クラス図のクラス間の関係ごとに関係元及び関係先のクラスの識別子、関係の多重度を示す関係情報を記憶した関係情報記憶手段を用いて、前記関係を前記クラス図の分割点とする分割パターンごとに、分割された各部分クラス図内の関係において基準となる基準クラスを判定する基準クラス判定手順と、
前記分割パターンごとに、各部分クラス図内の各クラスのインスタンス数の推定量を、前記基準クラスから当該クラスまでに係る各関係の多重度に基づいて、該基準クラスのインスタンス数の推定量を所定値として算出する推定量算出手順と、
前記分割パターンごとに、算出された前記推定量の総和を算出する総和算出手順と、
前記推定量の総和が相対的に小さい分割パターンを選択する選択手順とを実行させるためのプログラム。