(57)【特許請求の範囲】
【請求項１】
オブジェクト指向プログラムにおけるクラスを定義する設計ドキュメントであるクラス図からプログラムの全部または一部を自動生成することにより，オブジェクト指向プログラムの開発をコンピュータを利用して支援するプログラム作成支援装置において，
前記クラス図を解析し，クラス図の論理情報を抽出する論理情報抽出手段と，
変更する前のクラス図および変更後のクラス図から抽出したそれぞれのクラス図の論理情報の差分情報を，木構造で表される各論理情報の木構造マッチングによって抽出する差分抽出手段と，
変更する前のクラス図から生成され編集されたオブジェクト指向プログラムから抽出したプログラム論理情報を前記差分情報を用いて変更し，新たなプログラム論理情報を生成する論理情報更新手段と，
前記新たなプログラム論理情報からオブジェクト指向プログラムを生成するプログラム生成手段とを備える
ことを特徴とするプログラム作成支援装置。
【請求項２】
オブジェクト指向プログラムにおけるクラスを定義する設計ドキュメントであるクラス図からプログラムの全部または一部を自動生成することにより，オブジェクト指向プログラムの開発を支援するプログラム作成支援装置のコンピュータに実行させるためのプログラムを格納した記憶媒体であって，
前記コンピュータを，
前記クラス図を解析し，クラス図の論理情報を抽出する論理情報抽出手段と，
変更する前のクラス図および変更後のクラス図から抽出したそれぞれのクラス図の論理情報の差分情報を，木構造で表される各論理情報の木構造マッチングによって抽出する差分抽出手段と，
変更する前のクラス図から生成され編集されたオブジェクト指向プログラムから抽出したプログラム論理情報を前記差分情報を用いて変更し，新たなプログラム論理情報を生成する論理情報更新手段と，
前記新たなプログラム論理情報からオブジェクト指向プログラムを生成するプログラム生成手段として
機能させるためのプログラム作成支援装置のプログラムを格納したコンピュータ読み取り可能な記憶媒体。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は，オブジェクト指向プログラム等の開発をコンピュータを利用して支援するプログラム作成支援装置およびそのプログラム記憶媒体に関する。
【０００２】
【従来の技術】
オブジェクト指向プログラムの開発において，設計ドキュメントの一つであるクラス図からプログラムを大まかに自動生成し，その後に開発者が自動生成されたプログラムに手を加えて，目的とする実働可能（意図した仕様を満足する）プログラムを作成するという装置がある。例えば，米国 Interactive Development Environment社のSoftware through Pictures ，米国 Rational 社のRational Rose 等が，このようなオブジェクト指向プログラム作成支援装置を実現するソフトウェア製品である。
【０００３】
これらの従来の装置では，プログラム中の自動生成された部分（以下，「自動生成部分」という）と開発者が手入力で追加した部分（以下，「追加部分」という）との区別を，プログラム中に特殊コメントを埋め込むという方法で行っている。
【０００４】
図１６は，従来技術を説明するための図である。
例えば，新しくオブジェクト指向プログラムを開発する場合には，図１６（Ａ）に示すように，まず設計ドキュメントとして，クラスおよび各クラスの関係を定義したクラス図５０を作成し，これをオブジェクト指向プログラム作成支援装置に入力する。オブジェクト指向プログラム作成支援装置は，論理情報抽出部６０によってクラス図５０を解析し，これから論理情報を抽出する。次にプログラム生成部７０では，論理情報抽出部６０が抽出した論理情報をプログラムの論理情報（以下，「プログラム論理情報」という）に変換し，これをもとにプログラム８０を自動生成する。
【０００５】
この自動生成されたプログラム８０は，通常，プログラムの大まかな枠組みのようなものであり，このままでは完全なものではない。そこで，不足している部分については，プログラム開発者が手入力により追加編集し，実働可能プログラムとする。図中の編集後プログラム８１の例では，「ＸＸＸ」，「ＹＹＹ」のテキストがエディタ等を用いて加えられている。
【０００６】
ところで，一般にプログラム開発では一度で開発が終了することはなく，多くの場合，バグの修正や機能変更・機能拡張などにより，開発したプログラムの変更が必要になる。例えば，図１６（Ｂ）に示すように，クラス図５０を機能変更等のために変更後クラス図５１に変更した場合，これをもとに同様に論理情報抽出部６０，プログラム生成部７０によってプログラムを自動生成すると，新たに生成されたプログラム８２では，プログラム８０に対して手入力で追加編集した「ＸＸＸ」，「ＹＹＹ」の情報は，失われてしまうことになる。
【０００７】
このようなプログラムの変更時における情報の喪失を防止するため，従来技術では，例えば図１６（Ｃ）に示すように，元のプログラム８０に対して追加・変更した部分については，その部分について特殊コメント（図の例では「//##保護開始」と「//##保護終了」）を付け，その編集後プログラム８３をプログラム生成部７０が参照して，自動生成部分と追加部分とを区別し，追加部分を残した形で新たなプログラム８４を生成するようにしている。
【０００８】
図１７は，従来技術による編集後プログラムの例を示す。図１７において，特殊コメント「//## begin Person:: ・・・」および「//## end Person:: ・・・」で囲まれた部分は「追加部分」を示している。
【０００９】
「追加部分」は，このような「preserve=yes」という記述を含む特殊コメントで保護されており，クラス図が変更された場合に，変更したクラス図をもとにプログラムを再度自動生成しても，特殊コメントで保護された「追加部分」は，そのまま新しいプログラム中に出力されるようになっている。
【００１０】
【発明が解決しようとする課題】
しかし，従来のような，プログラム中の自動生成部分と追加部分とを特殊コメントにより区別する方法には，以下のような問題点がある。
【００１１】
１）プログラム編集時の危険性
プログラム編集時に，誤って特殊コメントを変更もしくは削除してしまうと，プログラムの自動生成機構が自動生成部分と追加部分とを区別できなくなる。その結果，追加部分が失われてしまうという危険性がある。
【００１２】
２）生成されたプログラムの読解性と保守性
現実の利用では，プログラム中の特殊コメントはおびただしい量になる。このため，このような方法で作成されたプログラムは，読解性や保守性が低下するという問題がある。
【００１３】
本発明は，従来方法では特殊コメントにより行っていた自動生成部分と追加部分との区別を，特殊コメントなしで行うことができる新しい技術を提供し，プログラム編集時の安全性，および読解性や保守性に優れたプログラムの生成を保証することを目的とする。
【００１４】
【課題を解決するための手段】
図１は，本発明の原理説明図である。
図１において，設計ドキュメント２０は，オブジェクト指向プログラムにおけるクラスを定義するクラス図であって，プログラムを自動生成するための情報を定義するものである。設計ドキュメント２０は，開発者が設計ドキュメントエディタ（クラス図エディタ等）を用いて作成する。変更後設計ドキュメント２１は，設計ドキュメント２０を修正や機能変更などのために設計ドキュメントエディタにより変更したものである。
【００１５】
プログラム２２は，設計ドキュメント２０から論理情報更新部５，プログラム生成部６等によって自動生成されたオブジェクト指向プログラムであり，編集後プログラム２３は，設計ドキュメント２０に基づいて自動生成されたプログラム２２に，開発者による追加部分が加えられたオブジェクト指向プログラムである。
【００１６】
変更後設計ドキュメント２１から変更後のプログラム２４を自動生成するときに本発明が用いられる。
論理情報抽出部１は，クラス図等の設計ドキュメント２０および変更後設計ドキュメント２１を解析し，設計ドキュメント中に混在する論理情報，レイアウト情報等から論理情報（ｄ１，ｄ２）を抽出する手段である。
【００１７】
差分抽出部２は，設計ドキュメント２０の論理情報ｄ１と変更後設計ドキュメント２１の論理情報ｄ２との差分情報ｄを抽出する手段である。設計ドキュメント２０の論理情報ｄ１は，もし以前に論理情報抽出部１から抽出したものを論理情報管理部４に保存していたならば，それを使用することができる。
【００１８】
プログラム論理情報抽出部３は，編集後プログラム２３からプログラム論理情報ｐ１を抽出する手段である。
論理情報管理部４は，論理情報抽出部１によって抽出した論理情報ｄ１等を，後のプログラム改訂時における差分抽出処理で使用できるようにするために保存しておく手段である。
【００１９】
論理情報更新部５は，差分情報ｄを参照して，プログラム論理情報ｐ１と差分情報ｄから得られるプログラム論理情報とをマージし，新たなプログラム論理情報ｐ２を生成する手段である。
【００２０】
プログラム生成部６は，プログラム論理情報ｐ２に基づいてプログラムを自動生成する手段である。
本発明の作用は以下のとおりである。
【００２１】
論理情報抽出部１で，設計ドキュメント２０および変更後設計ドキュメント２１からそれぞれ論理情報ｄ１，ｄ２を抽出すると，差分抽出部２で，これらの論理情報の木構造マッチングを行い，差分情報ｄを生成する。一方，プログラム論理情報抽出部３では，編集後プログラム２３からプログラム論理情報ｐ１を抽出する。
【００２２】
論理情報更新部５では，差分抽出部２で得た差分情報ｄをもとに，プログラム論理情報ｐ１を更新し，プログラム論理情報ｐ２を生成する。このプログラム論理情報ｐ２は，実質的に，変更後設計ドキュメント２１から抽出した論理情報ｄ２と編集後プログラム２３に含まれる追加部分の情報とを組み合わせたものとなる。
【００２３】
プログラム生成部６は，このプログラム論理情報ｐ２に基づいて変更後のプログラム２４を生成するので，編集後プログラム２３の追加部分を失わずに，変更後設計ドキュメント２１から新しい変更後のプログラム２４が自動生成されることになる。
【００２４】
【発明の実施の形態】
以下，最近よく用いられているＪａｖａ言語によるオブジェクト指向プログラムの自動生成を例に，図２〜図１２を用いて本発明の実施の形態を説明する。
【００２５】
図２は，新規プログラム作成時の処理動作の説明図である。
最初に，クラス図エディタ等で作成されたクラス図３０を入力する（ａ）。
図３は，入力されるクラス図の例を示す。図３のクラス図３０はＵＭＬ表記法により表わしたものであり，オブジェクトとして一つのクラス（Person）を持ち，このクラスは四つのデータメンバと二つのメンバ関数を持つことを示している。
【００２６】
論理情報抽出部１１は，クラス図３０の中に混在する様々な情報を解析して論理情報Ａ１を抽出し，論理情報Ａ１を差分抽出部１２に渡す（ｂ）。差分抽出部１２は，新規プログラム作成の場合には，論理情報Ａ１をそのまま論理情報更新部１５に渡す。また，クラス図３０の変更によるプログラムの改訂の際に使用できるようにするために，抽出した論理情報Ａ１を論理情報管理部１４に保存する。論理情報とは，クラス図の論理構造や構成要素等に関する情報である。図４は，図３に示すクラス図に記述されている情報を示すオブジェクトモデルの図である。
【００２７】
論理情報更新部１５では，論理情報Ａ１をプログラム論理情報Ｐに変換する（ｃ）。プログラム生成部１６では，プログラム論理情報Ｐからプログラム３１を自動生成し（ｄ），プログラムのソースファイルとして出力する。
【００２８】
図５は，図３に示すクラス図から自動生成されたプログラムの例を示す。
この図５に示すプログラムは，オブジェクト指向言語の一つであるＪａｖａ言語により記述されたものである。ここでは，メンバ関数ｐｅｒｓｏｎ，ｐｒｉｎｔの内容が定まっていないので，開発者は，これらの関数の内容を手入力により記述する。
【００２９】
図６は，開発者により追加部分を加えた編集後プログラムの例を示す。メンバ関数ｐｅｒｓｏｎおよびｐｒｉｎｔの動作部分の記述が追加されている。
図７は，図６に示す編集後プログラムの記述内容をオブジェクトモデルとして示す図である。図７のオブジェクトモデルでは，プログラムのメンバ関数ｐｅｒｓｏｎおよびｐｒｉｎｔの追加部分に対応して，これらのメンバ関数の動作部分を表す「ｐｅｒｓｏｎ＿ｂｏｄｙ」，「ｐｒｉｎｔ＿ｂｏｄｙ」が追加されている。
【００３０】
図８は，プログラム改訂時の処理動作を説明する図である。
開発者は，図２で説明したようにして図３に示すクラス図から自動生成されたプログラム３１（図５）に，関数や変数の内容等の追加部分を加えるなどの編集を行う。この結果が前述した図６の編集後プログラムである。例えば図８のクラス図３０は，図３に示すクラス図であり，編集後プログラム３３は，図６の編集後プログラムである。
【００３１】
さらに，図２において説明したクラス図を，機能変更等のためにプログラムの編集とは別の変更を行った場合には，以下のようにプログラム改訂の処理を行う。
【００３２】
変更前のクラス図３０から抽出した論理情報Ａ１を，論理情報管理部１４から取り出して差分抽出部１２に渡す（ｅ）。なお，変更前のクラス図３０の論理情報Ａ１を論理情報管理部１４に保存していない場合には，論理情報抽出部１１によりクラス図３０を解析して論理情報Ａ１を抽出し，差分抽出部１２に渡す。
【００３３】
また，変更後のクラス図３２を入力して（ｆ），論理情報抽出部１１により論理情報Ａ２を抽出する（ｇ）。抽出した論理情報Ａ２は，後のプログラム改訂時のために必要に応じて論理情報管理部１４に保存する。
【００３４】
図９は，変更後のクラス図の例を示す。図９は，図３のクラス図に「名前を設定する」というメンバ関数ｓｅｔ＿ｎａｍｅを追加したものである。図１０は，図９に示す変更後のクラス図のオブジェクトモデルを示す。図１０のオブジェクトモデルには，図４に示すオブジェクトモデルにメンバ関数ｓｅｔ＿ｎａｍｅの論理構造が追加されている。
【００３５】
論理情報抽出部１１が抽出した論理情報Ａ２は，差分抽出部１２に渡され，差分抽出部１２では，論理情報Ａ１と論理情報Ａ２との変更点（差分）を論理構造の形で差分情報Ａとして抽出する（ｈ）。
【００３６】
一方，編集後プログラム３３（図６）を入力して（ｉ），プログラム論理情報抽出部１３により，プログラムの論理情報Ｂを抽出し，論理情報更新部１５に渡す（ｊ）。この論理情報Ｂは，図７のオブジェクトモデルで表されるような論理構造に関する情報である。
【００３７】
論理情報更新部１５では，差分情報Ａに基づき，論理情報Ｂを用いてプログラムの論理構造を改訂して新しいプログラム論理情報Ｂ′を生成する（ｋ）。すなわち，差分情報Ａと論理情報Ｂとの対応関係を調べることによって，自動生成部分と開発者の編集による追加部分とを区別することができるので，プログラム論理情報Ｂにおける元の自動生成部分で変更が必要な部分を，追加部分を残した形で，差分情報Ａから得られるプログラム論理情報によって改訂する。
【００３８】
図１１は，新たなプログラム論理情報Ｂ′をオブジェクトモデルの形式で示した図である。図１１に示すように，開発者による追加部分である「ｐｅｒｓｏｎ＿ｂｏｄｙ」，「ｐｒｉｎｔ＿ｂｏｄｙ」と，クラス図の変更により追加された部分「ｓｅｔ＿ｎａｍｅ」とが，最初の図４のオブジェクトモデルに対して追加されたものとなっている。
【００３９】
プログラム生成部１６では，プログラム論理情報Ｂ′から変更後のプログラム３４を自動生成する（ｌ）。なお，プログラム論理情報Ｂ′から変更後のプログラム３４を自動生成する処理自体は従来と同様でよく，既知の技術である。
【００４０】
図１２は，生成された変更後のプログラムの例を示す。図１２に示すプログラムは，開発者による追加部分とクラス図の変更により追加された部分とがマージされている。これにより，変更したクラス図の論理情報が編集後プログラムに反映され，新たな改訂後のプログラムが自動生成されたことが分かる。
【００４１】
図１２に示すプログラムは，図１７に示す従来技術による編集後プログラムにより生成するプログラムに比べて，改訂に必要な情報を記述する特殊コメント（//##…preserve=yes…等）がないことから誤変更が防止され，また，読解性に優れていることは明らかである。
【００４２】
図３および図１３〜図１５を用いて，本発明の実施の形態における処理の流れを説明する。
図１３は，全体の処理フローチャートである。
【００４３】
変更前の設計ドキュメント（クラス図３０）の論理情報Ａ１を論理情報管理部１４から取り出す（Ｓ１）。また，論理情報抽出部１１により，変更後の設計ドキュメント（変更後のクラス図３２）から論理情報Ａ２を抽出する（Ｓ２）。差分抽出部１２により，論理情報Ａ１と論理情報Ａ２との差分情報Ａを抽出する（Ｓ３）。
【００４４】
一方，プログラム論理情報抽出部１３により，編集後プログラム３３からプログラム論理情報Ｂを抽出する（Ｓ４）。差分情報Ａをもとにプログラム論理情報Ｂを更新してプログラム論理情報Ｂ′とし（Ｓ５），プログラム生成部１６により，プログラム論理情報Ｂ′をもとに変更後のプログラム３４を生成する（Ｓ６）。
【００４５】
図１４は，差分情報抽出処理の処理フローチャートである。
差分抽出部１２による差分情報抽出処理（図１３のステップＳ３の処理）は，木探索のアルゴリズムにより行う。
【００４６】
ステップＳ１０１では，空の木Ａを作成する。
ステップＳ１０２では，論理情報Ａ１と論理情報Ａ２の根を照合する。
ステップＳ１０３では，論理情報Ａ１と論理情報Ａ２の根が一致したかどうかを判定する。一致した場合にはステップＳ１０４の処理へ進み，一致しない場合には処理を終了する。
【００４７】
ステップＳ１０４では，論理情報Ａ１の部分木を一つ取り出し，その根をａ１とする。
ステップＳ１０５では，ａ１をＡに付加しａ１′とする。
【００４８】
ステップＳ１０６では，ａ１はＡ２の部分木に存在するかどうかを判定する。ａ１がＡ２の部分木に存在する場合にはステップＳ１０８の処理へ進み，ａ１がＡ２の部分木に存在しない場合にはステップＳ１０７の処理へ進む。
【００４９】
ステップＳ１０７では，ａ１′に「新規」のフラグを立てる。
ステップＳ１０８では，論理情報Ａ２の部分木を一つ取り出し，その根をａ２とする。
【００５０】
ステップＳ１０９では，ａ２をＡに付加し，ａ２′とする。
ステップＳ１１０では，ａ２はＡ１の部分木に存在するかどうかを判定する。ａ２がＡ１の部分木に存在する場合にはステップＳ１１２の処理へ進み，ａ２がＡ１の部分木に存在しない場合にはステップＳ１１１の処理へ進む。
【００５１】
ステップＳ１１１では，ａ２′に「削除」のフラグを立てる。
ステップＳ１１２では，ａ１から始まる木をＡ１，ａ２から始まる木をＡ２として，「開始２」からの再帰的処理により論理情報の差分を抽出する。すなわち，このステップＳ１１２は，「開始２」よりステップＳ１０２以降の処理を再帰的に呼び出すことにより実行する。
【００５２】
ステップＳ１１３では，Ａ２の部分木をすべて処理したかどうかを判定する。Ａ２の部分木をすべて処理した場合には，ステップＳ１１４の処理へ進み，Ａ２にまだ処理していない部分木がある場合には，ステップＳ１０８の処理へ戻って同様に処理を繰り返す。
【００５３】
ステップＳ１１４では，Ａ１の部分木をすべて処理したかどうかを判定する。Ａ１の部分木をすべて処理した場合には，差分情報抽出処理を終了し，Ａ１にまだ処理していない部分木がある場合には，ステップＳ１０４の処理へ戻る。
【００５４】
図１５は，プログラムの論理情報更新処理の処理フローチャートである。
論理情報更新部１５によるプログラム論理情報更新処理（図１３のステップＳ５の処理）は，木探索のアルゴリズムにより行う。
【００５５】
ステップＳ２０１では，差分情報Ａと論理情報Ｂの根を照合する。
ステップＳ２０２では，差分情報Ａと論理情報Ｂの根が一致したかどうかを判定する。一致している場合にはステップＳ２０３の処理を進み，一致していない場合には処理を終了する。
【００５６】
ステップＳ２０３では，Ａの部分木を一つ取り出し，その根をａとする。
ステップＳ２０４では，ａに「新規」のフラグが立っているかどうかを判定する。ａに「新規」のフラグが立っている場合にはステップＳ２１０の処理へ進み，ａに「新規」のフラグが立っていない場合にはステップＳ２０５の処理へ進む。
【００５７】
ステップＳ２０５では，Ｂの部分木を一つ取り出し，その根をｂとする。
ステップＳ２０６では，ａとｂとを照合する。
ステップＳ２０７では，ａとｂとが一致したかどうかを判定する。一致した場合にはステップＳ２０８の処理へ進み，一致しない場合にはステップＳ２１２の処理へ進む。
【００５８】
ステップＳ２０８では，ａに「削除」のフラグが立っているかどうかを判定する。ａに「削除」のフラグが立っている場合にはステップＳ２０９の処理へ進み，ａに「削除」のフラグが立っていない場合にはステップＳ２１１の処理へ進む。
【００５９】
ステップＳ２０９では，ｂに「無効」のフラグを立て，ステップＳ２１１の処理へ進む。
ステップＳ２１０では，ａを根とする部分木をＢに付加する。
【００６０】
ステップＳ２１１では，ａから始まる木をＡ，ｂから始まる木をＢとして，「開始（ステップＳ２０１）」からの再帰的処理により論理情報を更新する。
ステップＳ２１２では，Ｂの部分木をすべて処理したかどうかを判定する。Ｂの部分木をすべて処理した場合には，ステップＳ２１３の処理へ進み，Ｂにまだ処理していない部分木がある場合には，ステップＳ２０５の処理へ戻る。
【００６１】
ステップＳ２１３では，Ａの部分木をすべて処理したかどうかを判定する。Ａの部分木をすべて処理した場合には，処理を終了し，Ａにまだ処理していない部分木がある場合には，ステップＳ２０３の処理へ戻って，同様に処理を繰り返す。
【００６２】
なお，論理情報抽出部１１，プログラム論理情報抽出部１３およびプログラム生成部１６の処理の流れについては，従来技術により既知であるため，ここでの詳しい説明は省略する。
【００６３】
【発明の効果】
以上説明したように，本発明によれば，クラス図からのプログラム自動生成において，プログラム生成後に独立してプログラムを編集・変更したような場合に，従来技術の問題点であった追加部分の消失の危険性をなくし，さらに，特殊コメント等の必要がないので，生成されたプログラムの読解性および保守性を高めることができるようになる。
【図面の簡単な説明】
【図１】本発明の原理説明図である。
【図２】新規プログラム作成時の処理動作を説明する図である。
【図３】クラス図の例を示す図である。
【図４】図３に示すクラス図に記述されている情報を示すオブジェクトモデルの図である。
【図５】自動生成されたプログラム例を示す図である。
【図６】編集後プログラムの例を示す図である。
【図７】図６に示すプログラムのオブジェクトモデルを示す図である。
【図８】プログラム改訂時の処理動作を説明する図である。
【図９】変更後のクラス図の例を示す図である。
【図１０】図９に示すクラス図のオブジェクトモデルを示す図である。
【図１１】論理情報更新部により改訂された論理情報のオブジェクトモデルを示す図である。
【図１２】生成されたプログラム例を示す図である。
【図１３】本発明の実施の形態における全体の処理フローチャートである。
【図１４】本発明の実施の形態における差分情報抽出処理の処理フローチャートである。
【図１５】本発明の実施の形態におけるプログラム論理情報更新処理の処理フローチャートである。
【図１６】従来技術を説明するための図である。
【図１７】従来技術による編集後プログラムの例を示す図である。
【符号の説明】
１  論理情報抽出部
２  差分抽出部
３  プログラム論理情報抽出部
４  論理情報管理部
５  論理情報更新部
６  プログラム生成部
２０  設計ドキュメント
２１  変更後設計ドキュメント
２２  プログラム
２３  編集後プログラム
２４  変更後のプログラム
【図１】
0003847932.tif 000002
【図２】
0003847932.tif 000003
【図３】
0003847932.tif 000004
【図４】
0003847932.tif 000005
【図５】
0003847932.tif 000006
【図６】
0003847932.tif 000007
【図７】
0003847932.tif 000008
【図８】
0003847932.tif 000009
【図９】
0003847932.tif 000010
【図１０】
0003847932.tif 000011
【図１１】
0003847932.tif 000012
【図１２】
0003847932.tif 000013
【図１３】
0003847932.tif 000014
【図１４】
0003847932.tif 000015
【図１５】
0003847932.tif 000016
【図１６】
0003847932.tif 000017
【図１７】
0003847932.tif 000018