(57)【特許請求の範囲】
【請求項１】
オブジェクト指向プログラミングにおけるメソッドとメンバ変数とを含む親クラス及び子クラスによって階層構造をなすソースコードに対応した検出対象プログラムの実行処理をコンピュータを用いて確認する方法であって、
前記検出対象プログラムのソースコードを解析し、クラスの承継及び各クラスにおけるメソッドの実装の定義を含むクラス情報を、前記コンピュータのソースコード解析部により、取得するソースコード解析ステップと、
前記クラス情報に基づいて、前記親クラスのオーバライドされていないメソッドを呼び出す順番を規定するメソッド系列を、前記コンピュータのメソッド系列構成部により、構成するメソッド系列構成ステップと、
オーバライドされる前記親クラスの評価対象メソッド、及びオーバーライドする前記子クラスの評価対象メソッドを呼び出す前の、それぞれのクラスにおけるメンバ変数の値を前提条件として、前記コンピュータの入力部を介してのユーザー指示に応じて設定する前提条件指定ステップと、
前記前提条件、前記親クラスの評価対象メソッド、及び前記メソッド系列から前記親クラスの評価対象メソッドを起点とする実行系列を作成するとともに、前記前提条件、前記子クラスの評価対象メソッド、及び前記メソッド系列から前記子クラスの評価対象メソッドを起点とする実行系列を、前記コンピュータの実行系列作成部により、作成する実行系列作成ステップと、
作成された前記親クラスにおける実行系列及び前記子クラスにおける実行系列に従って前記検出対象プログラムを、前記コンピュータのプログラム実行部によりそれぞれ実行するプログラム実行ステップと、
該プログラム実行ステップで、前記各実行系列に従った実行時におけるメソッド内の命令文の実行順序を示すパスを、前記コンピュータのパス記録部によりそれぞれ記録するパス記録ステップと、
前記親クラスにおける実行系列及び前記子クラスにおける実行系列について記録されたそれぞれのパスを、前記コンピュータのパス比較部により比較して比較結果を求めるパス比較ステップと
を有することを特徴とするプログラムの実行処理確認方法。
【請求項２】
前記パス比較ステップによる比較結果に従い、それぞれのパスの差分からメソッドのオーバライドが及ぼす影響を、前記コンピュータのパス評価部により評価するパス評価ステップと、
評価結果を出力する出力ステップと
をさらに備えることを特徴とする請求項１記載のプログラムの実行処理確認方法。
【請求項３】
前記メソッド系列構成ステップでは、前記コンピュータの入力部を介してのユーザー指示に応じて指定された系列長を制約条件として、前記メソッド系列を構成することを特徴とする請求項１記載のプログラムの実行処理確認方法。
【請求項４】
前記メソッド系列構成ステップでは、前記コンピュータの入力部を介してのユーザー指示に応じて指定されたメソッドの除外を制約条件として、前記メソッド系列を構成することを特徴とする請求項１記載のプログラムの実行処理確認方法。
【請求項５】
オブジェクト指向プログラミングにおけるメソッドとメンバ変数とを含む親クラス及び子クラスによって階層構造をなすソースコードに対応した検出対象プログラムの実行処理を確認するプログラムであって、コンピュータに、
前記検出対象プログラムのソースコードを解析させ、クラスの承継及び各クラスにおけるメソッドの実装の定義を含むクラス情報を取得させるソースコード解析ステップと、
前記クラス情報に基づいて、前記親クラスのオーバライドされていないメソッドを呼び出す順番を規定するメソッド系列を構成させるメソッド系列構成ステップと、
オーバライドされる前記親クラスの評価対象メソッド、及びオーバーライドする前記子クラスの評価対象メソッドを呼び出す前の、それぞれのクラスにおけるメンバ変数の値を前提条件として、前記コンピュータの入力部を介してのユーザー指示に応じて設定させる前提条件指定ステップと、
前記前提条件、前記親クラスの評価対象メソッド、及び前記メソッド系列から前記親クラスの評価対象メソッドを起点とする実行系列を作成させるとともに、前記前提条件、前記子クラスの評価対象メソッド、及び前記メソッド系列から前記子クラスの評価対象メソッドを起点とする実行系列を作成させる実行系列作成ステップと、
作成された前記親クラスにおける実行系列及び前記子クラスにおける実行系列に従って前記検出対象プログラムをそれぞれ実行させるプログラム実行ステップと、
該プログラム実行ステップで、前記各実行系列に従った実行時におけるメソッド内の命令文の実行順序を示すパスを記録させるパス記録ステップと、
前記親クラスにおける実行系列及び前記子クラスにおける実行系列について記録されたそれぞれのパスを、前記コンピュータのパス比較部により比較して比較結果を求めさせるバス比較ステップと
を有する処理を実行させることを特徴とするプログラムの実行処理確認プログラム。
【請求項６】
前記パス比較ステップによる比較結果に従い、それぞれのパスの差分からメソッドのオーバライドが及ぼす影響を評価させるパス評価ステップと、
評価結果を出力させる出力ステップと
をさらに備えることを特徴とする請求項５記載のプログラムの実行処理確認プログラム。
【請求項７】
前記メソッド系列構成ステップでは、前記コンピュータの入力部を介してのユーザー指示に応じて指定された系列長を制約条件として、前記メソッド系列を構成させることを特徴とする請求項５記載のプログラムの実行処理確認プログラム。
【請求項８】
前記メソッド系列構成ステップでは、前記コンピュータの入力部を介してのユーザー指示に応じて指定されたメソッドの除外を制約条件として、前記メソッド系列を構成させることを特徴とする請求項５記載のプログラムの実行処理確認プログラム。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、オブジェクト指向プログラミングにおける、メソッドのオーバライドが及ぼす影響度評価を目的としたプログラムの実行処理確認方法及び実行処理確認プログラムに関する。
【０００２】
【従来の技術】
オブジェクト指向プログラミングにおいて、クラスは階層構造を持つことができる。この階層構造においては、子クラスは親クラスとしての振る舞いを兼ね備えたものと期待されることが一般的である。
【０００３】
また、カプセル化は、あるクラス内のメンバ変数を他のクラスから直接アクセスできないようにする手法であるが、その子クラスからのアクセスを許す場合がある（例えばＣ＋＋言語では、アクセスレベルがprotectedであるメンバ変数）。つまり、子クラスが親クラスのメンバ変数を直接変更することができる場合がある。このようなメンバ変数の直接的な変更には、子クラスが親クラスのメソッドの書き換え（あるいは再定義）を行うオーバライドがある。
【０００４】
このようなオーバライドにおいて問題となるのは、子クラスが、親クラスのメソッドをオーバライドする際に、親クラスのメンバ変数を（不正に）変更してしまった結果、後々、親クラスの他のメソッドが正常に動作しなくなる可能性がある点である。
【０００５】
このように子クラスによってオーバライドされたメソッドをテストするときには、オーバライドされたメソッドに対してのみテストを行うことが多い。このような場合に問題となるのは、オーバライドされたメソッド自体の振る舞いが正しいとしても、オーバライドが親クラスに及ぼす影響を考慮しなければならない点である。
【０００６】
【発明が解決しようとする課題】
しかしながら、特に子クラスのテストをしている場合には、親クラスにまで注意が向けられないことが多い。あるいは、親クラスに注意が向けられたとしても、子クラスがオーバライドしたメソッドが親クラスの他のメソッドへ及ぼす影響、すなわちオーバライドが親クラスとしての振る舞いに及ぼす影響を考慮するのは困難であった。
【０００７】
本発明は、上述の課題に鑑みてなされたものであり、子クラスが親クラスにおけるメソッドをオーバライドした際に、親クラスとしての振る舞いに及ぼす影響を示す情報を容易に確認できるプログラムの実行処理確認方法及び実行処理確認プログラムを提供することを目的とする。
【０００８】
【課題を解決するための手段】
上述の問題を解決するために、本発明は、オブジェクト指向プログラミングにおけるメソッドとメンバ変数とを含む親クラス及び子クラスによって階層構造をなす検出対象ソースコードに対応した検出対象プログラムの実行処理をコンピュータを用いて確認する方法であって、検出対象プログラムのソースコードを解析し、クラスの承継及び各クラスにおけるメソッドの実装の定義を含むクラス情報を、コンピュータのソースコード解析部により、取得するソースコード解析ステップと、クラス情報に基づいて、親クラスのオーバライドされていないメソッドを呼び出す順番を規定するメソッド系列を、コンピュータのメソッド系列構成部により、構成するメソッド系列構成ステップと、オーバライドされる親クラスの評価対象メソッド、及びオーバーライドする子クラスの評価対象メソッドを呼び出す前の、それぞれのクラスにおけるメンバ変数の値を前提条件として、コンピュータの入力部を介してのユーザー指示に応じて設定する前提条件指定ステップと、前提条件、親クラスの評価対象メソッド、及びメソッド系列から親クラスの評価対象メソッドを起点とする実行系列を作成するとともに、前提条件、子クラスの評価対象メソッド、及びメソッド系列から子クラスの評価対象メソッドを起点とする実行系列を、コンピュータの実行系列作成部により、作成する実行系列作成ステップと、作成された親クラスにおける実行系列及び子クラスにおける実行系列に従って検出対象プログラムを、コンピュータのプログラム実行部によりそれぞれ実行するプログラム実行ステップと、プログラム実行ステップで、前記各実行系列に従った実行時におけるメソッド内の命令文の実行順序を示すパスを、コンピュータのパス記録部によりそれぞれ記録するパス記録ステップと、親クラスにおける実行系列及び子クラスにおける実行系列について記録されたそれぞれのパスを、コンピュータのパス比較部により比較して比較結果を求めるパス比較ステップとを有することを特徴とする。
【０００９】
ここで、プログラム実行ステップにおいて実行されるパスには、例えば、実行系列中の各メソッド内の命令文の実行順序等が含まれる。
【００１０】
また、他の発明は、オブジェクト指向プログラミングにおけるメソッドとメンバ変数とを含む親クラス及び子クラスによって階層構造をなすソースコードに対応した検出対象プログラムの実行処理を確認するプログラムであって、コンピュータに、検出対象プログラムのソースコードを解析させ、クラスの承継及び各クラスにおけるメソッドの実装の定義を含むクラス情報を取得させるソースコード解析ステップと、クラス情報に基づいて、親クラスのオーバライドされていないメソッドを呼び出す順番を規定するメソッド系列を構成させるメソッド系列構成ステップと、オーバライドされる親クラスの評価対象メソッド、及びオーバーライドする子クラスの評価対象メソッドを呼び出す前の、それぞれのクラスにおけるメンバ変数の値を前提条件として、コンピュータの入力部を介してのユーザー指示に応じて設定させる前提条件指定ステップと、前提条件、親クラスの評価対象メソッド、及びメソッド系列から親クラスの評価対象メソッドを起点とする実行系列を作成させるとともに、前提条件、子クラスの評価対象メソッド、及びメソッド系列から子クラスの評価対象メソッドを起点とする実行系列を作成させる実行系列作成ステップと、作成された親クラスにおける実行系列及び子クラスにおける実行系列に従って検出対象プログラムをそれぞれ実行させるプログラム実行ステップと、プログラム実行ステップで、前記各実行系列に従った実行時におけるメソッド内の命令文の実行順序を示すパスを記録させるパス記録ステップと、親クラスにおける実行系列及び子クラスにおける実行系列について記録されたそれぞれのパスを、コンピュータのパス比較部により比較して比較結果を求めさせるバス比較ステップとを有する処理を実行させることを特徴とする。
【００１１】
これらの発明では、検出対象プログラムを実行処理する際の、前提条件、評価対象メソッド及びメソッド系列から親クラス及び子クラスそれぞれの評価対象メソッドを起点とする実行系列を作成し、これらの実行系列に従ってプログラムを実行した際における、実行経路を示すパスを記録し、実装されているクラスだけが異なる評価対象メソッドの各実行系列、すなわち親クラス及び子クラスにおける実行系列に対してそれぞれ記録されたパスを比較して比較結果を求める。
【００１２】
そして、実装されているクラスだけが異なる評価対象メソッドの実行時のパスの比較結果は、子クラスが親クラスにおけるメソッドをオーバライドした際に、親クラスの振る舞いに及ぼす影響を示すこととなる。従って、本発明では、子クラスが親クラスにおけるメソッドをオーバライドした際に、親クラスとしての振る舞いに及ぼす影響を示す情報を容易に得ることができる。
【００１３】
また、このように検出された情報を利用することにより、例えばあるクラスに対して複数の子クラスが存在する場合に、影響度が大きい子クラスをより重点的にテストしたり、差分発生長の小さい実行系列をチェックしたり、影響が出やすい条件（変数の値等）に対してのみ動作チェックをしたりする等の対応が容易になる。これにより、本発明は、プログラムの効率的なテスト・デバッグ作業に寄与することができる。
【００１４】
【発明の実施の形態】
以下に本発明の実施形態に係るプログラムの実行処理確認方法及び実行処理確認プログラムについて詳細に説明する。なお、本実施形態では、例えばプロセッサ（ＭＰＵ）、メモリ、ハードディスクドライブ（ＨＤＤ）等の補助記憶装置、キーボード等の入力装置、ディスプレイ装置，プリンタ等の出力装置を備えるパーソナルコンピュータ，ワークステーション等の情報処理装置においてプログラムのデバッグを行ういわゆるデバッガ（プログラム）に適用する場合を例に説明する。
【００１５】
すなわち、本実施形態に係るデバッガは、例えば情報処理装置を構成するハードウェアの制御等を実行するオペレーティングシステム（ＯＳ）の制御下、後述する実行処理確認プログラムをＭＰＵで実行することにより実現することができる。なお、情報処理装置では、プログラム開発環境として、このデバッガ以外に、例えばソースコードの入力・編集等を行うエディタ、ソースコードから実行プログラムを生成するコンパイラ，リンカ等が含まれている。
【００１６】
ユーザがエディタを操作して入力・編集を行った後、コンパイラ，リンカに実行プログラムの生成を指示することにより、ソースコードに対応する実行プログラムが生成される。
【００１７】
このように生成された実行プログラムは、デバッガの管理下で実行させることができる。デバッガは、例えばプログラム中の変数の値等の前提条件を設定したり、実行中のプログラムの位置を検出（トレース）することができるようになっている。
【００１８】
ＭＰＵがデバッガを実行することにより、情報処理装置は、例えば図１に示すような機能を有する影響度評価装置として機能する。この図１では、デバッガの実行によって実現される機能と、評価対象プログラム，前提条件等のデータの流れと、補助記憶装置に設けられた評価対象のプログラムのソースコードが格納されるソースコード格納領域２ａ，当該ソースコードに対応するバイナリコード（実行プログラム）が格納される実行プログラム格納領域２ｂ等を概念的に示している。
【００１９】
（処理概要）
オブジェクト指向のプログラムでは、下位クラス（子クラス）が上位クラス（親クラス）のメソッドの書き換え（あるいは再定義）、すなわちオーバライドをすることができるようになっている。
【００２０】
この影響度評価装置は、このように子クラスが親クラスのメソッドをオーバライドした際に、オーバライドによって親クラスとしての振る舞いにどの程度影響を及ぶかを評価する。
【００２１】
この評価方法の基本となるのは、オーバライドされた若しくはオーバライドされるメソッドに続いて実行される親クラス内の他のメソッドのパスの変化の計測である。ここでいうパスとは、各メソッド内の命令文中に存在する分岐文においてどのような経路を辿ったか、ということを示している。このパスは、デバッガが有するトレース機能によって、実行ログに記録される。
【００２２】
パスの変化の計測は、具体的には、例えば図２に示すような２つの実行系列があった場合に、これらの２つの実行系列の実行ログからパスを比較し、どの時点で差が発生するかを基本的な評価基準として行う。この図２は、親クラスにおいて実装されているメソッドの実行順序（実行系列１）と、子クラスからメソッドのオーバライドを行った場合のメソッドの実行順序（実行系列２）を示している。各々のメソッド内には、具体的な命令文が定義されている。
【００２３】
これらの実行系列間のパスの変化の計測結果は、例えばあるメソッド内の命令文中のある分岐文において、一方の実行系列ではtrue（真）、他方の実行系列ではfalse（偽）になった等として得られる。このように、分岐文における判断結果が異なる場合には、各々の実行系列は異なるパスで実行されていることになる。
【００２４】
（サンプル中のクラスの例）
図３から図５は、サンプルとしてＣ＋＋言語を用いた場合のソースコード例を示している。このソースコードは、図３から図５までで１つのソースコードを構成しており、例えば自動車等のエンジンを制御するプログラムである。
【００２５】
このソースコード中の図３中に示す部分では、最上位の親クラス（Engine）と、このEngineクラスを継承したクラス（HighSpeedEngine，GoBackEngine，BackEngine）とからなるクラス群が定義されている。また、図４中に示す部分では、Engineクラス中の各メソッドの実装を示す命令文が定義されており、図５中に示す部分では、Engineクラスにおけるオーバライド対象のメソッド｛go（）｝及び各クラス（HighSpeedEngine，GoBackEngine，BackEngine）においてオーバライドするメソッド｛go（）｝の実装を示す命令文が定義されている。
【００２６】
Engineクラス中では、図６に示すような属性を有するメンバ変数（fuel，curPos，time）と、図７に示すような属性を有するメソッド｛getFuelLevel（），addFuel（），getSpeed（），go（）｝とが定義されている。なお、この図７中に示すメソッド｛go（）｝は、仮想関数であり、下位のクラス（HighSpeedEngine，GoBackEngine，BackEngine）でオーバライドされるメソッドである。
【００２７】
Engineクラスを継承した各々のクラス（HighSpeedEngine，GoBackEngine，BackEngine）は、各々Engineクラスに比較して進む速度が速いエンジンを表したクラス（HighSpeedEngine）、前進後進の切り替え可能なエンジンを表したクラス（GoBackEngine）、後進のみのエンジンを表したクラス（BackEngine）である。いずれのクラスにおいても、メソッドEngine::go（）をオーバライドする命令文が定義されている。
【００２８】
以上の各クラスは、例えば図８に示すように、Engineクラスを上位クラスとする階層図で表される。
【００２９】
上述の影響度評価装置は、親クラス中のメソッドを、親クラスを承継するクラス中のメソッドによってオーバライドした際に、このオーバライドが、親クラスの振る舞いに対して、どの程度影響を与えるかを評価することを目的としている。具体的には、上述の例では、例えば上述の図５に示すEngineクラス中のメソッドgo（）を、HighSpeedEngine，GoBackEngine，BackEngine中で定義したメソッドによってオーバライドしてHighSpeedEngine::go（），GoBackEngine::go（），BackEngine::go（）とした場合に、これらのオーバライドが、Engineクラスの振る舞いに対して、どの程度影響を与えるかを評価する。
【００３０】
また、この影響度評価装置は、メソッドのオーバライドが、親クラスの振る舞いに大きな影響度を持つ場合に、親クラスに振る舞い影響が出る状況を特定することを目的としている。
【００３１】
（構成）
次いで、本実施形態に係る影響度評価装置について説明する。この影響度評価装置は、上述の図１に示すように、例えば入力装置を介してユーザ１からの指示等を入力する入力部１０と、ソースコード格納領域２ａに格納されたソースコードを読み出して解析するソースコード解析部１１と、ユーザからの指示に応じて評価対象となるメソッドを設定する対象メソッド指定部１２と、ユーザからの指示に応じてメソッド系列を指定するための条件を設定するメソッド系列条件指定部１３と、メソッド系列を構成するメソッド系列構成部１４と、ユーザからの指示に応じて前提条件を設定する前提条件指定部１５と、実行系列を構成する実行系列作成部１６と、構成された実行系列に従って実行プログラムを実行するプログラム実行部１７と、実行系列の実行時のパス（メソッド内部の実行経路）を記録するパス記録部１８と、実装されているクラスだけが異なるメソッド系列の実行系列の実行時のパスを比較するパス比較部１９と、パスの比較結果を評価するパス評価部２０と、パス比較部１９の比較結果あるいはパス評価部２０の評価結果を出力装置を介して出力する出力部２１とを備えている。
【００３２】
なお、本実施形態に係る影響度評価装置の各部は、後述する実行処理確認プログラムを情報処理装置で実行することにより、汎用のコンピュータやワークステーション等のハードウェア資源を用いて実現される。
【００３３】
（ソースコード解析部）
ソースコード解析部１１は、ソースコード格納領域２ａに格納されている評価対象プログラムのソースコードを読み出して解析する。このソースコード解析部１１が解析結果として取得すべき内容は、ソースコード中で定義されているクラスと、各々のクラスに含まれるメンバ変数・メソッドと、各々のクラスの階層構造である。これらの内容は、ソースコード等の文字列の構造を解析する一般的なパーサを用いて抽出することができる。
【００３４】
（評価対象メソッド指定部）
対象メソッド指定部１２は、オーバライドされるメソッドを指定する。あるメソッドのオーバライドが、親クラスとしての振る舞いにどの程度影響を及ぼすか評価するためには、評価対象となる親クラスのメソッドを指定する必要がある。この影響度評価装置では、ユーザが入力部１０を介して評価対象となるメソッドを指定することができるようになっている。これにより、あるクラス階層において、メソッド及び当該メソッドがオーバライドされたメソッドが複数組存在する場合には、ユーザは、どのメソッドのオーバライドを評価するのかを指定することができる。
【００３５】
また、この対象メソッド指定部１２では、ユーザがメソッドを指定しない場合に、すべてのオーバライドされるメソッドに対して、そのオーバライドを評価する。あるいは、例えば先頭のメソッド等をデフォルトのメソッドとして規定しておいてもよい。
【００３６】
上述のEngineクラスの場合では、オーバライドされるメソッドは、１つしか存在しないので、自動的にメソッドEngine::go（）に対するオーバライドが評価対象となる。
【００３７】
（メソッド系列条件指定部）
最初に「メソッド系列」という言葉について説明する。この影響度評価装置では、実行時に、評価対象となるメソッドに引き続いて、親クラスのみにおいて定義されているメソッド（オーバライドされていないメソッド）を順次呼び出す。例えば上述のEngineクラスの例では、go（）［オーバライドされる／オーバライドされたメソッド］→getFuelLevel（）→addFuel（）→・・・といった順序でメソッドが呼び出される。このようなメソッドの呼び出し順序をメソッド系列と呼ぶ。
【００３８】
メソッド系列条件指定部１３は、影響度の評価に用いるメソッド系列の最長の長さ（系列長）とメソッド系列を構成するメソッドを指定することができるようになっている。
【００３９】
・系列長の指定
メソッド系列の長さは、原理上無限に長くすることができる。しかしながら、あまりに系列長が長いと、プログラムを実行する上で時間がかかりすぎてしまう。このため、現実的には、ユーザが適当な長さでメソッド系列を打ち切る必要がある。このため、メソッド系列条件指定部１３はユーザがメソッド系列の最長の長さを指定した場合には指定された長さを系列長とし、ユーザが最長の長さを指定しない場合は、デフォルト値を適当に決めておいて、それを使用する。
【００４０】
・系列を構成するメソッドの指定
上述のEngineクラスの例では、メソッド系列を構成するために、親クラス（Engine）で定義されているオーバライドされていないメソッドすべてを用いている。しかし、ユーザが不必要だと判断したメソッドは、メソッド系列から除外するよう指定してもよい。すなわち、メソッド系列条件指定部１３は、ユーザが何も指定しない場合には、Engineクラスに定義されているオーバライドされていないすべてのメソッド｛getFuelLevel（），addFuel（），getSpeed（）｝を用いてメソッド系列を構成するが、ユーザが例えばaddFuel（）はメソッド系列に含めない旨を指定すると、残りの２つのメソッド｛getFuelLevel（），getSpeed（）｝のみを用いてメソッド系列を構成する。
【００４１】
なお、系列長とメソッド系列を構成するメソッドは、必要とする解析精度、制御負荷等を考慮して適当に設定するが、以下、系列長を４とし、系列を構成するメソッドを「Engineクラスに定義されているオーバライドされていないメソッドすべて」とした場合について説明する。
【００４２】
（メソッド系列構成部）
メソッド系列構成部１４は、評価対象のメソッドに引き続いて呼び出すメソッドの系列を構成する。このメソッド系列を構成するメソッドは、上述のメソッド系列条件指定部１３で指定されたメソッドである。なお、この場合では、上述の前提のように、メソッド系列を構成するメソッドは、Engineクラスのオーバライドされていないメソッドすべてである。
【００４３】
この影響度評価装置では、単純にメソッドを順番に組み合わせるだけでメソッド系列を構成する。例えば、メソッド系列条件指定部１３で指定されたメソッドが｛ｆＡ，ｆＢ，ｆＣ｝であれば、１つのメソッド系列は、（評価対象メソッド）→｛ｆＡ，ｆＢ，ｆＣ｝のいずれか→｛ｆＡ，ｆＢ，ｆＣ｝のいずれか→・・・、となる。そしてメソッド系列群は、各メソッドの順番を入れ替えたすべての組み合わせとする。
【００４４】
上述のEngineクラスでは、評価対象となるメソッドgo（）を除くと、３つのメソッドを持っている。また系列の最長の長さは４であるとしているので、合計で８１（＝３４）通りのメソッド系列が存在する。
【００４５】
これらのメソッド系列は、例えば図９に示すように、ツリー状に示すことができる。この図９中では、このツリーにおける左端のノード（ｇｏ）から右端のノードに到るまでの各々パスが１つのメソッド系列に相当する。
【００４６】
このツリーのメソッド系列は、左端のノード（ｇｏ）を、オーバライドされていないメソッドEngin::go（）とした場合と、オーバライドされたメソッドHighSpeedEngin::go（），GoBackEngin::go（），BackEngin::go（）とした場合について各々適用される。
【００４７】
（前提条件指定部）
前提条件指定部１５は、メソッド系列の先頭となる評価対象のメソッドｇｏ（）を呼ぶ前のオブジェクトの状態を指定する。オブジェクトの状態とは、ここでは上述の各メンバ変数の値の組を意味する。
【００４８】
上述のEngineクラスには（fuel，curPos，time）の３つのメンバ変数があるので、例えば（０，０，０）が１つの状態として規定される。ユーザはメソッドを呼ぶ前の前提条件として、調べたい状態の集合を準備しなくてはならない。
【００４９】
この例では、例えば図１０に示す６つの状態を前提条件とする。この図１０に示す前提条件は、親クラス（Engine）のメンバ変数に対する前提条件であるが、子クラスで実装されているメソッドが、子クラス独自のメンバ変数を参照している場合には、そのメンバ変数に対する前提条件も必要となる。
【００５０】
上述の例では、GoBackEngineクラスが、flgGearというメンバ変数を用いている。このため、例えば図１１に示す２つの状態をGoBackEngineクラスに対する追加の前提条件とする。
【００５１】
（実行系列作成部）
実行系列作成部１６は、メソッド系列構成部１４によって作成されたメソッド系列、前提条件、特定のクラスの評価対象メソッド（評価対象メソッドのどのクラスにおける実装か）を組み合わせて、実行系列を作成し、実行プログラムを実際に実行できる準備を整える。なお、「実行系列」という言葉は、ここでは、例えばメソッド系列｛getFuelLevel（）→addFuel（）→addFuel（）→getSpeed（）｝と、前提条件｛fuel＝０，curPos＝０，time＝０｝と、評価対象メソッド｛HighSpeedEngine::go（）｝等のように、メソッド系列、前提条件、特定のクラスの評価対象メソッドの３つを備えているものを示している。
【００５２】
上述のEngineクラスの場合では、実行系列は、８１本のメソッド系列、６種類の前提条件、４種類の評価対象メソッド｛Engine::go（），HighSpeedEngine::go（），GoBackEngine::go（），BackEngine::go｝である。さらに、GoBackEngine::go（）に対しては、２種類の追加前提条件があるので、実際に実行する系列は、２４３０（＝８１×６×（４＋１））通り存在する。
【００５３】
（実行部及びパス記録部）
プログラム実行部１７は、実行系列作成部１６によって作成された実行系列に従って実行プログラム格納領域２ｂに保持されている実行プログラムを、逐一実行する。パス記録部１８は、各々の実行系列に従った実行時のパスを示す実行ログを記録する。なお、この実行ログは、プログラム中の実行の流れが一意に特定できるレベルで記録する。この実行ログの記録には、例えば対象プログラムにプローブを埋め込んだり、デバッガのトレース機能を使用して逐次、通過パスを記録していく等の手法が考えられる。
【００５４】
（パス比較部）
パス比較部１９は、各実行系列に対して記録された実行ログ中のパスを比較し、「差分発生長」を算出する。
【００５５】
パスの比較において、比較の基準となるのは、評価対象メソッドの親クラスでの実装を起点として、あるメソッド系列を実行したときのパスである。それと比較するパスは、（１）同じ前提条件で、（２）子クラスで実装されている評価対象メソッドを起点として、（３）同じメソッド系列を呼び出した実行パスである。この両者を比較し、最初に違いが発生する場所までの長さを「差分発生長」とする。
【００５６】
この差分発生長が、最初に違いが発生するまでの「何の長さ」であるかは以下のような例が考えられる。
【００５７】
例１：メソッドの数
両者で実行の流れ（メソッド内の分岐における分岐の方向等）が最初に変わるメソッドを見つけ出す。例えば図１２に示すように、メソッド系列中で、何番目のメソッドにおいて流れが変化したかを、その系列の「差分発生長」として記録する。
【００５８】
この例において最初に実行の流れが変わるのが、メソッド系列中の４番目のメソッドgetFuelLevel（）内の分岐文であるとすると、このメソッド系列における差分発生長を４とする。
【００５９】
例２：分岐の数
例２として、何番目の分岐で違いが発生するかによって差分発生長を計測する方法が考えられる。
【００６０】
例１では、パスにおいて最初に違いが発生した「メソッド」を示す番号によって、差分発生長を計測していた。しかし、メソッドによっては、メソッド内に分岐文が存在しなかったり、逆に複数の分岐文が存在するものがあると考えられる。このような場合では、例１とは別の差分発生長の定義として、「違いが発生した分岐文」を示す番号で差分発生長を計測するようにしてもよい。なお、以下の説明では、例１のメソッドの数によって差分発生長を計測するものとして説明する。
【００６１】
図１３〜図１５，図１６〜図１８，図１９〜図２１は、各々HighSpeedEngine，GoBackEngine，BackEngineに対する差分発生長をメソッド系列及び前提条件毎に計測した表である。なお、これらの図中では、系列中のすべてのメソッドを呼び出しても差異が見当たらない場合には、系列の長さ＋１（上述のように系列長が４であるから５）を差分発生長としている。
【００６２】
（パス評価部）
パス評価部２０は、パス比較部１９によって得られた差分発生長をもとに、メソッドのオーバライドによる影響を評価する。この評価方法には、以下に示すように、いくつかの態様が考えられる。
【００６３】
例１
各前提条件における差分発生長の平均値によってオーバライドによる影響を評価する。上述の図１３〜図２１までに示す結果を基に、各前提条件における差分発生長の平均を求めると、図２２に示すグラフのようになる。このグラフは、横軸に前提条件、縦軸に平均の差分発生長を記したものである。
【００６４】
この平均値は、「ある前提条件の下、オーバライドされたメソッドを呼び出した後、親クラスのメソッドを平均何回呼び出せば実行の流れが変化するか」を示した値となる。従って、このように求めた平均値は、ある子クラスによるメソッドのオーバライドが、親クラスの振る舞いに及ぼす影響を判断する目安となる。
【００６５】
実行の流れが変わることが悪影響とは一概にはいえないが、あくまでひとつの目安として、平均値が小さい場合には、メソッドのオーバライドが親クラスの振る舞いに及ぼす影響が大きく、逆に平均値が大きい場合には、親クラスとしての振る舞いに及ぼす影響は少ないと考えられる。
【００６６】
例２
例１では、各前提条件に対する平均の差分発生長を求めた。しかし、平均ではなく、各前提条件における最小の差分発生長を用いて、オーバライドによる親クラスへの影響を評価することもできる。上述の図１３〜図２１までに示す結果を基に、最小の差分発生長を求めると、図２３に示すグラフのようになる。
【００６７】
このように、最小の差分発生長によってオーバライドによる影響を評価することにより、あくまで目安ではあるが、最も早く影響が出る場合を基準に評価を行うことができる。
【００６８】
例３
ところで、上述のGoBackEngineクラスの評価の際には、例えばユーザによって設定された追加の前提条件によってメンバ変数の値を設定していた。このように、子クラスのメンバ変数がメソッド内で使用される場合には、上述の図１６〜図１８に示すように、追加前提条件毎に差分発生長が求められる。
【００６９】
このように、追加の前提条件がある場合には、例えば各々の追加前提条件毎に求めた差分発生長の（１）平均値，あるいは（２）最小値によって、オーバライドによる影響度を評価することができる。
【００７０】
例えば上述の図２２，２３におけるGoBackEngineクラスの差分発生長は、追加前提条件についての平均値を採択した上で、親クラスの前提条件に対する「平均」「最小値」を示したものである。
【００７１】
このGoBackEngineクラスの例では、上述のように、追加の前提条件をflgGearがtrue（真）／false（偽）であるかの２種類としていた。このため、追加条件毎に求めた差分発生長の平均によって評価する場合には、例えば親クラスの前提条件が（０，０，０）であり、メソッド系列getSpeed（）→getFuelLevel（）→addFuel（）→getFuelLevel（）の場合の差分発生長は、
差分発生長＝（flgGearがtrueの場合の差分発生長＋flgGearがfalseの場合の差分発生長）／２＝（１＋５）／２＝３
となる。
【００７２】
（出力部）
出力部２１は、ユーザからの要求に応じて、パス評価部２０によるパス評価結果あるいはパス比較部１９によるパス比較結果のいずれかあるいは両方を出力する。
【００７３】
例１
例えば上述の図２２に示す例では、Engineクラスを継承し、評価対象メソッドgo（）をオーバライドしている３つのクラス、HighSpeedEngineクラス、GoBackEngineクラス、BackEngineクラスのグラフを見ると、BackEngineクラスはどの前提条件においても、差分発生長が小さい（平均２．２１）。
【００７４】
この結果から、Engineクラスを継承した３つのクラスの中では、「BackEngineクラスのオーバライドの仕方が最も親クラスとしての振る舞いに影響を与える」ことがわかる。
【００７５】
従って、継承した３つのクラスの中で、どのクラスの継承の実装方法を重点的にテストすべきかは、BackEngineクラスということになる。
【００７６】
単に各クラスについての差分発生長の平均を出力しても、ユーザが差分発生長が小さいクラスとして重点的に評価すべきクラスを把握することができるが、重点的に評価すべきクラス（BackEngineクラス）を出力することにより、ユーザがより直接的に重点的に評価すべきクラスを把握することができる。
【００７７】
例２
また、どの前提条件、及び、メソッド系列のときに、親クラスとしての振る舞いに影響が出やすいかという点について、ユーザに情報を提供するようにしてもよい。
【００７８】
平均の差分発生長が小さい前提条件においては、親クラスとしての振る舞いに影響が出やすい。このため、各前提条件について、差分発生長が最も小さいメソッド系列を選択し（差分発生長が最小であるメソッド系列が複数である場合には、これらのうちのどれでもよいと思われる）、この前提条件を出力する。
【００７９】
上述の例では、例えばGoBackEngineクラスのメソッドgo（）は、curPos＝０，fuel＝５０，time＝０のときに、平均的に、パスに差が生じやすいので、この前提条件を出力する。
【００８０】
この際、単に、前提条件を出力してもよいが、「その前提条件におけるメソッド系列を特にチェックしてください」等のメッセージを出力するとユーザが把握しやすいと考えられる。
【００８１】
例３
継承クラスが１つである場合には、上述の例２と同様に、平均の差分発生長が小さい前提条件における振る舞いをより優先的にチェックすべきであるという指針を示す。具体的には、例えば平均の差分発生長が小さい前提条件を出力する。
【００８２】
以上説明した各処理は、全体として、例えば図２４に示すフローチャートで表される。そして、各処理は、所定のプログラム言語で作成された実行処理確認プログラムとすることができる。この実行処理確認プログラムは、図２５に示すような、汎用コンピュータ１００で読み取り可能な記録媒体１０１〜１０４に記録することができる。具体的には、同図に示すような、フロッピーディスク１０１やカセットテープ１０４等の磁気記録媒体、若しくはＣＤ−ＲＯＭ１０２等の光ディスクの他、ＲＡＭカード１０３などのコンピュータで読み取り可能な記録媒体に記録することができる。
【００８３】
このような実行処理確認プログラムを記録したコンピュータ読み取り可能な記録媒体によれば、プログラムのデバッガを容易に行うことができる有用なプログラムの保存、運搬及びインストールを容易に行うことができ、上述したプログラムのデバッガ方法及び影響度評価装置を簡便に実現することができる。
【００８４】
なお、上述した実施形態では、パーソナルコンピュータ等の汎用コンピュータ上で本発明の実行処理確認プログラムを実行することによって影響度評価装置を実施するようにしたが、本発明はこれに限定されるものではない。例えば、上記実施形態に係る影響度評価装置と同様の機能を有する専用機を用いて実施することもできる。
【００８５】
（変形例）
なお、上述の実施形態では、本発明をデバッガに適用した例について説明したが、本発明の技術的思想の範囲内で、適宜構成を変更することができる。例えば少なくとも検出した影響度を求める機能までを有していれば、評価機能は必ずしも必要ではない。このように求めた影響度は、オーバライドによる影響を示す情報として他のプログラム等で利用することができるためである。
【００８６】
【発明の効果】
本発明によれば、オブジェクト指向プログラミングにおいて、子クラスが親クラスにおけるメソッドをオーバライドした際に、親クラスとしての振る舞いに及ぼす影響を示す情報を容易に確認することができ、このように確認された情報を利用することにより、プログラムの効率的なテスト・デバッグ作業を実現することができる。
【図面の簡単な説明】
【図１】本発明の一実施形態に係るデバッガの実行によって実現される影響度評価装置の構成を示すブロック図である。
【図２】実行系列の例を示す図である。
【図３】前記影響度評価装置によって影響度を評価する評価対象プログラムのソースコードの一部を示す図である。
【図４】前記影響度評価装置によって影響度を評価する評価対象プログラムのソースコードの一部を示す図である。
【図５】前記影響度評価装置によって影響度を評価する評価対象プログラムのソースコードの一部を示す図である。
【図６】前記ソースコード中のEngineクラス中で定義されている変数の属性の例を示す図である。
【図７】前記ソースコード中のEngineクラス中で定義されているメソッドの属性の例を示す図である。
【図８】前記ソースコード中のクラスの階層を示すクラス階層図である。
【図９】メソッド系列の例を示す図である。
【図１０】前提条件の例を示す図である。
【図１１】追加前提条件の例を示す図である。
【図１２】前記影響度評価装置を構成するパス比較部において比較するパスの例を示す図である。
【図１３】  HighSpeedEngineクラスに対する差分発生長を示す図である。
【図１４】  HighSpeedEngineクラスに対する差分発生長を示す図である。
【図１５】  HighSpeedEngineクラスに対する差分発生長を示す図である。
【図１６】  GoBackEngineクラスに対する差分発生長を示す図である。
【図１７】  GoBackEngineクラスに対する差分発生長を示す図である。
【図１８】  GoBackEngineクラスに対する差分発生長を示す図である。
【図１９】  BackEngineクラスに対する差分発生長を示す図である。
【図２０】  BackEngineクラスに対する差分発生長を示す図である。
【図２１】  BackEngineクラスに対する差分発生長を示す図である。
【図２２】各子クラスにおける、各前提条件に対する平均差分発生長を示す図である。
【図２３】各子クラスにおける、各前提条件に対する最小差分発生長を示す図である。
【図２４】前記影響度評価装置における影響度評価処理を示すフローチャートである。
【図２５】前記デバッガプログラムを記録したコンピュータ読み取り可能な記録媒体を示す斜視図である。
【符号の説明】
２…入力部、
３ａ…ソースコード格納領域、
３ｂ…実行プログラム格納領域、
４…出力部、
１１…ソースコード解析部、
１２…対象メソッド指定部、
１３…メソッド系列条件指定部、
１４…メソッド系列構成部、
１５…前提条件指定部、
１６…実行系列作成部、
１７…プログラム実行部、
１８…パス記録部、
１９…パス比較部、
２０…パス評価部
【図１】
0003759912.tif 000002
【図２】
0003759912.tif 000003
【図３】
0003759912.tif 000004
【図４】
0003759912.tif 000005
【図５】
0003759912.tif 000006
【図６】
0003759912.tif 000007
【図７】
0003759912.tif 000008
【図８】
0003759912.tif 000009
【図９】
0003759912.tif 000010
【図１０】
0003759912.tif 000011
【図１１】
0003759912.tif 000012
【図１２】
0003759912.tif 000013
【図１３】
0003759912.tif 000014
【図１４】
0003759912.tif 000015
【図１５】
0003759912.tif 000016
【図１６】
0003759912.tif 000017
【図１７】
0003759912.tif 000018
【図１８】
0003759912.tif 000019
【図１９】
0003759912.tif 000020
【図２０】
0003759912.tif 000021
【図２１】
0003759912.tif 000022
【図２２】
0003759912.tif 000023
【図２３】
0003759912.tif 000024
【図２４】
0003759912.tif 000025
【図２５】
0003759912.tif 000026