以下、本実施の形態について図面を参照して説明する。
[第1の実施の形態]
第1の実施の形態を説明する。
図1は、第1の実施の形態の情報処理システムを示す図である。
第1の実施の形態の情報処理システムは、分析支援装置10、業務システム20および端末装置30,40を有する。分析支援装置10、業務システム20および端末装置30,40はネットワーク50に接続されている。
分析支援装置10は、業務システム20の分析を支援する。業務システム20は、1以上の情報処理装置によって構成される。業務システム20は、アプリケーション(業務アプリケーション)を実行し、当該アプリケーションによる機能を端末装置30に提供する。端末装置30は、ユーザ60により利用される。ユーザ60は、業務システム20を使用して、ユーザ60(あるいは、ユーザ60が属する組織)の業務を行う。以下に登場するユーザ60は、同一人物でなくてもよく、例えば、業務システム20を使用する組織に属する任意の人物と考えてもよい。端末装置40は、ユーザ70により利用される。ユーザ70は、業務システム20の保守を行うSE(System Engineer)などの保守員である。ユーザ70は、保守を行う事業者に所属する任意の人物と考えてもよい。例えば、ユーザ70は、ユーザ60の要望に応じて、業務システム20が実行するアプリケーションのプログラムを改変することで、業務システム20の改変を行う。
業務システム20は、複数のロジックと複数の記憶部とを有する。ロジックは、アプリケーションにより提供される機能の一単位である。ロジックは、記憶部に記憶されたデータを読出して処理し、処理結果を記憶部に書込む。ロジックは、1つのプログラムに対応してもよいし、プログラム内の1つの関数に対応してもよい。関数は、プログラム内の1つの処理単位であり、例えば、メソッド、手続き、セクションなどの他の名称で呼ばれることもある。業務システム20における複数のロジックはロジックL1,L2,L3,・・・を含む。ユーザ60によるアプリケーションの改変要望は、例えば、ロジック単位で行われる。
業務システム20における記憶部は、ロジックにより処理されるデータを記憶する記憶デバイス、または、当該記憶デバイスに確保されたデータ格納領域である。記憶デバイスとしては、HDD(Hard Disk Drive)やSSD(Solid State Drive)などを用いることができる。例えば、1つの記憶部は、データベース(DB:DataBase)を有する。DBは、例えば、データ項目として複数のカラムを有する関係DB(RDB:Relational DB)である。1つの記憶部は、DBにおける1つのテーブルでもよい。ただし、DBは、複数のデータ項目を識別できるようにデータフォーマットが規定されていればよく、ツリー型やオブジェクト型などの他の種類のDBでもよい。業務システム20における複数の記憶部は、記憶部M1,M2,M3,・・・を含む。
ここで、あるロジックを改変する場合、当該ロジックの改変によって、当該ロジックと記憶部を介して連携する他のロジックに影響が及ぶことがある。例えば、あるロジックの改変により、あるテーブルにおけるあるデータ項目に対して既存の値域に属さない値が設定されるようになった場合に、当該テーブルを用いる他のロジックにおいて当該データ項目に関する処理を追加または改変すべき場合がある。ユーザ60の要望によりロジックを改変する場合、ユーザ70は、改変による他のロジックへの影響を特定し、ユーザ60に予め報告することが望ましい。そこで、分析支援装置10は、ロジック改変時に改変箇所を提示可能にする機能を提供する。
分析支援装置10は、記憶部11と処理部12とを有する。記憶部11は、RAM(Random Access Memory)などの揮発性記憶装置でもよいし、HDDやフラッシュメモリなどの不揮発性記憶装置でもよい。処理部12は、例えば、CPU(Central Processing Unit)、DSP(Digital Signal Processor)などのプロセッサである。ただし、処理部12は、ASIC(Application Specific Integrated Circuit)やFPGA(Field Programmable Gate Array)などの特定用途の電子回路を含んでもよい。プロセッサは、RAMなどのメモリ(記憶部11でもよい)に記憶されたプログラムを実行する。当該プロセッサが実行するプログラムには分析支援プログラムが含まれる。複数のプロセッサの集合を「マルチプロセッサ」または単に「プロセッサ」と言うことがある。
記憶部11は、業務システム20により実行されるアプリケーションのソースコード13を記憶する。ソースコード13は、例えば、オブジェクト指向言語などの高級言語で記述されている。例えば、ソースコード13は、複数のファイル(ソースファイル)に分けられていてもよい。また、記憶部11は、業務システム20によるアプリケーション実行に伴う動作履歴情報14を記憶する。動作履歴情報14は、記憶部M1,M2,M3,・・・に格納されたデータの読出しおよび書込みに関する情報である。動作履歴情報14は、アプリケーション実行時において実際に実行されたロジックの履歴(例えば、関数の呼出スタック)を含む。
処理部12は、ユーザ60により指示されたロジックの業務システム20による実行に伴って動作履歴情報14を取得し、記憶部11に格納する。処理部12は、動作履歴情報14およびロジックのソースコード(ソースコード13の一部のコードでもよい)の解析に応じて、記憶部M1,M2,M3,・・・のうち、読出しが行われた記憶部と書込みが行われた他の記憶部とのロジックによる関係を特定する。処理部12は、当該ロジックを介した記憶部間の関係を示す情報を記憶部11に格納する。処理部12は、当該関係に基づいて、ユーザ70により改変すべき改変対象ロジックを特定し、改変対象ロジックをユーザ60に提示する。
例えば、処理部12は、改変対象ロジックを示す画面31の情報を端末装置30に送信し、端末装置30のディスプレイに画面31を表示させることで、改変対象ロジックをユーザ60に提示する。例えば、画面31は、ロジックL1,L2,L3,・・・のうち、改変対象ロジックとしてロジックL1,L2を示す。
次に、分析支援装置10による改変対象ロジックの特定の処理例を説明する。
図2は、分析支援装置の処理例を示す図である。
一例として、ロジックL1および記憶部M1,M2を挙げる。ロジックL1は記憶部M1からのデータの読出し、および、記憶部M2へのデータの書込みを行う。記憶部M1は、テーブルT1を記憶する。テーブルT1は、データ項目C1,C2を有する。記憶部M2は、テーブルT2を記憶する。テーブルT2は、データ項目C3,C4を有する。また、ロジックL1は、変数X,Y,A,Bを有する。
処理部12は、ロジックL1のソースコードに基づいて、変数Xに対してデータ項目C1の値が代入されることを検出する。例えば、ロジックL1のソースコードにデータ項目C1の識別情報が明記されていれば、処理部12は、当該ソースコードにより変数Xとデータ項目C1との対応関係を特定できる。処理部12は、他の変数Y,A,Bについても同様に、データ項目C2,C3,C4との対応関係を特定できる。
一方、ロジックL1は、例えば、オブジェクト型データと関係型データとを相互に変換するO/R(Object / Relational)マッパーなどのDBアクセス用のライブラリモジュールを利用して各記憶部にアクセスすることもある。ライブラリの挙動はソースコード外部の設定ファイルで定義されることがあり、こうしたライブラリモジュールのソースコードを分析支援装置10が有していないことがある。この場合、ソースコードレベルで見るとライブラリの内部処理がブラックボックスとなる。そこで、処理部12は、次のようにして変数X,Y,A,Bそれぞれに対応するデータ項目を特定する。
まず、変数Xについて説明する。処理部12は、ロジックL1のソースコードに関する静的解析を行うことで、DBアクセス用のライブラリモジュールの関数を呼出して当該関数の返り値を変数Xに代入する命令文を検出する。そして、処理部12は、当該命令文の実行ログを動作履歴情報14から抽出し、変数Xに代入された返り値を特定する。更に、処理部12は、動作履歴情報14に含まれるDBアクセス用のライブラリモジュールが発行したクエリとその実行結果のログから、特定した返り値を実行結果として取得したときに読み出されたテーブルとデータ項目とを抽出する。
例えば、処理部12は、ロジックL1の実行ログから変数Xに代入された返り値aを特定する。この場合、処理部12は、ライブラリモジュールが実行結果aを取得したときのクエリ(select文など)により読出し対象となったテーブルT1のデータ項目C1を、記憶部M1に対するライブラリモジュールによるデータ操作のログから特定する。これにより、処理部12は、変数Xを、テーブルT1のデータ項目C1から読出された値が代入される変数として特定する。同様に、処理部12は、例えば、変数Yを、テーブルT1のデータ項目C2から読出された値が代入される変数として特定する。変数X,Yは、読出し側変数と呼ばれる。
次に、変数Aについて説明する。処理部12は、ロジックL1のソースコードに関する静的解析を行うことで、変数Aを引数として用いて、DBアクセス用のライブラリモジュールの関数を呼出す命令文を検出する。そして、処理部12は、当該命令文の実行ログを動作履歴情報14から抽出し、変数Aにより指定された引数を特定する。更に、処理部12は、動作履歴情報14に含まれるDBアクセス用のライブラリモジュールが発行したクエリとその実行結果のログから、特定した引数を書込み値として書込んだときの書込み先テーブルとデータ項目とを抽出する。
例えば、処理部12は、ロジックL1の実行ログから変数Aに代入された引数bを特定する。この場合、処理部12は、ライブラリモジュールが書込み値bを書き込んだときのクエリ(insert文など)により書込み先となったテーブルT2のデータ項目C3を、記憶部M2に対するライブラリモジュールによるデータ操作のログから特定する。これにより、処理部12は、変数Aを、テーブルT2のデータ項目C3に書込む値が代入される変数として特定する。同様に、処理部12は、例えば、変数Bを、テーブルT2のデータ項目C4に書込む値が代入される変数として特定する。変数A,Bは、書込み側変数と呼ばれる。
更に、処理部12は、ロジックL1の静的解析および動的解析を組み合せて、読出し側変数から書込み側変数に対する変数の伝搬関係を分析する。具体的には、処理部12は、ロジックL1のソースコードを参照して、読出し側変数に対する処理を辿る。このとき、当該ソースコード内で呼出される関数のソースコードも参照して、読出し側変数に対する処理を辿り、当該読出し側変数が影響を及ぼす他の変数を特定する。
ただし、呼出し対象の関数が動的束縛により実行時に決定されることもある。例えば、呼出し対象の関数がJava(登録商標)におけるインタフェースを実装するクラスで定義されるメソッドである場合などである。1つのインタフェースは、複数のクラスに実装可能である。このため、複数のクラスにおいて、実装したインタフェース内の同名のメソッドが定義され得る。また、ロジックL1のソースコードに記述された当該メソッドを含むオブジェクトの生成コード(例えば、new演算子によるインスタンス化)が不明なことがある。例えば、業務アプリケーションのフレームワーク内などに当該生成コードが隠蔽されており、ユーザ70により閲覧・改変可能なユーザコード(例えば、ロジックL1のソースコード)に含まれていない場合が考えられる。この場合、処理部12は、ロジックL1のソースコードのみからオブジェクトの生成元のクラスを特定できず、静的解析のみでは実際に実行されるメソッドを追跡できない。
そこで、処理部12は、動作履歴情報14に含まれる呼出スタックにより、ロジックL1を実行したときに実際に呼出されたメソッドを特定し、特定したメソッドのソースコードを参照して変数の伝搬関係の特定を継続する。そして、処理部12は、ある読出し側変数により影響を受ける変数として、書込み側変数を特定すると、当該読出し側変数と書込み側変数とを対応付ける。
図2の例では、処理部12は、読出し側変数Xによる影響が書込み側変数Aに及ぶことを特定し、読出し側変数Xと書込み側変数Aとを対応付ける。また、処理部12は、読出し側変数Yによる影響が書込み側変数Bに及ぶことを特定し、読出し側変数Yと書込み側変数Bとを対応付ける。例えば、処理部12は、読出し側変数Yによる影響が書込み側変数でない変数Cに及ぶことを検出することもある。しかし、変数Cは、書込み側変数ではないので、処理部12は、読出し側変数Yと変数Cとの対応付けを行わない。
処理部12は、上記の読出し側変数と書込み側変数との対応付けによりロジックL1による記憶部間の関係を特定する。例えば、読出し側変数Xには、テーブルT1におけるデータ項目C1から読み出された値が代入される。また、書込み側変数Aには、テーブルT2におけるデータ項目C3に書込む値が代入される。よって、処理部12は、ロジックL1による記憶部M1,M2の関係を特定する。
記憶部M1,M2の間の関係は、記憶部M1に記憶されたデータ項目C1と記憶部M2に記憶されたデータ項目C3とのロジックL1のソースコードに含まれる複数の変数(変数Xから変数Aに至る複数の変数)を介した関係であると言える。なお、処理部12は、読出し側変数Yと書込み側変数Bとの関係からも、ロジックL1による記憶部M1,M2の関係を特定できる。
こうして、処理部12は、ロジックL1,L2,L3,・・・それぞれによる記憶部間の関係を特定し、当該関係を示す情報を記憶部11に格納する。例えば、業務システム20は、更に、ロジックL4および記憶部M4,M5,M6を有するとする。この場合に、処理部12は、例えば、ロジックL2による記憶部M2,M6の関係、ロジックL3による記憶部M4,M5の関係、および、ロジックL4による記憶部M5,M6の関係を特定する。
処理部12は、記憶部間の関係に基づいて、あるロジックの改変に対する改変対象ロジックを特定する。例えば、ユーザ60により、ロジックL1の改変が要望された場合を考える。この場合、処理部12は、特定した記憶部間の関係に基づいて、ロジックL1の改変の影響が及ぶロジックを特定する。例えば、上記の例では、ロジックL1は、記憶部M2へのデータ書込みを行う。記憶部M2に書き込まれたデータは、ロジックL2により処理される。したがって、処理部12は、ロジックL1,L2を改変対象ロジックとして特定する。
処理部12は、関数による変数の伝搬関係の情報に基づいて、ロジックL1,L2内の特定のコード部分(伝搬関係に関与する関数)を、改変対象ロジックとして特定してもよい。例えば、ロジックL1における改変対象として、データ項目C1または変数Xに関連する部分が指定されることもある。この場合、処理部12は、ロジックL1のソースコードのうち、読出し側変数Xから書込み側変数Aまでに辿った関数を改変対象ロジックとして特定してもよい。
更に、処理部12は、ロジックL2に対して、データ項目C3に対する読出し側変数Zと、記憶部M6のデータ項目C5に対する書込み側変数Dとを対応付けているとする。この場合に、処理部12は、ロジックL2のソースコードのうち、当該対応付けの際に辿った関数を改変対象ロジックとして特定してもよい。
処理部12は、こうして特定した改変対象ロジックを示す画面31の情報を端末装置30に提供し、端末装置30に画面31を表示させることで、ユーザ60に改変対象ロジックを提示する。
分析支援装置10によれば、ユーザ60により指示されたロジックの業務システム20による実行に伴って、記憶部M1,M2,M3,・・・に格納されたデータの読出しおよび書込みに関する動作履歴情報14が取得される。動作履歴情報14およびロジックのコードの解析に応じて、読出しが行われた記憶部と書込みが行われた他の記憶部とのロジックによる関係が特定される。特定された当該関係に基づいて、業務システム20を改変するユーザ70により改変すべき改変対象ロジックが特定される。そして、改変対象ロジックがユーザ60に提示される。
これにより、記憶部M1,M2,M3,・・・を介して連携する複数のロジックに関して、あるロジックの改変に伴う改変対象ロジックを適切に特定し、ユーザ60に提示可能になる。特に、分析支援装置10は、各ロジックのソースコードに対して、動的解析と静的解析とを組み合せることで、ロジックにおける変数の影響の伝搬を適切に追跡できる。このため、実行される手続きが動的束縛により決定される場合にも、あるロジックによる記憶部間の関係を特定可能になる。その結果、改変対象ロジックの抽出漏れを低減し、改変対象ロジックの抽出精度を向上させることができる。
こうして、分析支援装置10によれば、業務システム20で実行されるアプリケーションにおける変更対象箇所のユーザ60,70による適切な把握を支援できる。
[第2の実施の形態]
次に、第2の実施の形態を説明する。
図3は、第2の実施の形態の情報処理システムの例を示す図である。
第2の実施の形態の情報処理システムは、分析サーバ100、DBサーバ200,200a、業務サーバ300,300aおよびクライアント400,500を含む。分析サーバ100、DBサーバ200,200a、業務サーバ300,300aおよびクライアント500は、ネットワーク80に接続されている。ネットワーク80はネットワーク90に接続されている。ネットワーク80,90は、例えば、LAN(Local Area Network)である。クライアント400は、ネットワーク90に接続されている。
ユーザ600は、クライアント400を操作して、業務サーバ300,300aが実行する業務アプリケーションの機能を使用し、ユーザ600が所属する組織の業務を行う。ここで、業務アプリケーションは、複数の業務ロジックを含む。業務ロジックは、1つのプログラムに対応してもよいし、関数やメソッドなどといったプログラム内の1つの処理単位に対応してもよい。業務ロジックを記述するプログラミング言語の一例としてJavaを考える。ただし、業務ロジックは他のプログラミング言語により記述されてもよい。
SE700は、クライアント500を操作して、業務アプリケーションの改変を行う保守員である。具体的には、SE700は、ユーザ600の要望を受けて、業務アプリケーションにおける業務ロジックを変更する。例えば、SE700は、業務アプリケーションの機能向上、業務に関する法改正対応、および、バグ修正などを目的として、ユーザ600から業務ロジックの改変の要望を受ける。SE700は、要望に応じて、改変対象の業務ロジックのプログラムを修正することで、当該業務ロジックの改変を行う。
ある業務ロジックの改変に伴って、DBを介して当該業務ロジックと連携する他の業務ロジックが改変の影響を受けることがある。例えば、ある業務ロジックの改変に伴って、あるテーブルのデータ項目(カラムと言う)に既存の値域とは異なる値が設定される場合が考えられる。この場合、当該カラムの値(カラム値)を用いる他の業務ロジックも改変しなければ、当該他の業務ロジックの処理でエラーが発生し得る。
SE700は、こうした他の業務ロジックへの改変の影響を予め分析し、その結果をユーザ600に提示して、他の業務ロジックも改変すべきことを提言することが望ましい。ユーザ600による影響箇所の改変の検討を促し、業務ロジック改変後の運用で発生し得るエラーを未然に防ぐためである。
分析サーバ100は、SE700による改変対象の業務ロジックの分析を支援するサーバコンピュータである。分析サーバ100は、ユーザ600の要望に応じた業務ロジックの改変に伴ってSE700により改変すべき改変対象の業務ロジックを特定し、ユーザ600に提示する処理を行う。以下では、「改変」を「変更」と言うことがある。
DBサーバ200,200aは、DBを提供するサーバコンピュータである。DBは、業務ロジックの処理に用いられる。DBサーバ200,200aは、複数のテーブルを記憶する。ここで、第2の実施の形態では、DBとしてRDBを考える。この場合、各業務ロジックによるO/Rマッパーのメソッドの呼出しに応じて、JDBC(Java DataBase Connectivity)のメソッドが呼出される。JDBCは、関係データベースとコネクションを確立し、関係データベースに対してクエリを発行するモジュールである。JDBCが呼出されると、DBの各テーブルを操作するSQL文が出力される。
ここで、DBとして、RDBの他にも、XML(Extensible Markup Language)データベースなどの他の種類のDBを使用してもよい。使用するDBは、複数のデータ項目が予め定義されており、所定のフォーマットのクエリによってデータ操作が行われるものであればよい。その場合、JDBCに代えて、DBの種類に応じたモジュールを用いてDBとのコネクションが確立される。
業務サーバ300,300aは、業務アプリケーションを実行するサーバコンピュータである。業務サーバ300,300aは、AP(APplication)サーバと呼ばれてもよい。例えば、業務サーバ300,300aは、業務アプリケーションに含まれる複数の業務ロジックを分担して実行し、相互に連携して業務アプリケーションの機能をクライアント400に提供する。
ここで、分析サーバ100は、第1の実施の形態の分析支援装置10の一例である。DBサーバ200,200aおよび業務サーバ300,300aによるコンピュータシステムは、第1の実施の形態の業務システム20の一例である。クライアント400は、第1の実施の形態の端末装置30の一例である。クライアント500は、第1の実施の形態の端末装置40の一例である。
図4は、分析サーバのハードウェア例を示すブロック図である。
分析サーバ100は、CPU101、RAM102、HDD103、画像信号処理部104、入力信号処理部105、媒体リーダ106および通信IF(InterFace)107を有する。分析サーバ100の各ハードウェアは、分析サーバ100のバスに接続される。なお、CPU101は、第1の実施の形態の処理部12に対応する。RAM102またはHDD103は、第1の実施の形態の記憶部11に対応する。
CPU101は、プログラムの命令を実行するプロセッサである。CPU101は、HDD103に記憶されたプログラムやデータの少なくとも一部をRAM102にロードし、プログラムを実行する。なお、CPU101は複数のプロセッサコアを含んでもよい。また、分析サーバ100は複数のプロセッサを有してもよい。以下で説明する処理は複数のプロセッサまたはプロセッサコアを用いて並列に実行されてもよい。また、複数のプロセッサの集合を「マルチプロセッサ」または単に「プロセッサ」と言うことがある。
RAM102は、CPU101が実行するプログラムやCPU101が演算に用いるデータを一時的に記憶する揮発性の半導体メモリである。なお、分析サーバ100は、RAM以外の種類のメモリを備えてもよく、複数個のメモリを備えてもよい。
HDD103は、OS(Operating System)やミドルウェアやアプリケーションソフトウェアなどのソフトウェアのプログラム、および、データを記憶する不揮発性の記憶装置である。なお、分析サーバ100は、フラッシュメモリやSSDなどの他の種類の記憶装置を備えてもよく、複数の不揮発性の記憶装置を備えてもよい。
画像信号処理部104は、CPU101からの命令に従って、分析サーバ100に接続されたディスプレイ111に画像を出力する。ディスプレイ111としては、CRT(Cathode Ray Tube)ディスプレイ、液晶ディスプレイ(LCD:Liquid Crystal Display)、プラズマディスプレイ、有機EL(OEL:Organic Electro-Luminescence)ディスプレイなど、任意の種類のディスプレイを用いることができる。
入力信号処理部105は、分析サーバ100に接続された入力デバイス112から入力信号を取得し、CPU101に出力する。入力デバイス112としては、マウス・タッチパネル・タッチパッド・トラックボールなどのポインティングデバイス、キーボード、リモートコントローラ、ボタンスイッチなどを用いることができる。また、分析サーバ100に、複数の種類の入力デバイスが接続されていてもよい。
媒体リーダ106は、記録媒体113に記録されたプログラムやデータを読み取る読み取り装置である。記録媒体113として、例えば、磁気ディスク、光ディスク、光磁気ディスク(MO:Magneto-Optical disk)、半導体メモリなどを使用できる。磁気ディスクには、フレキシブルディスク(FD:Flexible Disk)やHDDが含まれる。光ディスクには、CD(Compact Disc)やDVD(Digital Versatile Disc)が含まれる。
媒体リーダ106は、例えば、記録媒体113から読み取ったプログラムやデータを、RAM102やHDD103などの他の記録媒体にコピーする。読み取られたプログラムは、例えば、CPU101によって実行される。なお、記録媒体113は可搬型記録媒体であってもよく、プログラムやデータの配布に用いられることがある。また、記録媒体113やHDD103を、コンピュータ読み取り可能な記録媒体と言うことがある。
通信IF107は、ネットワーク80に接続され、ネットワーク80を介して他のコンピュータと通信を行うインタフェースである。通信IF107は、例えば、ネットワーク80に属するスイッチやルータなどの通信装置とケーブルで接続される。
DBサーバ200,200a、業務サーバ300,300aおよびクライアント400,500も、分析サーバ100と同様のハードウェアにより実現される。
図5は、DBを介した業務ロジックの連携の例を示す図である。
DBサーバ200,200aは、DB210,220,230,240,250を有する。例えば、DB210,220,230,240,250のうちの幾つかのDBがDBサーバ200に属し、残りのDBがDBサーバ200aに属してもよい。DB210は、テーブル211,212を有する。DB220は、テーブル221,222を有する。DB230は、テーブル231,232を有する。DB240は、テーブル241,242を有する。DB250は、テーブル251,252を有する。
また、業務サーバ300,300aは、業務ロジック310,320,330を有する。例えば、業務ロジック310,320,330のうちの幾つかの業務ロジックが業務サーバ300に属し、残りの業務ロジックが業務サーバ300aに属してもよい。
業務ロジック310は、テーブル211,212のレコードの読出しを行う。業務ロジック310は、テーブル221,222,231,232へのレコードの書込みを行う。業務ロジック320は、テーブル221,222のレコードの読出しを行う。業務ロジック320は、テーブル241,242へのレコードの書込みを行う。業務ロジック330は、テーブル231,232のレコードの読出しを行う。業務ロジック330は、テーブル251,252へのレコードの書込みを行う。
このように、業務ロジック310,320は、DB220を介して非同期に連携する。また、業務ロジック310,330は、DB230を介して非同期に連携する。例えば、業務ロジック310のテーブル212のレコードを読み込んで実行される処理を変更する場合を考える。上記の例の場合、業務ロジック310は、DB220のテーブル221,222、および、DB230のテーブル231,232への書込みを行う。
このため、業務ロジック310に対する変更の影響が、DB220を介して業務ロジック320に及ぶ可能性もあるし、DB230を介して業務ロジック330に及ぶ可能性もある。業務ロジック310による書込み先のDBが増えると、業務ロジック310に対する変更の影響が及ぶ可能性のある業務ロジックが増すことになる。しかし、業務ロジック310の変更の影響の及ぶ範囲が不明であると、変更対象の業務ロジックを適切に絞り込めない。
図6は、変更確認箇所のSEによる特定例を示す図である。
SE700が、ユーザ600による業務ロジックの変更の要望を受け付け、受け付けた要望に応じて変更要否を確認すべき業務ロジックを特定することが考えられる。このとき、SE700は、指定された業務ロジックに関する設計文書や改変履歴文書を参照して、変更対象の業務ロジックを特定し得る。しかし、設計文書や改変履歴文書が失われていると、SE700は、変更対象の業務ロジックを特定することができない。また、設計文書や改変履歴文書が存在していたとしても、これら文書を閲覧して、変更対象の業務ロジックを特定することは容易ではない。
例えば、上記のように業務ロジック310を変更する場合に、当該変更が何れのDBに影響を及ぼし、当該DBを介して業務ロジックに影響を及ぼすかを判断することは難しい。図6では、図5の例に加えて、更に、DB260のレコードの読出し、および、DB270へのレコードの書込みを行う業務ロジック340が例示されている。業務ロジック310は、DB260に対するレコードの書込みも行う。図6の例では、業務ロジック310の変更に伴って、業務ロジック320,330,340の何れを変更すべきであるかを適切に絞り込むことが難しい。
例えば、各業務ロジックのソースコードに対する静的解析により、業務ロジック内の変数の伝搬関係を追跡することで、当該業務ロジックによるDB間(あるいはテーブル間)の関係を特定することも考えられる。しかし、ソースコードが動的束縛によるメソッド呼出しを含む場合、静的解析での変数の伝搬関係の追跡が困難になる。
図7は、動的束縛によるデータ伝搬関係の例を示す図である。
業務ロジック310は、メソッド311,312,313,314,315,316,317,318を呼出す。ここで、一例として、業務ロジック310は、勤怠管理における勤怠打刻管理に関する業務ロジックであるとする。
メソッド311は、例えば、テーブル211から第1の打刻時刻情報を検索するDB検索を行う。メソッド312は、インタフェースにおける抽象メソッドであり、検索された情報を利用する処理のために用意されている。例えば、メソッド312に対する実際の呼出し候補のメソッドは、メソッド312a,312b,312cである。
メソッド312aは、検索された第1の打刻時刻情報に基づく勤怠打刻に関する所定の処理を実行するメソッドである。メソッド312aの処理結果は、メソッド313,314を介して、メソッド315に渡される(ただし、メソッド313,314によりメソッド312aの処理結果が更に加工されることもある)。メソッド315は、当該処理結果に応じた第2の打刻時刻情報をテーブル221に書込む処理を行う。
メソッド312bは、検索された第1の打刻時刻情報に基づく給与計算の処理を実行するメソッドである。メソッド312bの処理結果は、メソッド316を介して、メソッド317に渡される(ただし、メソッド316によりメソッド312bの処理結果が更に加工されることもある)。メソッド317は、当該処理結果に応じた給与の情報をテーブル222に書込む処理を行う。
メソッド312cは、検索された第1の打刻時刻情報の表示に関する処理を実行するメソッドである。メソッド312cの処理結果(例えば、表示画面の情報)は、メソッド318に渡される。メソッド318は、メソッド312cの処理結果をクライアント400に提供し、当該処理結果をクライアント400により表示させる。
上記のようにメソッド312に対して複数の実装候補(例えば、メソッド312a,312b,312c)が存在し、業務ロジック310の実行時に、動的束縛により実際に実装されるメソッドが決定される場合がある。この場合、業務ロジック310のソースコードに対する静的解析だけでは、メソッド312から先の変数の伝搬関係を辿るのが難しくなる。例えば、実装候補のメソッドを全て伝搬先として特定することも考えられるが、変更対象とすべきでない余計なメソッドまで特定されてしまうことになる。
そこで、分析サーバ100は、業務ロジックにおいてインタフェースのように動的束縛によって呼出し先のメソッドが特定される場合にも、変数によるデータ伝搬関係を適切に辿り、業務ロジックによるDB間の関係を特定可能にする。また、分析サーバ100は、業務ロジックによるDB間の関係に基づいて、変更対象の業務ロジックを適切に特定する機能を提供する。
図8は、分析サーバの機能例を示すブロック図である。
分析サーバ100は、ソースコード記憶部120、動作ログ記憶部130、データ伝搬関係記憶部140、動作ログ取得部150、変数分析部160、データ伝搬関係分析部170および変更箇所分析部180を有する。
ソースコード記憶部120、動作ログ記憶部130およびデータ伝搬関係記憶部140は、RAM102またはHDD103の記憶領域を用いて実現される。動作ログ取得部150、変数分析部160、データ伝搬関係分析部170および変更箇所分析部180は、RAM102に記憶されたプログラムをCPU101が実行することで実現される。
ソースコード記憶部120は、業務ロジックのソースコードを記憶する。ソースコードのファイル(ソースファイル)は、業務ロジック毎に存在してもよい。一例として、ソースコードのプログラミング言語はJavaである。
動作ログ記憶部130は、動作ログ取得部150が取得した業務サーバ300,300aによる動作ログを記憶する。動作ログは、DB210,220,230,・・・に対するデータの読出しや書込みの履歴を含む。より具体的には、動作ログは、DBアクセスログ、DBアクセス時に呼出されたメソッドに関する呼出しログ、および、各業務ロジックの実行中におけるスタックトレースを含む。DBアクセスログと呼出しログとは、DBのカラムと当該カラムの値が代入される業務ロジック内の変数との対応関係の特定に用いられる。業務ロジックの実行中のスタックトレースは、業務ロジック内の変数の伝搬関係の追跡(静的解析で辿れない部分の動的解析による補間)に用いられる。
データ伝搬関係記憶部140は、データ伝搬関係分析部170により生成されたデータ伝搬関係テーブルを記憶する。データ伝搬関係テーブルは、伝搬元テーブル/カラムと、伝搬先テーブル/カラムとの業務ロジック毎の対応関係を示す情報である。
動作ログ取得部150は、業務サーバ300,300aから業務ロジック310,320,330,・・・の実行時における動作ログを取得し、動作ログ記憶部130に格納する。
変数分析部160は、ソースコード記憶部120に記憶されたソースコードおよび動作ログ記憶部130に記憶された動作ログに基づいて、DBのテーブルにおけるカラムと業務ロジックにおける変数との対応関係を分析する。また、変数分析部160は、業務ロジックにおける各変数の伝搬を分析する。各変数の伝搬は、第1のメソッドの第1の変数の影響を受ける、第1のメソッドから呼出される第2のメソッドの第2の変数との関係を示す。
データ伝搬関係分析部170は、変数分析部160による各変数の伝搬の分析結果に基づいて、DBのカラムのデータの読出し先の変数からDBのカラムにデータを書込む変数へのデータの伝搬関係を分析し、データ伝搬関係テーブルを生成する。データ伝搬関係分析部170は、データ伝搬関係テーブルをデータ伝搬関係記憶部140に格納する。
変更箇所分析部180は、変更対象業務ロジックの入力181に応じて、データ伝搬関係記憶部140に記憶されたデータ伝搬関係テーブルに基づき、業務ロジック310,320,330,・・・のうちの変更対象箇所を分析する。変更対象業務ロジックの入力181は、クライアント400により行われてもよいし、クライアント500により行われてもよい。変更対象業務ロジックの入力181は、入力デバイス112を用いて行われてもよい。変更箇所分析部180は、分析結果を示す変更確認箇所表示画面182を出力する。例えば、変更確認箇所表示画面182は、クライアント400により表示される。
図9は、DB間のデータ伝搬関係の分析範囲の例を示す図である。
データ伝搬関係分析範囲R1は、業務ロジック310に対するデータ伝搬関係の分析範囲の例である。データ伝搬関係分析範囲R2は、業務ロジック320に対するデータ伝搬関係の分析範囲の例である。
ここで、業務ロジック310のデータの読出し元のテーブルは、テーブル211,212であるとする。業務ロジック310のデータの書込み先のテーブルは、テーブル221,222であるとする。この場合、データ伝搬関係分析範囲R1は、テーブル211,212からの読出し値が代入される変数を起点とし、テーブル221,222への書込み値が代入される変数を終点とする範囲となる。
また、業務ロジック320のデータ読出し元のテーブルは、テーブル221,222であるとする。業務ロジック320のデータ書込み先のテーブルは、テーブル241,242であるとする。この場合、データ伝搬関係分析範囲R2は、テーブル221,222からの読出し値が代入される変数を起点とし、テーブル241,242への書込み値が代入される変数を終点とする範囲となる。
他の業務ロジックのデータ伝搬関係分析範囲についても、同様に、テーブルからの読出し値が代入される変数が起点であり、テーブルへの書込み値が代入される変数が終点である。
図10は、ソースコード内のデータ伝搬関係の追跡例を示す図である。
メソッドm1は、業務ロジック310に対応する最上位のメソッドである。メソッドm1は、テーブル211,212のデータの読出し時にメソッドm2,m3を順に呼出す。
メソッドm3は、テーブル211からデータの読出しを行う際、JDBCライブラリ群302におけるDB読出し用(READ)のモジュール(JDBCモジュール)を呼出す。例えば、JDBCモジュールは、テーブル211に対するselect文を出力し、読出したカラム値を変数j1に代入する。メソッドm3の変数xには、返り値として、変数j1に代入されたカラム値が代入される。
同様に、メソッドm3は、テーブル212からデータの読出しを行う際、JDBCライブラリ群302におけるREADのJDBCモジュールを呼出す。例えば、JDBCモジュールは、テーブル212に対するselect文を出力し、読出したカラム値を変数j2に代入する。メソッドm3の変数yには、返り値として、変数j2に代入されたカラム値が代入される。
また、メソッドm1は、テーブル221,222へのデータの書込み時にメソッドm4,m5を順に呼出す。
メソッドm5は、テーブル221へのデータの書込みを行う際、JDBCライブラリ群302におけるDB書込み用(WRITE)のJDBCモジュールを呼出す。例えば、メソッドm5は、書込み値を変数aに代入し、当該書込み値を引数として、JDBCモジュールを呼出す。JDBCモジュールは、引数として指定された書込み値をJDBCモジュールの変数j3に代入し、変数j3に代入された書込み値をテーブル221に書込む。
同様に、メソッドm5はテーブル222へのデータの書込みを行う際、JDBCライブラリ群302におけるWRITEのJDBCモジュールを呼出す。例えば、メソッドm5は、書込み値を変数bに代入し、当該書込み値を引数として、JDBCモジュールを呼出す。JDBCモジュールは、引数として指定された書込み値をJDBCモジュールの変数j4に代入し、変数j4に代入された書込み値をテーブル222に書込む。
例えば、テーブル221,212から読み出されたデータの他のテーブルへの影響を調べる場合、読み出されたデータが代入された変数(上記の例ではx,y)による他の変数への影響をメソッドを辿ることで特定することが考えられる。しかし、呼出し対象のメソッドの中にインタフェースのように動的に内容が決定されるメソッドが存在すると、静的解析によるメソッドの追跡が難しくなる。
例えば、メソッドm2,m4は、インタフェースのメソッドであり、実際に実行される実装メソッドは、業務ロジック310の実行時に動的に決定される。また、メソッドm2,m4の実装メソッドを提供するオブジェクトの生成コードは、業務ロジック310内には記述されておらず、外部プログラム(例えば、業務アプリケーションのフレームワークなど)により提供される。このため、参照可能なソースコードの静的解析のみでは、メソッドm1からメソッドm2の呼出し関係およびメソッドm2からメソッドm3の呼出し関係を得ることは難しい。同様に、当該ソースコードの静的解析のみでは、メソッドm1からメソッドm4の呼出し関係およびメソッドm4からメソッドm5の呼出し関係を得ることは難しい。
そこで、変数分析部160は、業務ロジック310の動作ログに含まれるDB読出し時のメソッド呼出し履歴を参照し、当該メソッド呼出し履歴に基づいて、実際に実装されたメソッドを決定する。例えば、変数分析部160は、メソッドm2の実装メソッドを決定することで、メソッドm1,m2,m3という呼出し関係を辿る。また、変数分析部160は、メソッドm4の実装メソッドを決定することで、メソッドm1,m4,m5という呼出し関係を辿る。これにより、例えば、変数分析部160は、変数xを起点、変数aを終点とする、メソッドm1,m2,m3,m4,m5内の変数を介したデータ伝搬関係を得ることができる。また、例えば、変数分析部160は、変数yを起点、変数bを終点とする、メソッドm1,m2,m3,m4,m5内の変数を介したデータ伝搬関係を得ることができる。
図11は、業務ロジックのソースコードの例を示す図である。
ソースコード121は、業務ロジック310のソースコードを示す。業務ロジック310は、一例として、勤怠打刻操作(出勤時や退勤時におけるタイムカードによる打刻の操作)に関する業務であるとする。ソースコード121は、ソースコード記憶部120に予め格納される。ソースコード記憶部120は、各業務ロジックに対応するソースコードを記憶する。
勤怠打刻操作に対応するメソッドは、「recordStartWork」(1行目)である。メソッド「recordStartWork」は、「recordPortalTime」(3行目)、「getDate」(7行目)、「findForKey」(9行目)、「addErrorMessage」(13行目)、「getStringDate」(13行目)、「getName」(14行目)、「getApplicationEntity」(18行目)、「getRequestEntity」(20行目)、「getWorkTypeEntity」(22行目)および「getWorkType」(22行目)などのメソッドを呼出す。
このうち、「findForKey」、「getApplicationEntity」、「getRequestEntity」、「getWorkTypeEntity」がインタフェースなどの動的に実装されるメソッドである。ソースコード121における所定の記述(例えば、「interface …」の構文内に含まれるメソッドの記述(図示を省略している))により、インタフェースのメソッドであることが特定される。あるいは、ソースコード記憶部120は、インタフェースにより提供されるメソッドの情報を予め記憶していてもよい。後者の場合、変数分析部160は、ソースコード記憶部120に記憶されたインタフェースにより提供されるメソッドの情報を参照することで、ソースコード121内からインタフェースのメソッドを特定する。
変数分析部160は、ソースコード121の静的解析により、業務ロジック310における変数の伝搬の一部を分析可能である。例えば、7行目の記述によれば、変数「recordTime」は、メソッド「getDate」を介して、変数「targetDate」に伝搬する可能性がある。変数分析部160は、メソッド「getDate」のソースコードを参照することで、例えば、変数「recordTime」の影響が変数「targetDate」に伝搬することを特定する。この場合、変数「recordTime」は、変数「targetDate」に影響するとも言える。
一方、インタフェースのメソッドの場合、実際に呼出されるメソッドが不明であるため、静的解析のみでは変数間の伝搬を特定することが難しい。一例として、インタフェースのメソッド「getRequestEntity」(20行目)に着目する。ソースコード121の場合、メソッド「getRequestEntity」の内容が不明であるため、変数「personalId」および「targetDate」によるオブジェクト「requestEntity」への影響が不明である。
図12は、インタフェースを実装する複数のクラスの例を示す図である。
クラス図900は、インタフェース「RequestUtilBeanInterface」を実装する複数のクラスを例示する。ただし、クラス図900では、属性の区画の記述が省略されている。
インタフェース「RequestUtilBeanInterface」は、メソッド「getRequestEntity」を含む。インタフェース「RequestUtilBeanInterface」内では、メソッド「getRequestEntity」の具体的な処理内容は記述されていない。
例えば、クラス「RequestUtilBean」、「RequestUtilBean2」、「RequestUtilBean3」、・・・という複数のクラスが、インタフェース「RequestUtilBeanInterface」を実装する。各クラスは、同じ名称のメソッド「getRequestEntity」を提供するが、クラス毎に当該メソッドの記述内容は異なる。このため、ソースコード121の静的解析だけでは、ソースコード121の20行目のメソッド「getRequestEntity」として実際に呼出されたメソッドの記述内容を特定することはできない。
図13は、スタックトレースの例を示す図である。
スタックトレース131は、業務ロジック310の実行時におけるメソッドの呼出し履歴である。スタックトレース131の例では、下の行ほど古い時刻であり、上の行ほど新しい時刻である。例えば、スタックトレース131の13行目および14行目は、ユーザ600による所定のGUI(Graphical User Interface)での操作に対応する。また、例えば、スタックトレース131の2行目および3行目は、JDBCライブラリ群302によるDBアクセスに対応する。
例えば、メソッド「getRequestEntity」に着目すると、スタックトレース131の6行目に当該メソッドが記録されている。具体的には、「jp.mosp.time.bean.impl.RequestUtilBean.getRequestEntity」という記録がある。すなわち、スタックトレース131によれば、業務ロジック310の実行時において、クラス「RequestUtilBean」のオブジェクトによって提供されるメソッド「getRequestEntity」が呼出されたことが分かる。変数分析部160は、当該クラスに含まれるメソッドのソースコードを参照することで、変数「personalId」および「targetDate」によるオブジェクト「requestEntity」への影響を分析することが可能となる。
図14は、カラム変数管理テーブルの例を示す図である。
カラム変数管理テーブル132は、動作ログ記憶部130に記憶される。カラム変数管理テーブル132は、勤怠打刻操作の業務ロジック310に対して取得された情報である。動作ログ記憶部130は、業務ロジック毎に、カラム変数管理テーブル132を記憶する。カラム変数管理テーブル132は、R/W(Read/Write)区分、変数、テーブル、カラムおよびスタックトレースの項目を含む。
R/W区分の項目には、テーブルからの読出し(Read)か、テーブルへの書込み(Write)かを示す情報が登録される。変数の項目には、読出しまたは書込み対象のテーブルのカラムに対する変数の変数名と、当該変数を含むオブジェクトのオブジェクト名とを示す情報が登録される。ここで、カラム変数管理テーブル132では、オブジェクト名は、括弧記号で括って記述される。テーブルの項目には、読出し対象または書込み対象のテーブルの名称が登録される。カラムの項目には、読出し対象または書込み対象のカラムの名称が登録される。スタックトレースの項目には、該当の変数を用いた処理が行われたときのメソッドの呼出し関係を示すスタックトレースのファイル名が登録される。
例えば、カラム変数管理テーブル132には、R/W区分が「Read」、変数が「personalId(RequestEntity)」、テーブルが「tmd_holiday_request」、カラムが「personal_id」、スタックトレースが「S1」というレコードが登録されている。このレコードは、テーブル「tmd_holiday_request」のカラム「personal_id」の読出し値が、業務ロジック310のオブジェクト「RequestEntity」に含まれる変数「personalId」に代入されることを示す。また、当該レコードに対応するテーブル読出しが実行された時間帯を含む所定範囲の期間において取得されたスタックトレースのファイル名が「S1」であることを示す。例えば、ファイル名「S1」のスタックトレースは、スタックトレース131に相当する。
また、カラム変数管理テーブル132には、R/W区分が「Read」、変数が「endTime(RequestEntity)」、テーブルが「tmd_holiday_request」、カラムが「end_time」、スタックトレースが「S1」というレコードが登録されている。このレコードは、テーブル「tmd_holiday_request」のカラム「end_time」の読出し値が、業務ロジック310のオブジェクト「RequestEntity」に含まれる変数「endTime」に代入されることを示す。また、当該レコードに対応するテーブル読出しが実行された時間帯を含む所定範囲の期間において取得されたスタックトレースのファイル名が「S1」であることを示す。
また、カラム変数管理テーブル132には、R/W区分が「Write」、変数が「restEnd(TmdRestDto)」、テーブルが「tmd_rest」、カラムが「rest_end」、スタックトレースが「S2」というレコードが登録されている。このレコードは、テーブル「tmd_rest」のカラム「rest_end」への書込み値が、業務ロジック310のオブジェクト「TmdRestDto」に含まれる変数「restEnd」に代入されることを示す。また、当該レコードに対応するテーブル書込みが実行された時間帯を含む所定範囲の期間において取得されたスタックトレースのファイル名が「S2」であることを示す。
ここで、変数分析部160は、動作ログに含まれるDBアクセスログおよびDBアクセス時に呼出されたメソッドに関する呼出しログに基づいて、業務ロジック310に対するカラム変数管理テーブル132を、次のようにして生成する。
一例として、オブジェクト「RequestEntity」の変数「personalId」に着目する。業務ロジック310は、例えば、O/Rマッパーを利用して各DBにアクセスする。ライブラリの挙動はソースコード外部の設定ファイルで定義されることがあり、こうしたライブラリモジュールのソースコードを分析サーバ100は有していない。この場合、ソースコードレベルで見るとライブラリの内部処理がブラックボックスとなる。
そこで、まず、変数分析部160は、業務ロジック310のソースコード121に関する静的解析を行うことで、JDBCモジュールを呼出して当該JDBCモジュールの返り値をオブジェクト「RequestEntity」の変数「personalId」に代入する命令文を検出する。そして、変数分析部160は、当該命令文の実行ログをメソッドに関する呼出しログから抽出し、当該変数「personalId」に代入された返り値を特定する。更に、変数分析部160は、DBアクセスログに含まれるJDBCモジュールが発行したSQL文とその実行結果のログから、特定した返り値を実行結果として取得したときに読み出されたテーブルとカラムとを抽出する。
例えば、変数分析部160は、業務ロジック310の実行ログからオブジェクト「RequestEntity」の変数「personalId」に代入された返り値αを特定する。この場合、変数分析部160は、JDBCモジュールが実行結果αを取得したときのSQL文(select文など)により読出し対象となったテーブル「tmd_holiday_request」のカラム「personal_id」を、DBアクセスログから特定する。これにより、変数分析部160は、オブジェクト「RequestEntity」の変数「personalId」を、テーブル「tmd_holiday_request」のカラム「personal_id」から読み出された値が代入される変数として特定する。同様に、変数分析部160は、例えば、オブジェクト「RequestEntity」の変数「endTime」を、テーブル「tmd_holiday_request」のカラム「end_time」から読み出された値が代入される変数として特定する。この場合、オブジェクト「RequestEntity」の変数「personalId」および「endTime」を読出し側変数と呼べる。変数分析部160は、読出し側変数に対して、R/W区分「Read」を設定する。
次に、オブジェクト「TmdRestDto」の変数「restEnd」について説明する。変数分析部160は、業務ロジック310のソースコード121に関する静的解析を行うことで、オブジェクト「TmdRestDto」の変数「restEnd」を引数として用いて、JDBCモジュールを呼出す命令文を検出する。そして、変数分析部160は、当該命令文の実行ログをメソッドに関する呼出しログから抽出し、当該変数「restEnd」により指定された引数を特定する。更に、変数分析部160は、DBアクセスログに含まれるJDBCモジュールが発行したクエリとその実行結果のログから、特定した引数を書込み値として書き込んだときの書込み先テーブルとカラムとを抽出する。
例えば、変数分析部160は、業務ロジック310の実行ログからオブジェクト「TmdRestDto」の変数「restEnd」に代入された引数βを特定する。この場合、変数分析部160は、JDBCモジュールが書込み値βを書き込んだときのSQL文(insert文など)により書込み先となったテーブル「tmd_rest」のカラム「rest_end」を、DBアクセスログから特定する。これにより、変数分析部160は、オブジェクト「TmdRestDto」の変数「restEnd」を、テーブル「tmd_rest」のカラム「rest_end」に書込む値が代入される変数として特定する。この場合、オブジェクト「TmdRestDto」の変数「restEnd」を書込み側変数と呼べる。変数分析部160は、書込み側変数に対して、R/W区分「Write」を設定する。
更に、変数分析部160は、業務ロジック310によるDBからのデータの読出しと、DBへのデータの書込みとが行われた時間帯に取得されたスタックトレースのファイル名を、それぞれの変数に対応付けて、カラム変数管理テーブル132に記録する。
図15は、データ伝搬関係テーブルの例を示す図である。
データ伝搬関係テーブル141は、データ伝搬関係記憶部140に記憶される。データ伝搬関係テーブル141は、業務、伝搬元テーブル、伝搬元カラム、伝搬先テーブルおよび伝搬先カラムの項目を含む。
業務の項目には、業務ロジックに対応するメソッド名が登録される。伝搬元テーブルの項目には、当該業務ロジックにより読出しの対象となるテーブル(伝搬元テーブル)の名称が登録される。伝搬元カラムの項目には、伝搬元テーブルにおける読出しの対象となるカラム(伝搬元カラム)の名称が登録される。伝搬先テーブルの項目には、当該業務ロジックにより書込みの対象となるテーブル(伝搬先テーブル)の名称が登録される。伝搬先カラムの項目には、伝搬先テーブルにおける書込み対象となるカラム(伝搬先カラム)の名称が登録される。ここで、伝搬先テーブルおよび伝搬先カラムの項目には、該当の業務ロジックにより、伝搬元テーブルおよび伝搬元カラムからの影響を受けるテーブル/カラムが、伝搬先テーブル/伝搬先カラムとして登録される。
例えば、データ伝搬関係テーブル141には、業務が「recordStartWork」、伝搬元テーブルが「tmd_holiday_request」、伝搬元カラムが「end_time」、伝搬先テーブルが「tmd_rest」、伝搬先カラムが「rest_end」というレコードが登録されている。このレコードは、業務ロジック「recordStartWork」により、伝搬元テーブル「tmd_holiday_request」の伝搬元カラム「end_time」の影響が伝搬先テーブル「tmd_rest」の伝搬先カラム「rest_end」に伝搬することを示す。
また、データ伝搬関係テーブル141には、業務が「tweCalcWork」、伝搬元テーブルが「tmd_rest」、伝搬元カラムが「rest_end」、伝搬先テーブルが「slmg_rgs」、伝搬先カラムが「mm_slry」というレコードが登録されている。このレコードは、業務ロジック「tweCalcWork」により、伝搬元テーブル「tmd_rest」の伝搬元カラム「rest_end」の影響が伝搬先テーブル「slmg_rgs」の伝搬先カラム「mm_slry」に伝搬することを示す。
図16は、変更確認箇所表示画面の例を示す図である。
変更確認箇所表示画面182は、データ伝搬関係テーブル141に基づいて、変更箇所分析部180により出力される。変更確認箇所表示画面182は、クライアント400またはクライアント500のディスプレイにより表示されてもよい。変更確認箇所表示画面182は、業務ロジック表示領域F1、変更確認箇所表示領域F2およびDB間関係表示領域F3を有する。
業務ロジック表示領域F1は、業務アプリケーションにおける変更確認の対象箇所のイメージを表示する領域である。当該イメージは、変更確認の対象箇所となる業務ロジックのアイコンと、当該業務ロジックにより読出しまたは書込みの対象となるテーブルのアイコンとを含む。
業務ロジック表示領域F1の例では、業務ロジックによる読出しおよび書込みの関係が矢印画像によって表される。例えば、テーブルを起点とし、業務ロジックを終点とする矢印画像は、業務ロジックによるテーブルからのデータの読出しを示す。また、業務ロジックを起点とし、テーブルを終点とする矢印画像は、業務ロジックによるテーブルへのデータの書込みを示す。
ここで、図16の例では、「業務ロジックaa」および「業務ロジックbb」が変更確認の対象箇所である。また、「テーブルxx」は「業務ロジックaa」による読出し対象テーブルである。「テーブルyy」は「業務ロジックaa」による書込み対象テーブルである。「テーブルyy」は「業務ロジックbb」による読出し対象テーブルでもある。「テーブルzz」は「業務ロジックbb」による書込み対象テーブルである。
なお、業務ロジック表示領域F1では、業務アプリケーションに含まれる複数の業務ロジックと、業務ロジックにより対応関係を有する複数のテーブルとが表示され、その中で、変更確認の対象箇所が強調表示されてもよい。
変更確認箇所表示領域F2は、変更確認の対象箇所となる業務ロジックのリストを表示する領域である。例えば、変更確認箇所表示領域F2には、「業務ロジックaa」および「業務ロジックbb」を示すリストが表示される。
DB間関係表示領域F3は、変更確認対象の業務ロジックによるDB間関係のリストを表示する領域である。例えば、DB間関係表示領域F3には、読出し元の「テーブルxx」と書込み先の「テーブルyy」との関係が表示される。また、DB間関係表示領域F3には、読出し元の「テーブルyy」と書込み先の「テーブルzz」との関係が表示される。更に、DB間関係表示領域F3には、読出し元の「テーブルxx」と書込み先の「テーブルzz」との関係が表示される。これらのうち、3つ目の関係は、「テーブルyy」を介した、「テーブルxx」と「テーブルzz」との関係を示している。
データ伝搬関係テーブル141には、伝搬元カラムと伝搬先カラムとの情報も登録されている。このため、変更箇所分析部180は、DBにおけるテーブル間の関係に加えて、テーブルにおけるカラム間の関係を、DB間関係表示領域F3に含めてもよい。
次に、分析サーバ100による処理手順を説明する。
図17は、データ伝搬関係推定例を示すフローチャートである。
(S10)動作ログ取得部150は、調査する業務ロジックを選択する。例えば、業務アプリケーションに含まれる複数の業務ロジック(メソッド名)とソースファイル名とのリストが動作ログ記憶部130に予め格納される。動作ログ取得部150は、動作ログ記憶部130に記憶された当該リストから未調査の業務ロジックを1つ選択する。
(S11)動作ログ取得部150は、選択した業務ロジックの動作ログを業務サーバ300,300aから取得する。動作ログ取得部150は、取得した動作ログを、動作ログ記憶部130に格納する。これにより、動作ログ記憶部130に、該当の業務ロジックに対するスタックトレースと、カラム変数管理テーブルとが格納される。動作ログ取得部150は、カラム変数管理テーブルの作成方法として、図14で例示した方法を用いることができる。
(S12)変数分析部160は、業務ロジックの静的解析による変数伝搬関係の分析を行う。当該分析の処理の詳細は後述される。
(S13)データ伝搬関係分析部170は、DBカラム値の読出し/書込み間の伝搬関係の特定を行う。当該特定の処理の詳細は後述される。
(S14)動作ログ取得部150は、全ての業務ロジックを調査済であるか否かを判定する。全ての業務ロジックを調査済の場合、ステップS15に処理が進む。全ての業務ロジックを調査済でない場合、ステップS10に処理が進む。
(S15)データ伝搬関係分析部170は、DB間のデータ伝搬関係を出力する。具体的には、データ伝搬関係分析部170は、データ伝搬関係テーブル141を生成し、データ伝搬関係記憶部140に格納する。そして、処理が終了する。
図18は、変数伝搬関係の分析例を示すフローチャートである。
変数伝搬関係の分析は、ステップS12で実行される。
(S20)変数分析部160は、ソースコード記憶部120から、選択した業務ロジックのソースコードを取得する。例えば、前述のように、業務ロジックと当該業務ロジックのソースコードが記述されたソースファイル名とを示すリストが動作ログ取得部150に予め格納される。変数分析部160は、当該情報を参照して、選択した業務ロジックに対するソースコードを取得する。
(S21)変数分析部160は、ソースコードを参照して、選択した業務ロジックについて静的解析の基点となるメソッド(基点メソッド)を選択する。該当の業務ロジックに対して最初にステップS21を実行する場合、変数分析部160は、選択した業務ロジックに対応するメソッド名のメソッド(当該業務ロジックにおける最上位のメソッド)を基点として選択する。それ以後は、変数分析部160は、以下の手順で順次特定される呼出しメソッドを順番に選択する。
(S22)変数分析部160は、ソースコードを参照して、基点メソッドからの呼出しメソッドを1つ選択する。
(S23)変数分析部160は、特定した呼出しメソッドがインタフェースなどの動的に実装されるメソッドであるか否かを判定する。動的に実装されるメソッドの場合、ステップS24に処理が進む。動的に実装されるメソッドではなく、静的解析により単一の呼出しメソッドを特定できる場合、ステップS27に処理が進む。ここで、静的解析により単一の呼出しメソッドを特定できる場合、その呼出しメソッドは、ステップS21による基点メソッドの選択候補となる。
(S24)変数分析部160は、選択した業務ロジックに対応するスタックトレース上に該当のメソッドで示される命令があるか否かを判定する。ある場合、ステップS25に処理が進む。ない場合、ステップS26に処理が進む。
(S25)変数分析部160は、スタックトレースに基づいて実装メソッドを特定する。当該実装メソッドは、ステップS21における基点メソッドの選択候補となる。そして、ステップS27に処理が進む。
(S26)変数分析部160は、可能性のある実装メソッドを全て特定する。例えば、変数分析部160は、該当のメソッド名を有する全てのクラスのソースコードを、ソースコード記憶部120から特定する。当該実装メソッドは、ステップS21における基点メソッドの選択候補となる。そして、ステップS27に処理が進む。
(S27)変数分析部160は、現在の基点メソッドからの呼出しメソッドを全て確認済であるか否かを判定する。全て確認済の場合、ステップS28に処理が進む。全て確認済でない場合、ステップS22に処理が進む。
(S28)変数分析部160は、選択した業務ロジックに関する全てのメソッドを確認したか否かを判定する。当該全てのメソッドを確認した場合、ステップS29に処理が進む。当該全てのメソッドを確認していない場合、ステップS21に処理が進む。なお、「全てのメソッド」とは、選択した業務ロジックのソースコードに含まれるメソッド、当該メソッドを介して呼出される配下のメソッド(他のソースコードに記述されていることもある)を含む。
ステップS21~S28を繰り返し実行することで、変数分析部160は、選択した業務ロジックの最上位のメソッドを頂点として、その配下のメソッドの関係を表す情報を生成する。変数分析部160は、例えば、選択した業務ロジックの最上位のメソッドを頂点とし、その配下のメソッドが、最上位のメソッドからの呼出し順に応じた階層に属するツリー構造を得る。ここで、最上位のメソッドの配下のメソッドは、最上位のメソッドから直接呼出されるメソッド、および、最上位のメソッドから直接呼出されたメソッドを介して間接的に呼出されるメソッドを含む。
(S29)変数分析部160は、業務ロジック内の変数伝搬関係を記録する。具体的には、変数分析部160は、ステップS21~S28を実行することで取得したメソッド間の呼出し関係を基に各メソッドのソースコードを参照し、各メソッドに含まれる変数間の関係を得る。例えば、変数分析部160は、第1のメソッドが第1の変数の代入値を引数として第2のメソッドを呼出し、当該引数の第2のメソッドによる処理結果が第2のメソッド内の第2の変数に代入される場合、第1の変数と第2の変数に伝搬関係があると判断する。そして、変数分析部160は、第1のメソッドおよび第1の変数の組と、第2のメソッドおよび第2の変数との組との間に、第1の変数が第2の変数に影響を与えるという関係をもつことを、中間データとしてRAM102に格納する。変数分析部160は、他のメソッドと変数との組についても同様にして変数伝搬関係を記録する。例えば、第2の変数が第3のメソッドの第3の変数に影響を与える関係をもつこともある。その場合、変数分析部160は、第1の変数の影響が、第2の変数を介して、第3の変数に伝搬するという関係を記録する。変数分析部160は、こうして連鎖的に伝搬する各メソッドの変数間の影響を記録する。そして、処理が終了する。
例えば、変数分析部160は、ソースコード121の中に、呼出し先のメソッド(関数)の複数の候補のうちの1つが業務ロジック310の実行時に呼出されることを示す命令文を検出する。すると、変数分析部160は、業務ロジック310が実行されたときのスタックトレース131に基づいて、複数の候補のうち業務ロジック310の実行時に呼出されるメソッドを特定し、当該メソッドによる変数間の関係を特定する。
図19は、DBカラム値の読出し/書込み間の伝搬関係の特定例を示すフローチャートである。
DBカラム値の読出し/書込み間の伝搬関係の特定は、ステップS13で実行される。
(S30)データ伝搬関係分析部170は、動作ログ記憶部130に記憶されたカラム変数管理テーブルを参照して、DBのカラム値の読出し先の変数を1つ選択する。カラム変数管理テーブル132の例において、R/W区分が「Read」である変数が、DBのカラム値の読出し先の変数(読出し側変数)である。
(S31)データ伝搬関係分析部170は、変数分析部160により作成された変数の伝搬関係を示す中間データに基づいて、ステップS30で選択した変数の影響を分析する。データ伝搬関係分析部170は、分析の結果として、選択した変数により影響を受ける全ての他の変数を得る。
(S32)データ伝搬関係分析部170は、選択した変数(読出し側変数)がDBのカラムに値を書込む変数(すなわち、書込み側変数)に影響があるか否かを判定する。影響がある場合、ステップS33に処理が進む。影響がない場合、ステップS34に処理が進む。例えば、カラム変数管理テーブル132を用いる場合、ステップS31で得られた影響先の他の変数に、カラム変数管理テーブル132でR/W区分が「Write」である変数(書込み側変数)が含まれる場合、書込み側変数に影響があることになる。一方、当該他の変数に、書込み側変数が含まれない場合、書込み側変数に影響がないことになる。
(S33)データ伝搬関係分析部170は、読出し対象カラムと書込み対象カラムの間の選択した業務ロジックによる影響関係を示す情報を作成し、データ伝搬関係記憶部140に格納する。具体的には、データ伝搬関係分析部170は、業務ロジックに対応するメソッド名と、伝搬元テーブル/カラムと、伝搬先テーブル/カラムとの対応関係を示すレコードをデータ伝搬関係テーブル141に登録する。
(S34)データ伝搬関係分析部170は、選択した業務ロジックのカラム変数管理テーブルを参照して、DBのカラム値の読出し先の全ての変数を確認したか否かを判定する。全ての変数を確認した場合、処理が終了する。全ての変数を確認していない場合、ステップS30に処理が進む。
変更箇所分析部180は、変更対象の業務ロジックの入力181に応じて、データ伝搬関係テーブル141に基づき、業務アプリケーションにおける変更箇所特定の処理を実行する。
図20は、業務ロジック変更時の変更箇所特定例を示すフローチャートである。
(S40)変更箇所分析部180は、変更対象の業務ロジックの入力181を受け付ける。例えば、変更対象の業務ロジックは、ユーザ600により、SE700に対して指示される。SE700は、クライアント500または入力デバイス112を用いて、分析サーバ100に対して入力181を与える。入力181は、変更対象の業務ロジックのメソッド名を含む。変更箇所分析部180は、入力181により指定された業務ロジックを変更確認箇所の1つとする。
(S41)変更箇所分析部180は、データ伝搬関係テーブル141を参照して、指示された業務ロジックの変更に対して直接影響を受けるDBのカラムの組(伝搬元テーブル/伝搬元カラムと伝搬先テーブル/伝搬先カラムとの組)を特定する。
(S42)変更箇所分析部180は、DBのカラムの組を1つ選択する。具体的には、変更箇所分析部180は、ステップS41で特定した伝搬元テーブル/伝搬元カラムと、伝搬先テーブル/伝搬先カラムとの組を1つ選択する。
(S43)変更箇所分析部180は、選択したDBのカラムの組に関わる業務ロジックを変更確認箇所に追加する。具体的には、変更箇所分析部180は、ステップS42で選択した組に含まれる伝搬先カラムを伝搬元カラムとしてもつ他の業務ロジックを変更確認箇所に追加する。また、変更箇所分析部180は、他の業務ロジックに対する伝搬先カラムを伝搬元カラムとしてもつ業務ロジックがあれば当該業務ロジックも変更確認箇所として追加し、同様にして、連鎖的に変更確認対象の業務ロジックを決定する。
(S44)変更箇所分析部180は、ステップS41で特定した全てのカラムの組(業務ロジック変更で直接影響を受けるカラムの組)を確認したか否かを判定する。ステップS41で特定した全てのカラムの組を確認した場合、ステップS45に処理が進む。ステップS41で特定した全てのカラムの組を確認していない場合、ステップS42に処理が進む。
(S45)変更箇所分析部180は、ステップS41~S44の処理結果に基づいて変更確認箇所表示画面182を生成し、変更確認箇所表示画面182を出力する。これにより、変更箇所分析部180は、変更確認箇所をユーザ600に提示する。例えば、変更確認箇所表示画面182は、クライアント400のディスプレイに表示されて、ユーザ600に提示されてもよい。あるいは、変更確認箇所表示画面182は、クライアント500のディスプレイまたはディスプレイ111に表示されて、ユーザ600に提示されてもよい。そして、処理が終了する。
このように、変更箇所分析部180は、ユーザ600により改変が希望される業務ロジックの指定を受け付ける。そして、変更箇所分析部180は、データ伝搬関係テーブル141に基づいて、当該業務ロジックと当該業務ロジックの改変の影響を受ける他の業務ロジックとを改変対象の業務ロジックとして特定する。
変更箇所分析部180は、改変対象の業務ロジックにおいて、DB間を関連付ける複数の変数の少なくとも1つを有するメソッド(関数)を改変対象ロジックとして特定してもよい。より具体的には、ステップS45では、変更箇所分析部180は、変数分析部160によるメソッドの呼出し関係および変数の伝搬関係に基づいて、メソッドに関する情報を変更確認対象箇所として出力してもよい。
例えば、変更箇所分析部180は、変更確認箇所表示画面182の内容に加えて、伝搬元テーブル/伝搬元カラムと伝搬先テーブル/伝搬先カラムとを関連付けるメソッドを、変更確認対象として出力することが考えられる。すなわち、変更箇所分析部180は、図10で例示されたように、伝搬元テーブル/伝搬元カラムと伝搬先テーブル/伝搬先カラムとを関連付けるメソッド間の呼出し関係や当該メソッドの変数による影響の伝搬を示す画像を更に出力してもよい。このようにすると、ユーザ600に対し、変更確認箇所として、より詳細な情報を提示することができる。また、SE700による変更確認箇所の詳細な特定を支援することができる。
次に、図18のステップS22で説明した呼出しメソッドの特定例を説明する。
図21は、呼出しメソッドの特定例を示す図である。
ソースコード121において、業務ロジック310(勤怠打刻操作)に対応する最上位のメソッドは、「recordStartWork」(1行目)である。「recordStartWork」が業務ロジック310に対応するメソッド名である。
メソッド「recordStartWork」は、「recordPortalTime」(3行目)、「getDate」(7行目)、「findForKey」(9行目)、「addErrorMessage」(13行目)、「getStringDate」(13行目)、「getName」(14行目)、「getApplicationEntity」(18行目)、「getRequestEntity」(20行目)、「getWorkTypeEntity」(22行目)および「getWorkType」(22行目)などのメソッドを呼出す。したがって、基点メソッドを「recordStartWork」とする場合、当該基点メソッドから呼出されるこれらのメソッドが呼出しメソッドとなる。
変数分析部160は、呼出しメソッドが複数の場合、複数の呼出しメソッドから1つずつ選択して、ステップS22~S27を繰り返し実行する。このうち、「findForKey」、「getApplicationEntity」、「getRequestEntity」、「getWorkTypeEntity」がインタフェースなどの動的に実装されるメソッドである。したがって、これらメソッドに対しては、ステップS24の判定に応じてステップS25またはステップS26の何れかを実行することで、実装メソッドを特定する。
図22は、スタックトレースによる実装メソッドの特定例を示す図である。
例えば、ソースコード121におけるメソッド「getRequestEntity」に着目すると、スタックトレース131の6行目に、「getRequestEntity」を呼出したことが記録されている。変数分析部160は、スタックトレース131に基づいて、メソッド「getRequestEntity」に関して、業務ロジック310で実際に呼出されるメソッドを提供するクラス「RequestUtilBean」を特定する。このため、変数分析部160はクラス「RequestUtilBean」のソースコードを参照することで、当該クラスにおけるメソッド「getRequestEntity」の定義内容を確認し、変数の伝搬関係を追跡することが可能になる。
図23は、変数の伝搬関係の追跡例を示す図である。
ソースコード121の20行目によれば、メソッド「getRequestEntity」の出力は、RequestEntity型のオブジェクト「requestEntity」である。オブジェクト「requestEntity」のソースコード122によれば、当該オブジェクトは、field変数として、「personalId」および「endTime」を含む。なお、変数「personalId」および「endTime」は、カラム変数管理テーブル132におけるテーブル「tmd_holiday_request」に対する読出し側変数に相当している。
例えば、クラス「RequestUtilBean」のメソッド「getRequestEntity」のソースコードに基づき、次の変数間の関係を検出する。変数分析部160は、メソッド「recordStartWork」の変数「personalId」が、オブジェクト「RequestEntity」の変数「personalId」に影響することを検出する。変数分析部160はメソッド「recordStartWork」の変数「targetDate」が、オブジェクト「requestEntity」の変数「endTime」に影響することを検出する。
こうして、実装メソッドが動的に決定される場合にも、変数分析部160は、変数の伝搬関係を追跡することができる。
次に、オブジェクト「requestEntity」に格納された変数の伝搬関係の追跡を例示する。
図24は、変数の伝搬関係の追跡例(続き)を示す図である。
ソースコード121の25行目によれば、「requestEntity」を引数としてメソッド「getEndTime」が呼出される。メソッド「getEndTime」の処理結果は、メソッド「registRest」により、オブジェクト「restList」に格納される。メソッド「getEndTime」および「registRest」のソースコードによれば、「requestEntity」のfield変数である「personalId」の値および「endTime」の値がオブジェクト「restList」の2つのfield変数に影響を及ぼす。例えば、オブジェクト「restList」の第1の変数に、「requestEntity」の変数「personalId」の値(あるいは、加工された値)が代入される。また、オブジェクト「restList」の第2の変数に、「requestEntity」の変数「endTime」の値(あるいは、加工された値)が代入される。
そして、ソースコード121の27行目によれば、オブジェクト「restList」のfield変数の値が、オブジェクト「restDto」のfield変数に代入される。例えば、オブジェクト「restDto」は、field変数として、「restEnd」を含む。そして、「restList」の第2の変数の値が、「restDto」の変数「restEnd」に代入される。すなわち、当該変数「restEnd」はオブジェクト「requestEntity」がもつ変数「endTime」と伝搬関係にある。
更に、ソースコード121の29行目によれば、「restDto」を引数としてメソッド「regist」が呼出される。メソッド「regist」のソースコードによれば、「restDto」がもつ変数「restEnd」の値は、オブジェクト「TmdRestDto」のfield変数である「restEnd」に代入される。すなわち、オブジェクト「restDto」の変数「restEnd」は、オブジェクト「TmdRestDto」の変数「restEnd」と伝搬関係にある。
なお、図24で例示したメソッドにおいて、実装メソッドが動的に決定されるものがある場合、変数分析部160は、当該メソッドについて、前述のようにスタックトレースに基づいて、実装メソッドを特定する。
ここで、オブジェクト「TmdRestDto」の変数「restEnd」は、カラム変数管理テーブル132に登録された書込み側変数に相当する。したがって、上記の変数伝搬の分析により、変数分析部160は、オブジェクト「RequestEntity」の変数「endTime」に代入される値が、オブジェクト「TmdRestDto」の変数「restEnd」に影響することを特定する。
データ伝搬関係分析部170は、変数分析部160により特定された変数間の影響の情報とカラム変数管理テーブル132とを参照することで、例えば、伝搬元テーブル「tmd_holiday_request」、伝搬元カラム「end_time」、伝搬先テーブル「tmd_rest」、伝搬先カラム「rest_end」の業務ロジック310(recordStartWork)による関係を特定する。そして、データ伝搬関係分析部170は、特定した関係をデータ伝搬関係テーブル141に登録する。
ここで、データ伝搬関係テーブル141が得られている場合に、変更対象の業務ロジックとして、分析サーバ100に対して、業務ロジック310(recordStartWork)が指示されたとする。この場合、変更箇所分析部180は、データ伝搬関係テーブル141に基づいて、「recordStartWork」に対応する伝搬元テーブル/伝搬元カラムと伝搬先テーブル/伝搬先カラムとを特定する(ステップS41,S42に相当)。そして、変更箇所分析部180は、データ伝搬関係テーブル141を参照して、特定した伝搬先テーブル/伝搬先カラムが、伝搬元テーブル/伝搬元カラムとして登録されているレコードを検索する。図15のデータ伝搬関係テーブル141の例では、業務「tweCalcWork」のレコードが該当する。すなわち、変更箇所分析部180は、業務ロジック310の変更に伴って、業務ロジック「tweCalcWork」も変更確認箇所として特定する(ステップS43に相当)。
なお、変更箇所分析部180は、ステップS43では、業務ロジック「tweCalcWork」の伝搬先テーブル「slmg_rgs」の伝搬先カラム「mm_slry」を伝搬元テーブル/伝搬元カラムとしてもつ他の業務ロジックを更に検索する。こうして、変更箇所分析部180は、DBのテーブルを介して関連する業務ロジックを変更確認箇所として連鎖的に特定していく。そして、変更箇所分析部180は、特定した変更確認箇所の一覧を示す変更確認箇所表示画面182を出力する。
分析サーバ100によれば、DB210,220,230,・・・を介して連携する複数の業務ロジックに関して、ある業務ロジックの変更に伴う変更対象ロジックを適切に特定し、ユーザ600に提示可能になる。特に、分析サーバ100は、各業務ロジックのソースコードに対して、静的解析と動的解析とを組み合せることで、静的解析で追跡できない変数の伝搬を動的解析により補間して、業務ロジックにおける変数の影響の伝搬を適切に追跡できる。このため、実行される手続きが動的束縛により決定される場合にも、ある業務ロジックによるDB間の関係を特定可能になる。その結果、変更対象ロジックの抽出漏れを低減し、変更対象ロジックの抽出精度を向上させることができる。
なお、第1の実施の形態の情報処理は、処理部12にプログラムを実行させることで実現できる。また、第2の実施の形態の情報処理は、CPU101にプログラムを実行させることで実現できる。プログラムは、コンピュータ読み取り可能な記録媒体113に記録できる。
例えば、プログラムを記録した記録媒体113を配布することで、プログラムを流通させることができる。また、プログラムを他のコンピュータに格納しておき、ネットワーク経由でプログラムを配布してもよい。コンピュータは、例えば、記録媒体113に記録されたプログラムまたは他のコンピュータから受信したプログラムを、RAM102やHDD103などの記憶装置に格納し(インストールし)、当該記憶装置からプログラムを読み込んで実行してもよい。