例えば証券業務などのような大規模業務系においては、従来、COBOL言語プログラムが一般に用いられている。そして保守効率を上げるために、プログラムは処理目的毎に分類され、階層化された構造を有するのが一般的である。また、プログラムが階層化された構造であることを前提とした構造解析ツール類も充実しており、これらのツールを使うことによって、効率的にシステムの保守を行うことができる。
ところで最近は、大規模業務系の再構築に当たり、使用言語をCOBOLからJavaに置き換える例が増えている。
COBOL言語に比べて、Java言語は生産性、拡張性及び適用性に優れているため、オープンシステムの開発用に広く用いられているが、保守作業効率において後述のような様々な問題があるため、非常に限られた条件の中でしか使用されていないのが実状である。
以下、まずJava言語の概要について述べ、次に大規模業務システムの開発にJava言語プログラムを用いた場合の課題について述べる。
(1)Java言語の概要
Java言語のプログラムは、複数のクラスの組み合わせにより成り立っている。クラスとは、データと処理とをまとめたものと言える。つまりJava言語では、関連するデータや処理をまとめたクラスという部品を作っておき、それらを自由に組み合わせたり、再利用して複雑なプログラムを作成する。クラスを構成するデータをフィールド、処理をメソッドと言い、フィールドやメソッドをクラスのメンバと称する。
クラスはプログラムコードであり、これを実際にコンピュータで実行するためには、オブジェクトを生成しなければならない。オブジェクトとは、プログラムコードであるクラスが、コンピュータメモリ上に実行可能な状態に存在している場合のクラスに対する呼称である。クラスからオブジェクトを生成することをインスタンス化又はオブジェクト化という。
フィールドとは、クラス内の変数(データ)であり、メソッドとは、データの操作方法(処理)を定義したものである。処理の対象となる値を引数(パラメータ)といい、処理の結果の値のことを戻り値(返り値)という。
Java言語プログラムの拡張性及び適用性が優れている一つの理由は、クラスの継承という仕組みがあるからである。クラスの継承とは、クラスがほかのクラスのメンバを受け継ぐ機能である。例えば、クラスAのメンバをクラスBが受け継ぐことができる。継承する元となるクラスをスーパークラス(親クラス)、継承して作ったクラスをサブクラス(子クラス)という。
またJava言語では、クラスに対するアクセス方法を定義したインターフェースと称されるものが使用される。インターフェースはクラスと似たものであるが、定数と、後述の抽象メソッドしかメンバになれないところがクラスとは異なる。
クラスは、抽象クラスと具象クラス及びインターフェースに分類される。抽象クラスは、通常のクラスにインターフェースの機能を付加したものであり、具象クラスは、実際のプログラムコードを記述し、インスタンス化可能としたものである。インターフェースと抽象クラスは、そのままではインスタンス化することはできない。つまり、抽象クラス、具象クラス、インターフェースのうちで、オブジェクトコードを生成できるのは具象クラスのみである。
一方メソッドも、抽象メソッドと具象メソッドに分類される。抽象メソッドとは、メソッドの名前、戻り型、引数だけを定義し、ロジック(処理の内容)は定義していないものをいう。この抽象メソッドはインターフェースと、抽象クラスにおいて定義される。具象メソッドは、メソッドの名前、戻り型、引数及びロジックを定義したもので、抽象クラス又は具象クラスで定義される。参照先の具象メソッドを実装メソッド、実装メソッドを有するクラスを実装クラスと称することもある。
次に、Java言語を用いて記述されたプログラムを図1−1を用いて説明する。
図の100,300,400は具象クラス、200はインターフェースの一例を示す。具象クラス100は、Userclassという名前を有する。そのクラスは、usrmdtというメソッドを有する。そのメソッドは、参照先がIStrategyというインターフェースであることを示している。
一方、インターフェース200は、IStrategyという名称を有し、tcという抽象メソッドを含んでいる。
また具象クラス300は、classAという名称を有し、tcという具象メソッドを有する。具象クラス300はオブジェクトを生成しているので実装クラスと称される。具象クラス100は、インターフェース200を介して別の具象クラス300と関連付けられるので、本明細書では、100を関連元クラス、300を関連先クラスという。
図1−2は、図1−1のように記述されたプログラムのクラス間の関係を表わすクラス図である。クラス100はインターフェース200を参照し、クラス300はクラス400を参照している。また、クラス300はインターフェース200を継承しているので、500で示す記号を用いて表示される。
図1−3は、オブジェクト同士の関係を示すシーケンス図である。前述のように、具象クラス、抽象クラス及びインターフェースのうちでオブジェクトを生成できるのは具象クラスだけである。この図は、クラス100,300,400のオブジェクト100´,300´,400´の関係を示している。クラス100,300,400のオブジェクトは一般に、別のクラスにより生成される。各オブジェクト100´,300´,400´を生成しているクラスを生成クラスと称し、クラス100,300,400を被生成クラスと称する。
次に、一つのクラスに含まれる情報について説明する。
図1−4は、一つのクラスに含まれる情報とその関連を示す図である。1つのクラスには、クラス情報10、メソッド情報20、データ情報60及びメソッド間の関連を示す情報30が含まれる。
クラス情報10には、クラスID11、クラス名12、スーパークラス名(親クラス名)13、インターフェース名14が含まれる。また、メソッド情報20には、メソッドID21、メソッド名22、メソッドの型(具象タイプ、抽象タイプ)23、引数24及び引数の型25の情報が含まれる。
メソッド間関連情報30としては、メソッド21が参照するメソッド31、参照するメソッドのメソッド名32、参照メソッドの引数のタイプ33が含まれる。参照先メソッド31は、static修飾子のついたメソッド34、インターフェースのメソッド35、コンストラクタという特殊なメソッド36及びその他のメソッド37の4種類に分類される。コンストラクタはオブジェクトの生成のときに自動的に呼び出されるメソッドであり、staticメソッドは、どのオブジェクトでも動作を同じにする特殊なメソッドである。
インターフェース35には、インターフェース名41とメソッド型42の情報が含まれ、その他のクラス37にも同様に、参照先のクラス38とメソッドの型39の情報が含まれる。またstaticメソッド34には、参照先クラス40の情報が含まれる。
当該クラス10でオブジェクトを生成する場合は、そのオブジェクトを生成する対象となったクラス50の情報であるクラス名51が含まれる。
一方、クラス10のフィールドに関する情報60として変数名61、変数を参照する場合の参照先クラス62、変数の型63等の情報が含まれる。
(2)Java言語プログラムを大規模業務系に用いた場合の問題点
Java言語は多数のクラスの組み合わせにより成り立っているため、生産性に優れ、また、システムを拡張するのに適した言語でもある。しかしながらシステムを保守する場合には、以下説明するような数々の問題がある。
証券業務システム等の大規模事務系のプログラムにJava言語を用いると、クラス数は、例えば数万個から数10万個、メソッド数は数10万個から数100万個に達する膨大なものとなる。
このようなシステムにおいて、何らかの不具合が発生した場合は、その不具合の原因となったクラスやメソッドを特定しなければならない。また、特定されたクラスやメソッドを修正したときに、影響を受ける一連のクラスやメソッドを把握する必要もある。
また、システムに新たな機能を追加するためにクラスを追加や修正する場合も同様に、追加や修正したクラスやメソッドにより影響を受ける一連のクラスやメソッドを把握する必要がある。
このような保守業務の効率化を図るために、COBOL言語を用いた場合と同様に、Java言語を用いたプログラムも、数万〜数10万のクラスは業務の処理目的毎に分類され、階層化された構造とされるのが一般的である。そしてJavaプログラムの保守においては、図1−2に例示したクラス図や、図1−3に例示したシーケンス図を用い、これらにソースコード分析を加えることによってクラスやメソッドを特定したり、特定のクラスやメソッドと関連のある一連のクラスやメソッドを把握している。
しかしながらJava言語プログラムは、不具合の発生したクラス、メソッドを特定したり、特定したクラス、メソッドに関連性のある一連のクラス、メソッドを把握することが困難な構造を有するため、保守業務においてプログラム開発者への負担が非常に大きい。
一つの理由は、従来のツールではメソッド単位の詳細な流れを把握することはできないことによる。図1−5は、Java言語プログラムを、クラス・メソッドを単位として捉えた場合の処理の流れを例示したものである。
この図は、最上位階層のクラスC11のメソッドM2が次の階層のクラスC21のメソッドM4を参照し、クラスC21のメソッドM4が次の階層のクラスC31のメソッドM5を参照し、以下点線で示す参照関係がある例を示している。また同様に、クラスC11のメソッドM4がクラスC22のメソッドM1を参照し、クラスC22のメソッドM1がクラスC31のメソッドM5を参照している例を示している。
前述のクラス図(図1−2)は単に、クラスC11,C21,C22・・・の関連を示すだけであるため、保守業務に当たり、メソッド単位の詳細な処理の流れを調べるためには、プログラム開発者がソースコードを分析して把握せざるを得なくなる。
ここで、各クラスのIDは、C11,C21,C22・・・で表し、システムの中でユニークに(一意的に)特定できるコードが割り当てられ、各メソッドはM1,M2,M3・・・のように、各クラス内においてユニークに特定できるコードが割り当てられる。従って、クラスID+メソッドID(以下これをクラス・メソッドIDという)により、システム内の全てのメソッドをユニークに特定することができる。
それ故、システムを構成するJava言語プログラム内で実質的な処理に関与している(すなわちオブジェクトを生成している)全てのクラス・メソッドIDの関連を表すことができれば、所望のメソッドを特定したり、そのメソッドに関連する一連のクラス・メソッドを把握することができる。
本発明者は、数10万〜数100万に及ぶ全てのクラス・メソッドの中で、具象メソッドのみを抽出し、それらの関連を、クラス・メソッドIDを用いて表すことを試みた。しかし、コンピュータの能力を遥かに超える程膨大な処理になり、理論上は可能であっても、事実上は極めて困難であることが判った。その原因の一つは、Java言語では、クラスがインターフェースや抽象クラスを参照したり、クラス間の継承と呼ばれる処理が頻繁に行われることによる。
次に、継承の一例について、図1−6を用いて説明する。
図1−6は、クラス200がクラス100を継承し、クラス300がクラス200を継承する例を示している。クラス100にはクラスIDのC11と、メソッドIDのm1が定義され、クラス200にはクラスIDのC21とメソッドIDのm2が定義され、クラス300にはクラスIDのC31とメソッドIDのm3が定義されていると仮定する。ソースコードプログラム上で、このクラス・メソッドIDのC11m1,C21m2,C31m3を継承の手法を用いて記述すると、実際にはC11m1〜C31m3の6個のクラス・メソッドIDが定義されたことになる。
つまり、ソースコードプログラム上はC21m1,C31m1,C31m2は隠された状態となる。従って、全ての具象クラス・メソッドIDの関連を調べるには、このように隠されているクラス・メソッドも含めた、全てのクラス・メソッド関連を調べなければならない。
また、具象クラス同士がインターフェースや抽象クラスを介在した複雑な参照関係にある場合も、全てのクラス・メソッドの参照先を追跡して、オブジェクトの生成に関与している具象クラス・メソッドの関連を調べることが必要となる。従って、これらの隠蔽クラスも含めて、全ての具象クラス・メソッド間の関連を調べるためには膨大な処理量が発生する。しかしながら従来のツールには、クラス隠蔽及びメソッド隠蔽された箇所の分析機能がなく、また妥当な具象メソッドだけを導出する機能もないため、プログラムの保守が極めて困難になる。
また、図1−3に例示したように、オブジェクト100´,300´,400´の流れを示すシーケンス図も用いられるが、シーケンス図を作成する既存ツールは、継承関係やインターフェースが介在した関連の先を追跡した分析ができないため、シーケンス図を用いてもプログラム開発者の負担はそれ程小さくならない。
更に、従来の分析ツールはクラス図、シーケンス図を表示できるとは言え、一画面に表示できるクラス数、オブジェクト数は10数個程度が限界であり、膨大な数のクラス・メソッド関連を把握することはできないため、これもプログラムの保守を困難にする一つの理由となっている。
以下、本発明に係る分析ツールの概要をまず説明し、次にその一実施形態を図面を参照して説明する。
本発明は、具象クラス・メソッド間の関連を調べるのに、クラスIDとメソッドIDの他にオブジェクトIDという概念を導入し、これらのIDを基にして隠されたクラス及び隠蔽されたクラスも含めて、具象クラス・メソッドと、その具象クラス・メソッドが参照する具象クラス・メソッドとの関係を求めて表示できるようにしたことに基本的な特徴を有する。
本発明ツールにより、具象クラス・メソッドの関連情報を表示する手順は次のとおりである。
(1)Javaプログラムの各クラスファイルからクラス情報、メソッド情報、及び参照先メソッド情報を抽出する。
(2)抽出した情報をDBに登録する。
(3)登録された情報を基にしてオブジェクトID情報を生成する。
(4)クラスID、メソッドID及びオブジェクトIDを基にして、参照元の具象クラス・メソッドIDと、参照先の具象クラス・メソッドIDの関連情報を生成する。
(5)具象クラス・メソッドの関連情報を表示する。
以下、これらの具体的内容を順に説明する。
(1)Javaプログラムからの情報抽出
Javaプログラムから、図1−4に例示したクラス情報10、メソッド情報20及び参照先情報30を抽出するために、まずクラスファイルを生成し、次にクラスファイルを分析する。
(1.1)クラスファイル生成
クラスファイルとは、Javaソースコードプログラムを構成する各クラスをコンパイルすることにより生成されたファイルである。例えばJavaソースコードプログラムの各クラスは、図2−1に例示されるように記述されており、これをコンパイルすると、図2−2に例示されるような数字で記述されたものになる。大規模業務システムではクラスの数が数10万個に達するから、その数のクラスファイルが作成されることになる。
このクラスファイルの中には具象ファイル、抽象クラス及びインターフェースのファイルが含まれる。
(1.2)ファイル分析
次に、このクラスファイルを分析して4種類の情報を抽出する。図3−1に示すクラス情報、図3−2に示すメソッド情報、図3−3に示すスーパークラス情報、及び図3−4に示すメソッド関連情報である。
従来、ソースコードプログラムからクラス情報やメソッド情報を抽出する試みはあるが、本発明においては更にメソッド関連情報を抽出したことに一つの特徴がある。
クラス情報には、具象クラス、抽象クラス及びインターフェースのクラスID、クラス名、パッケージ名、スーパークラス名、スーパークラスパッケージ名及びクラスの種類の情報が含まれる。
パッケージとは、複数のクラスやインターフェースをひとまとめにしたものである。またスーパークラスとは、継承する元となったクラス、つまり親クラスであり、継承して作ったクラスをサブクラス(子クラス)という。クラスの種類は、そのクラスが具象クラス、抽象クラス及びインターフェースの3種類に分類する情報である。
メソッド情報には、図3−2に示すように、クラスID、メソッドID、メソッド名、引数及び戻り値の情報、コンストラクタ、メソッドの種類などの情報が含まれる。メソッドIDは、各クラスIDの中で一義的に定められるIDである。コンストラクタとは、オブジェクトの生成をするときに自動的に呼び出される特殊なメソッドである。
スーパークラス情報には、図3−3に示すように、子クラスIDと親クラス名との関係、及びクラスIDとインターフェース名との関係を表す情報が含まれる。
メソッド関連情報には、図3−4に示すように、クラスID、メソッドIDの他に、一意キーID(図3−4のレコードを一意的(ユニーク)に特定するID)、参照先のクラス名、参照先のメソッド名が含まれる。また参照先クラスが具象クラス、インターフェース、抽象クラスのいずれに属するかを示す参照先クラス情報も含まれる。
図3−5は、クラスファイルから上記のクラス情報、メソッド情報、スーパークラス情報及びメソッド関連情報を抽出するフローを示す。
ステップS401において、図2−1に例示したクラスファイルを1件読み込む。続いて、クラス項目の記述からクラス名称の情報を取り出し(S402)、更にクラス種類の情報を取り出す(S403)。
ステップS404では、extendsの項目値を全部取り出す。extendsは継承を定義する記号であり、例えば
class A extends B
という記述は、サブクラス(子クラス)Aがスーパークラス(親クラス)Bを継承したことを表す。また、インターフェースに対してextendsの記号を用いる場合は、拡張インターフェース(子インターフェース)がそのインターフェース(親インターフェース)を継承したことを表す。
ステップS405では、implements項目値を全部取り出す。implementsは実装を定義する記号であり、例えば
class C implements D
と記述すると、例えばインターフェースDをクラスCが実装することを表す。
ステップS406では、読み込んだクラスファイルのクラス種類がインターフェースかクラスかを判定する。クラスの場合はextendsの項目に記述されたクラス(上記のD)をスーパークラス名称とし(S407)、また、implementsの項目値(上記のD)をインターフェース名称とする(S408)。
一方、ステップS406でインターフェースと判定された場合、extends項目値を拡張インターフェース名称とする(S409)。
次に、ステップS410〜S419において、メソッドに関する情報を抽出する。まず、クラスファイルからメソッド名称を取り出し(S412)、更に戻り値(処理の結果の値)の型名(例えば整数型)及び引数(処理の対象となる変数、パラメータ)の型名称を順次取り出す(S413,S414)。
ステップS415でメソッド名称がクラス名称に等しいか否か判断し、等しい場合、上記メソッドはオブジェクトの生成のときに呼び出されるコンストラクタというメソッドであると判断する(S416)。
ステップS415の判定がNOのときは、メソッド中に処理ロジックが存在するか否か判定する(S417)。処理ロジックが存在すれば具象メソッドと判断し(S418)、処理を記述せずに、単に呼び出した方だけを定義したメソッドは抽象メソッドと判断する(S419)。このようにして、図3−2に示したメソッド情報が抽出される。
次に、ステップS420〜S427によりメソッド関連情報を抽出する。ステップS420において、メソッド本体の処理ロジック中に記述された参照先のメソッド情報を検索する。ステップS421で未処理のメソッドがあるか否か判定し、ある場合はステップS422に進み、参照先メソッドのメソッド名称を取り出す。また、ステップS423において、参照先メソッドが属するクラスのクラス名称をそれぞれ取り出す。
次に、処理ロジックの引数がレジスタ変数か否かを判定し(S424)、レジスタ変数の場合は、ロジックを遡って、レジスタ変数に値を代入している箇所から引数の型名称(例えば整数型)を取り出す(S425)。またステップS424の判定がNOの場合は、参照先メソッドの引数の型名称を順次取り出す(S426)。また、参照先メソッドを呼び出すオペランドから参照先がインターフェースか、或いはクラスかを判断する(S427)。
このように本発明は、クラス情報及びメソッド情報だけでなく、参照先のクラス及びメソッドの情報をも抽出する。そして得られた情報は、図3−6に例示するXMLファイルとして整理される。
(2)抽出情報のDB投入
上記のようにして抽出された情報は、DBに投入される。図4−5は、DB投入のフローを示すもので、ステップS501において、前述のXMLファイルにより各クラス毎のレコードが読み込まれ、ステップS502でクラスに関する情報が、図4−1に例示するクラス情報テーブルT100に登録される。またステップS503では、メソッドに関する情報が、図4−2に例示するメソッド情報テーブルT200に登録される。ステップS504では、クラスのスーパークラス及びインターフェースの情報が、図4−3に例示するスーパークラス情報テーブルT300に登録される。更にステップS505では、メソッド関連情報が、図4−4に例示するメソッド関連情報テーブルT400に登録される。このようにして、数万〜数10万個の全クラスの情報が、全てDBに投入される(S506)。
(3)オブジェクトID情報の生成
まず、オブジェクトIDという新しい概念を導入することによって、具象クラス・メソッド間の関連情報を探索する仕組みについて説明する。
簡単な例として、図5−1に示すように、具象クラスA,B,CとインターフェースIA,IBがあり、IAをIBが継承し、クラスB及びCがインターフェースIBを継承している場合を考える。説明の便宜上、A,B,C・・・はクラスの名称と、クラスIDの両方を指称するものとし、クラス・メソッドIDは、例えばAa,IAmのように表すものとする。
オブジェクトIDは、オブジェクト化される具象クラスに対して付与される。この例では、具象クラスA,B,Cがインスタンス情報を生成するクラスに相当するので、各クラスA,B,CにクラスIDと同一のオブジェクトIDのA,B,Cが付与される。すなわち、オブジェクトIDはクラスA,B,Cのオブジェクトの生成クラス(生成クラス)ではなく、オブジェクト化されるクラス(被生成クラス)のクラスIDと同じコードとされる。なお説明の便宜上、ここではオブジェクトIDが付与されると記述するが、実際には、オブジェクトIDとクラス・メソッドとの対照表あるいはオブジェクトIDとインターフェースの対照表が作成される。また、クラス・メソッドIDがAaとAbのように、同じクラスに属する異なるメソッドにも同一のAというオブジェクトIDが付与される。
一方、インターフェースIA,IBはインスタンス化されないので、継承関係にある具象クラスのオブジェクトIDが付与される。図5の例では、インターフェースIA、IBは具象クラスBと継承関係にあるのでBというオブジェクトIDが付与されると同時に、具象クラスCとも継承関係にあるのでCというオブジェクトIDも付与される。すなわち、各インターフェースのクラス・メソッドIDに相当するIAm,IBmが、具象クラスBのオブジェクトIDのBに属するという対照表が作成されると共に、IAm及びIBnがオブジェクトIDのCに属するという関係が対照表に登録される。
このようにして、全てのクラス・メソッドがオブジェクト化されるクラスのオブジェクトIDに属するという関係表が作成される。従来は、例えばAaの関連先がBmであった場合、多数のクラスやインターフェースの参照関係、継承関係を追跡してBmを探索しなければならなかったが、本発明では、IAm,IBn、Bmに共通のオブジェクトIDであるBが付与され、AaがオブジェクトIDのBに属するIAmを参照先としているので、オブジェクトIDのBを媒介情報としてAaとBmとの関係をより探索しやすくなる。
以上述べたオブジェクトIDをキー情報として、具象クラス・メソッド間の関連を探索するには、事前に次のような準備をする必要がある。
第1は、オブジェクトIDと具象クラス・メソッドIDの対照表の作成である。図5の例で説明すると、クラス・メソッドAa,AbがオブジェクトIDのAに属し、クラス・メソッドBmがオブジェクトIDのBに属することを示すテーブルである。本明細書では、このテーブルをオブジェクト情報マスターテーブルと称する。
第2は、オブジェクトIDとインターフェースID(及び抽象クラスのID)との対照表である。図5の例で説明すると、インターフェースIA,IBがオブジェクトIDのBに属し、同様にIA,IBがオブジェクトIDのCにも属するという関係を示すテーブルである。本明細書では、このテーブルをオブジェクト対インターフェース情報テーブルと称する。
第3は、オブジェクト化される具象クラス(被生成クラス)と、そのオブジェクトの生成クラスのIDとの対照表である。本明細書では、前者のクラスを被生成クラス、後者のクラスを生成クラスと称する。図5の例には示されていないが、クラスAのオブジェクトはクラスA以外の別のクラス、例えばクラスXで生成される。また、クラスBのオブジェクトは別のクラス、例えばクラスYで生成される。従ってこの場合は、被生成クラスAと生成クラスXとの関係及び被生成クラスBと生成クラスYとの関係を示すテーブルとなる。本明細書では、このテーブルを生成クラス情報テーブルと称する。
第4は、継承関係にあるために隠蔽されている抽象メソッドを可視化する処理である。図5の例では、インターフェースIBがIAを継承しているため、クラス・メソッドIDとしてIAmとIBnしか記述されていないが、実際にはIBmが隠蔽されている(図1−6参照)。継承関係にある全ての抽象クラス・メソッドIAm,IBm,IBnがオブジェクトIDのBに属するという関係を表すためには、隠蔽されている抽象メソッドも含めた全抽象メソッドを可視化する処理が必要である。本明細書では、この処理を全抽象メソッド情報登録処理と称する。
第5は、具象クラス・メソッドIDが参照している参照先の抽象クラス・メソッドIDと、その抽象クラス・メソッドIDが属するオブジェクトID、及び同じオブジェクトIDに属する具象クラス・メソッドIDとの関係を示すテーブルである。図5の例では、クラスAの参照先のIAmと、IAmが属するオブジェクトのIDであるBと、オブジェクトBに属する具象クラスBの具象クラス・メソッドIDBmとの関係を示すテーブルである。本明細書では、このテーブルをインターフェース対実装対応情報テーブルと称する。
本発明は、以上説明したテーブルの情報に基づいて、具象クラス・メソッド間の関連情報を生成することに一つの特徴を有する。
以下、第1〜第5の処理及びテーブル作成のフローについて詳しく説明する。
(3.1)オブジェクト情報マスターテーブルの作成
図6−1は、オブジェクト情報マスターテーブルT500に含まれる情報を示すもので、オブジェクトIDと、オブジェクトIDに属する具象クラス・メソッドIDの関係を示す。また、クラスに親子関係がある場合は、親・子・孫の順に番号を付けた階層番号の情報も含まれる。
図6−2は、オブジェクトマスター情報テーブルを作成するフローを示す。まず、ステップS601において、クラス情報テーブルT100からクラスタイプが“0”のもの、すなわち具象クラスのみのクラスIDを抽出して、一時テーブル(T)を作成する。ステップS602では、テーブル(T)にクラスIDが登録されているか否かを判定し、登録されている場合は、そのクラスIDを1件取り出してそのクラスIDをオブジェクトID(O)とする(S603)。
次に、クラス情報テーブルT100を参照して、取り出したクラスIDに親クラス名が設定されているか否か判断する(S621)。親クラス名が設定されている場合は、親クラス名をキー情報として、クラス情報テーブルT100を参照して親クラスIDを取得する(S622)。そして取得したクラスIDを主体にして(S624)、再びステップS621とS622を繰り返すことにより最上位のクラスID(ST)を取得する(S623)。
階層番号(L)として(L)=0とし(S604)、(ST)を(B)に置き換えた後(S605)ステップS603で(L)+1を(L)に置き換えることによって最上位の階層番号が1となる。すなわちこの実施例では、階層番号は相対的な値で、最上位の親が一番若い番号となる。
次にステップS607において、メソッド情報テーブルT200から、最上位のクラス(B)に属する具象メソッド(メソッド種類が“0”のクラス)のメソッドIDを取り出す。取り出したメソッドIDと、クラスID(B)のペアと、階層番号(L)と、オブジェクトID(O)を1組として、集合メモリ(M1)に格納する。
この結果、オブジェクトID(O)と、そのオブジェクトIDを付与される最上位の親クラスに属する具象メソッドのクラス・メソッドIDの関連を表す情報が生成される。
次にステップS608では、クラス情報テーブルT100を参照して、クラスID(B)を親クラスとする子クラス(C)を検索する。ステップS609において、クラス(B)の子クラス(C)が存在すると判定された場合は、C→Bと置き換えて、ステップS606〜S609を繰り返す。この結果、親子関係にある全てのクラスのクラス・メソッドIDに対してオブジェクトID(O)が付与される。
ステップS611では、オブジェクトID(O)と、そのオブジェクトID(O)に属する具象クラス・メソッド及びクラスの階層の情報がオブジェクト情報マスターテーブルT500に書き込まれる。その後、具象クラスIDの一時テーブル(T)から取り出した1件のクラスIDを削除する(S612)。そして次の1件のクラスIDを取り出し、クラスIDがなくなるまで繰り返して行われる。この結果、クラス情報テーブルT100の全ての具象クラス・メソッドに対し、オブジェクトIDが付与されたことになる。
(3.2)オブジェクト対インターフェース情報テーブルの作成
図7−1は、オブジェクト対インターフェース情報テーブルT600に含まれる情報を示すもので、オブジェクトID(被生成クラスのクラスID)とそのオブジェクトIDを付与された抽象クラスのID及びインターフェースのIDの情報を含む。
図7−2は、オブジェクト対インターフェース情報テーブルT600を作成するフローを示す。
まずステップS631において、オブジェクト情報マスターテーブルT500に登録されているオブジェクトID(O)を全件抽出する。次にステップS632において、オブジェクトID(O)の中の1件のオブジェクトのオブジェクトID(O1)を取り出す。
オブジェクトID(O1)が存在するか否か判定し(S633)、存在する場合は、オブジェクト情報マスターテーブルT500からオブジェクトID(O1)に属する具象クラスID(C)を全件抽出する(S634)。そして、オブジェクトID(O1)と抽出した全件の具象クラスID(C)のリスト(L)を作成する(S635)。抽出した具象クラスID(C)の集合から1件の具象クラスID(C1)を取り出す(S636)。
ステップS637において、具象クラスID(C1)が存在するか否かを判定し、存在する場合はクラス情報テーブルT100を参照してクラスID(C1)の親クラス名を調べ、親クラス名がある場合は、スーパークラス情報テーブルT300を参照してそのクラスIDを調べ、更にテーブルT100を参照してそのクラスIDのクラス種類を調べることによって具象クラスID(C1)が参照するインターフェース及び具象クラスID(C1)の親に相当する抽象クラス(上位抽象クラス)のクラスID(P)を抽出する。
更にステップS639では、オブジェクトID(O1)と、インターフェース及び上位抽象クラスID(P)をオブジェクト対インターフェース情報テーブルT600に登録する。
次に、登録されたインターフェース及び上位抽象クラス(P)から1件のインターフェース又は抽象クラスID(P1)を取り出す(S640)。クラスID(P1)が存在するか否かを判定し(S641)、存在する場合はクラスID(C1)をクラスID(P1)に置き換え(S642)、再びステップS638に戻って同じ処理が繰り返される。
一方、ステップS641の判定でインターフェース及び抽象クラスID(P1)が存在しない場合は、リスト(L)よりオブジェクトID(O1)と具象クラスID(C1)のペアを削除し、ステップS636に戻って次の1件の具象クラスIDを取り出す。このステップS636〜S642の処理を繰り返すことによって、1件のオブジェクトID(O1)と、このオブジェクトID(O1)に属する全てのインターフェース及び抽象クラスのインターフェースID及び抽象クラスIDのペアの情報が登録されることになる。
また、ステップS637の判定の結果、クラスID(C1)が存在しないと判定された場合はステップS632に戻り、次の1件のオブジェクトIDを取り出して、同様の処理が行われる。
この結果、図6−2により生成された全件のオブジェクトID(O)と、このオブジェクトID(O)を付与されるインターフェースID及び抽象クラスIDの対照情報が作成される。
(3.3)生成クラス情報テーブルの作成
図8−1は、生成クラス情報テーブルT700に含まれる情報を示すもので、例えばクラスAのオブジェクトをクラスBで生成している場合、クラスAを被生成クラス、クラスBを生成クラスとしてクラスAとクラスBのIDを登録したものである。
図8−2は、生成クラス情報テーブルを作成するフローを示す。ステップS701では、メソッド関連情報テーブルT400から、参照先メソッド名及びメソッド戻り型名が未定義であるレコード(R1)を抽出する。このレコード(R1)は、そのクラスでオブジェクトを生成する処理、すなわちインスタンス化を行っている可能性があることを示す。ステップS702では、そのレコード(R1)のクラスID、メソッドID及び参照先クラス名、参照先パッケージ名を取り出す。取り出したレコード(R1)のクラスIDを被生成クラスのクラスIDと見なし、参照先クラス名の欄のクラスを、オブジェクトを生成している生成クラス名と見なす。
次に、ステップS704において、クラス情報テーブルT100を参照して、生成クラス名をキーにしてそのクラスIDを取得する。更にステップS705において、上記被生成クラスIDと生成クラスIDの組が、生成クラス情報テーブルT700に登録済みか否かを判定し、既に登録されている場合はステップS702に戻り、登録されていなかった場合には、そのテーブルT700に登録する(S706)。
一方、ステップS703の判定がNOの場合は、ステップS707に進み、メソッド関連情報テーブルT400から参照先メソッド名が参照先クラス名と等しく、且つメソッド戻り型名が未定義であるレコード(R2)を抽出する。この抽出されたレコード(R2)は、いわゆるnew演算子が記述されたクラス、つまりS702とは異なる方法でオブジェクトを生成していることを示す。以下、ステップS708〜S712において、前述のステップS702〜S706とまったく同様にして、被生成クラスIDと生成クラスIDのペアの情報が生成され、登録される。
この結果、オブジェクトを生成する資格のある具象クラスのID(被生成クラスID)と、そのオブジェクトを現に生成している具象クラスのID(生成クラスID)との対照表が作成される。
(3.4)全抽象メソッド情報登録処理
図9は、全抽象メソッド情報登録処理のフローを示す。この処理は、継承関係のために隠蔽されている抽象メソッドを可視化する処理である。
まずステップS801では、クラス情報テーブルT100及びスーパークラス情報テーブルT300より、上位インターフェース及び上位抽象クラスが、存在しないインターフェース及び抽象クラスのクラスIDの全件(T)を抽出する。抽出した全件のクラスID(T)から、1件ずつインターフェース又は抽象クラスのクラスID(T1)を取り出す(S802)。ステップS803でクラスID(T1)が存在するか否か判定し、YESの場合にはステップS804に進む。ステップS804では、メソッド情報テーブルT200を参照して、クラスID(T1)のレコードを取り出し、そのメソッドの中から抽象メソッドのメソッドID(TM)を抽出する。
次にステップS805において、クラス情報テーブルT100とスーパークラス情報テーブルT300を参照して、上記のインターフェース又は抽象クラスのクラスID(T1)の子インターフェース及び子抽象クラスのクラスIDの集合(S)を抽出する。抽出したクラスIDの集合(S)から、1件ずつ子インターフェース又は子抽象クラスのクラスID(S1)を取り出し、メソッド情報テーブルT200を参照して、クラスID(S1)に属するメソッドIDの最大値(MM)を求める(S808)。
更にステップS810では、前述のステップS804で抽出した抽象メソッドID(TM)を全件、上記子インターフェース又は子抽象クラスのクラスID(S)のメソッドとしてメソッド情報テーブルT200に登録する。この結果、親のインターフェース又は親の抽象クラスに属する抽象メソッドが、子のインターフェース又は子の抽象クラスに属する抽象メソッドとして登録される。その際、抽象メソッドIDには、親子の階層を示す情報として(MM)から始まる番号を設定する。更にステップS811では、子の抽象クラスのクラスIDの集合(S)をサブクラス一覧(SL)に追加する。
このようにして、親の抽象クラスの集合(T)と子の抽象クラスの集合(S)について、全て繰り返し同様の処理を行った後、ステップS813において、(T)の内容を(SL)の内容で置き換える。これにより、親子の関係にある抽象クラス又はインターフェースの全ての抽象メソッドが可視化されて、抽象メソッドテーブルT200に登録されたことになる。
(3.5)インターフェース対実装対応情報テーブルの作成
図10−1は、インターフェース対実装対応情報テーブルT800に含まれる情報を示すもので、参照先インターフェースまたは参照先抽象クラスのクラスID、及び参照先インターフェースまたは参照先抽象クラスにおける参照先抽象メソッドのメソッドIDと、その抽象メソッドが属するオブジェクトIDの情報が含まれる。また、同じオブジェクトIDに属する具象メソッドのメソッドIDと、その具象メソッドが属する具象クラスのクラスIDも含まれる。
図10−2は、インターフェース対実装対応情報テーブルを作成するフローチャートを示す。まずステップS901において、クラス情報テーブルT100からインターフェース及び抽象クラスの全件のクラスID(A)を抽出する。次に、ステップS902において、抽出したクラスID(A)よりインターフェース又は抽象クラスのクラスIDを1件(A1)ずつ順次取り出す。更に、ステップS903において、クラスID(A1)が存在するか否か判定し、YESの場合はメソッド情報テーブルT200を参照して、インターフェース又は抽象クラスのクラスID(A1)に属する抽象メソッドのメソッドレコード(AM)を抽出する(S904)。
次に、抽象メソッドレコード(AM)が1件以上存在するか否か判定し(S905)、存在する場合は、オブジェクト対インターフェース情報テーブルT600を参照して、抽象クラス(A1)が属するオブジェクトID(O)を抽出する(S906)。抽象クラスは、複数個のオブジェクトIDに属すことができるので、抽出したオブジェクトID(O)からオブジェクトIDを1件ずつ(O1)順次取り出す(S907)。次に、ステップS908において、オブジェクトID(O1)が存在するか否か判定し、YESの場合はステップS909に進む。
ステップS909においては、オブジェクト情報マスターテーブルT500を参照して、オブジェクトID(O1)に属する具象メソッドを求め、更にメソッド情報テーブルT200を参照して、その具象メソッドの名称、引数等を含むメソッドレコード(CM)を階層番号の大きな順に抽出する。ステップS910において、具象メソッドレコード(CM)が1件以上存在するか否か判定し、YESの場合はステップS911に進む。ステップS911においては、抽象メソッドのメソッドレコード(AM)からメソッド名称、引数情報を1件ずつ(AM1)順次取り出す。更にステップS912において、抽象メソッドのメソッドレコード(AM)を全て読み出したか否か判定し、全てレコードを読み出した場合はステップS913に進み、具象メソッドのメソッドレコード(CM)から、レコード番号の大きい順にメソッド名称、引数情報を1件ずつ(CM1)取り出す。そしてステップS914でAM1=CM1か否かを判定し、AM1とCM1が等しいときは、抽象クラスのクラスID(A1)及び抽象クラスID(A1)に属する抽象メソッドのメソッドID(AM1)よりなる抽象クラス・メソッドIDと、具象メソッドID(CM1)と該具象メソッドIDが属するクラスのクラスIDよりなる具象クラス・メソッドIDとが同じオブジェクトID(O1)に属すると見なされる。そしてステップS916において、抽象クラス・メソッドIDと、具象クラス・メソッドIDと、オブジェクトIDとの組がインターフェース対実装対応情報テーブルT800に登録される。
このようにして、ステップS901〜S917を繰り返し実行することによって、全てのインターフェース及び抽象クラスのクラス・メソッドIDが属するオブジェクトIDと、そのオブジェクトIDに属する具象クラスのクラス・メソッドIDとの関係を示すインターフェース対実装対応情報テーブルT800を作成することができる。
(4)メソッド間関連情報の生成
以上のようにして生成された各種の情報に基づいて、メソッド間関連情報を作成する。メソッド間関連情報とは、図1−5を例にとると、具象クラス・メソッドIDのC11m2と、その参照先の具象クラス・メソッドIDのC21m4とのペア情報を称し、C11m2を参照元のクラス・メソッドID、C21m4を参照先のクラス・メソッドIDという。なお、具象クラス・メソッドが抽象クラスやインターフェースを介して他の具象クラスを参照する場合もあるので、関連先クラス・メソッドID、関連元クラス・メソッドIDということもある。
このメソッド間の関連を表すペア情報は、図11−1に示すように、クラス情報テーブルT100、メソッド情報テーブルT200、メソッド関連情報テーブルT400、生成クラス情報テーブルT700、オブジェクト情報マスターテーブルT500及びインターフェース対実装対応情報テーブルT800の情報を参照しながら最終的に、メソッド間関連情報テーブルT900を作成することにより生成される。
図11−2は、メソッド間関連情報テーブルT900に含まれる情報を示す。901は処理フラグで、このテーブルT900を作成する過程で用いられる。分析が済んだときは0、オブジェクトIDを特定できないときは1、オブジェクトIDと参照先のクラス・メソッドを特定できないときには2がセットされる。902は参照元(関連元)クラスが属するオブジェクトのIDであり、前記のペア情報を生成するために用いられる。903は参照元(関連元)の具象クラス(実装クラス)のクラスID、904は参照元(関連元)の具象メソッド(実装メソッド)のメソッドIDであり、903と904により参照元(関連元)の具象クラス・メソッドIDが形成される。903の情報はメソッド関連情報テーブルT400(図3−4)のクラスIDと同じであり、904は該テーブルT400のメソッドIDと同じである。905は参照先(関連先)クラス・メソッドが属するオブジェクトのIDであり、これも前述のペア情報を生成するために用いられる。抽象メソッド又はインターフェースが介在するために参照先の具象クラス・メソッド及び、そのクラス・メソッドが属するオブジェクトIDが特定できないとき、つまり処理フラグ901が1又は2の場合、このオブジェクトID905としてオール0が設定される。906は参照先(関連先)の具象クラス(実装クラス)のクラスID、907は参照先(関連先)具象メソッドのメソッドIDである。
次に、図11−3から図11−6を参照して、メソッド間関連情報を作成するフローについて説明する。
ステップS1001において、メソッド情報テーブルT200(図3−2)から具象メソッドを1件ずつ取り出す。ステップS1002で具象メソッドが存在するか否かを判定し、存在する場合は、メソッド関連情報テーブルT400(図3−4)を参照して、参照先クラス名、参照先メソッド名及び参照先パッケージ名の情報を取り出す(S1003)。
なお、以下の説明では、参照先及び関連先を代表して関連先とし、参照元及び関連元を代表して関連元という用語を用いる。
ステップS1004で関連先情報が存在するか否か判定し、YESの場合はステップS1005に進む。
ステップS1005において、クラス情報テーブルT100を参照し、抽出したクラス名及びパッケージ名をキー情報として、関連先クラスのクラスID及びクラス種類の情報を取り出す。更にステップS1006において、メソッド情報テーブルT200を参照し、先に取り出したメソッド名と、上記ステップS1005で取り出したクラスIDをキー情報として、メソッドIDとメソッド種類の情報を取り出す。
以上の処理により、ある具象クラスに属する具象メソッドの関連先クラスのクラスID及びクラス種類と、関連先メソッドのメソッドID及びメソッド種類の情報が得られたことになる。ここでクラス種類は、クラス情報テーブルT100のテーブル項目値により、図11−5に示すように、インターフェース、抽象クラス、具象クラスに分類され、メソッド種類は、メソッド情報テーブルT200のテーブル項目値より抽象メソッド、具象メソッド、staticメソッドに分類される。なお、メソッド種類のレコードのないメソッドもある。
図11−3のステップS1008では、これらのクラス及びメソッドの分類に応じて、図11−5に示すような処理区分(1)〜(8)が決定される。例えば処理区分(1)は、関連先クラスがインターフェースであり、関連先メソッドが抽象メソッドである場合の処理を示し、処理区分(2)は、関連先クラスが抽象クラスであり、関連先メソッドが抽象メソッドである場合の処理を示している。なお、図11−5の表で斜線を施した箇所は、クラス・メソッドの組み合わせとして理論的に存在し得ないことを示している。
図11−4を参照して、まず処理区分(1)と(2)について説明する。
関連先クラスの種類がインターフェースか抽象クラスで、関連先メソッドの種類が抽象メソッドの場合、まずステップS1020において、インターフェース対実装対応情報テーブルT800を参照して、そのクラス・メソッドが属するオブジェクトIDと、そのオブジェクトIDに属する具象クラスID及び具象メソッドIDを取り出す。取り出したオブジェクトIDが1件だけか否か判定し(S1021)、1件しかない場合は、上記の取り出したオブジェクトIDを関連先のオブジェクトIDと決定する(S1022)。また、当該オブジェクトIDに属する具象クラスID及び具象メソッドIDも、それぞれ関連先具象クラスID及び関連先具象メソッドIDとして決定する(S1023)。
ステップS1024では、メソッド間関連情報テーブルT900の処理フラグ901に、分析済みを示す0をセットする。また、関連元具象メソッドが属する関連元クラスのクラスIDを関連元オブジェクトIDとする(S1025)。ステップS1075において、メソッド関連情報テーブルT900の関連元クラスのオブジェクトID、関連元の具象クラス・メソッド、関連先のオブジェクトID、関連先の具象クラス・メソッドIDを登録する。
一方、ステップS1022における判定がNOの場合は、関連先オブジェクトを全て0にする(S1026)と共に、関連先クラス及び関連先メソッドにも全部0をセットする(S1027)。更にステップS1028では、メソッド間関連情報テーブルT900の処理フラグ901に、関連先のクラス・メソッド及びオブジェクトが未特定であることを示す2をセットする。また、関連元オブジェクトIDも全部0にセットする(S1029)。
以上のように、関連先クラスの種類が、インターフェースが抽象クラスで、関連先メソッドの種類が抽象メソッドの場合は、予め作成したインターフェース及び抽象クラスのクラスIDと、該クラスIDが属するオブジェクトIDとの関係を表すテーブルT800を参照してオブジェクトIDを探索し、次に当該オブジェクトIDに属する具象クラスのクラスID及び具象メソッドのメソッドIDを探索することにより、関連先の具象クラス・メソッドIDを特定する。
次に、処理区分(5)又は(6)の場合、つまり、関連先のクラスが抽象クラスか具象クラスであって、関連先メソッドが具象メソッドである場合について説明する。クラスの種類が抽象クラスであっても、メソッドの種類が具象メソッドであれば、その抽象クラスにオブジェクトIDが付与されている。ステップS1030において、オブジェクト情報マスターテーブルT500を参照し、具象メソッドID及びクラスIDをキーに、オブジェクトIDの情報を取り出す。この取り出したオブジェクトIDが関連先オブジェクトID候補となる。
次に、上記オブジェクトID候補をキーとしてオブジェクト情報マスターテーブルT500を検索し、関連先具象メソッドと、メソッド名及びメソッド引数が同じメソッドを取り出す。その際、クラスに親子関係がある場合は下位クラスから探索する(S1031)。
Javaにはキャストと呼ばれる仕組みがあり、同じ名前のメソッドがクラスの親子間で双方に定義されている(「オーバーライド」と言う)場合、関連先クラスが親クラスであっても、文法上は子クラスのメソッドを指す必要がある。従って、オブジェクトに関連付くクラスのうち、末端の子クラスから順にメソッドを検索し、最初に見つかったメソッドを関連先メソッドとする。この検索の条件が「メソッドの名称、引数が同じ」ということになる。
例えば具象クラスA、Bが親と子の関係にあり、双方にメソッドm( )が定義されている場合。関連元クラスからの関連先が「クラスAのメソッドm( )」であっても、オブジェクトがBであれば参照先メソッドはクラスBのメソッドm( )になる。オブジェクトマスター情報テーブルに対しクラスAのメソッドm( )をキーに検索すると、オブジェクトIDはAとBが取得できる。オブジェクトがBの場合にはステップS1031の手順でクラスBのメソッドm( )を取り出す。ここでもしクラスAが抽象クラスだった場合は、オブジェクトIDはBのみ取得できる。この場合もステップS1031の手順でクラスBのメソッドm( )を取り出す。
ステップS1032では、取り出した関連先オブジェクトIDの候補が1件か否かを判定し、1件の場合は、取り出したオブジェクトID候補を関連先オブジェクトIDとする(S1033)。また、ステップS1031の探索により得られた具象メソッド及びその具象メソッドが属する具象クラスを、関連先具象クラス、関連先具象メソッドとする(S1034)。
ステップS1035では、メソッド間関連情報テーブルT900の処理フラグ901に分析済みを示す0をセットする。また、関連元クラスのオブジェクトID候補を関連元オブジェクトIDとして、同様にステップS1075で関連元、関連先のオブジェクトID、具象クラス・メソッドIDを登録する。
一方、ステップS1032の判定の結果、NOの場合はS1026〜S1029と同様に、関連元、関連先オブジェクトID及び関連元、関連先クラス・メソッドIDに全部0がセットされる(S1037〜S1040)。
以上のように、関連先のクラス種類が抽象クラスや具象クラスで、関連先のメソッドの種類が具象メソッドの場合も、オブジェクトIDを手がかりにして関連先の具象クラス(実装クラス)及び具象メソッド(実装メソッド)を特定できる場合がある。
次に、処理区分が(3)の場合、つまりクラスが抽象クラスでメソッド情報がない場合は、ステップS1050〜S1056により関連元、関連先のオブジェクトID、関連元、関連先の具象クラス・メソッドIDを特定する。メソッド情報テーブルに関連先メソッドの定義が無いとは、参照先メソッドが関連先メソッドで定義されずに、上位クラスで定義されていることを指す。関連先クラス・メソッドがメソッド情報テーブルに定義されていないのでオブジェクト情報マスターテーブルにも当該クラス・メソッドは定義されていない。そこで、上位クラスに具象メソッドを探し求める。ステップS1050では、メソッド名称と引数が同じであるという探索条件で上位クラスの具象メソッド(実装メソッド)を求める。次にステップS1051では、特定した具象メソッド(実装メソッド)と、そのメソッドが属するクラス情報をキーとしてオブジェクトをオブジェクト情報マスターテーブルを検索し、オブジェクト候補を取り出す。
以下のステップS1052〜S1060は、前述のステップS1032〜S1040と同じである。
処理区分(4)は、関連先のクラス種類が具象クラスでメソッド情報がない場合である。この場合は、オブジェクトIDは関連先クラスのIDであるから、オブジェクトを探索する手順が不要となり、上位クラスの具象メソッド(実装メソッド)を探索する手順のみとなる。すなわちステップS1070において、スーパークラス情報テーブルT300を参照して上位クラス(親クラス)のクラス名を探索し、次にメソッド情報テーブルT200を参照して、その上位クラスのクラスIDから、そのクラスIDに属するメソッドを探索する。そして、そのメソッドの中でメソッド種類が0のメソッド、すなわち具象メソッドを取り出す(S1070)。この具象クラス及び具象メソッドをキーに、オブジェクト情報マスターテーブルT500から関連先のオブジェクトIDを取り出す。取り出したオブジェクトID、具象クラスID及び具象メソッドIDを、それぞれ関連先のオブジェクトID、関連先の具象クラスID、関連先の具象メソッドIDとする(S1072)。更に、メソッド間関連情報テーブルT900の処理フラグ901に分析済みを示す0をセットする(S1073)。また、関連元クラスのオブジェクトID候補を関連元オブジェクトIDとして(S1074)、メソッド間関連情報テーブルT900に登録する。
一方、処理区分が(7)及び(8)の場合、つまりクラスの種類が抽象クラスか具象クラスで、メソッドの種類がstaticの場合は、ステップS1071において、メソッドを関連先具象メソッドとし、クラスを関連先の具象クラスとする。
以上の説明から明らかなように、オブジェクトIDという新しい概念を導入することにより、オブジェクトIDを手がかりにして関連先の具象クラス・メソッドを特定する精度を高めることが可能となる。
(5)具象クラス・メソッド間関連情報の表示
次に、上述のようにして生成された具象クラス・メソッド間関連情報を表示するためのフローを、図12−1を参照して説明する。
Java言語プログラムのあるクラス・メソッドを指定し、例えばそのクラス・メソッドを修正した場合に、どの範囲のクラスに影響を及ぼすか解析を行うときには、まずステップS1301において、当該クラス・メソッドIDを指定する。次に、メソッド間関連情報テーブルT900から当該クラス・メソッドの関連先クラス・メソッド、該関連先クラス・メソッドの更に関連先のクラス・メソッドというように、次々に関連先クラス・メソッド情報を抽出する。
抽出されたクラス・メソッドの関連が、例えば図12−2のように表される場合を例にとると、ステップS1303では図12−3に示すようなクラス名、メソッド名及び引数の文字列からなるテキストデータを生成する。
更にステップS1304では、生成したテキストデータをウェブ上で表示する既存のソフトウェアに受け渡し、ユーザのPCのウェブブラウザソフトウェア上に、例えば図12−4のような形式で表示する(S1305)。
このように、テキストデータを図12−4のようにウェブ上で表示するソフトウェア自体は既に公知である。
図12−5は、本発明ツールが適用される大規模業務系の説明図であり、70は端末機器、71はサーバ、72はDB、73は保守用のパソコンである。
証券業務を例にとると、各支店に設置された数百台〜数千台のパソコンからなる端末70がネットワーク74を通して本店のサーバ71に接続されている。各端末70からは証券や債券の取引等のデータが入力され、本店のサーバ71により処理されてデータベース72に蓄積される。
一方、この証券業務システムに用いられるJava言語プログラムの保守を行うために、前述のテーブルT100〜T900で示されたデータがDB72に格納され、各フローチャートで示されたプログラムが保守用のパソコン73に格納されている。保守用のパソコン73から特定のクラス・メソッドを指定する情報を入力すると、図12−4に例示した関係図が画面に表示される。
以上説明した本発明ツールによれば、Java言語プログラムにおけるクラス継承により、ソースコードプログラム上では隠蔽されたクラス・メソッドも含めて、具象クラス・メソッド間の関連を表示することが可能となる。また、クラス・メソッドの数が数10万個から数100万個に達する大規模業務系のJava言語プログラムの中で、特定の業務処理(トランザクション)に用いられる全ての具象クラス・メソッドを抽出し、これを画面上に表示することができる。
更に、所定の具象クラス・メソッドを指定して、それに関連する具象クラス・メソッドを抽出・表示することにより、所定の具象クラス・メソッドが影響を及ぼす範囲を特定することもできる。
従って、あるデータ項目にアクセスするクラス・メソッドを指定して、そのデータ項目が利用されているトランザクション、データベース並びに業務ロジックなどを特定することが可能となるため、大規模業務系のJava言語プログラムの保守作業の負担を従来に比べて著しく軽減することが可能となる。