以下に添付図面を参照して、本願の開示する規則検査装置、規則検査方法及び規則検査プログラムの実施例を詳細に説明する。なお、本願の開示する規則検査装置、規則検査方法及び規則検査プログラムは、以下の実施例により限定されるものではない。
実施例1に係るプログラム規則検査装置は、アプリケーションの生成に用いられた複数のプログラム間の関係に基づいて、アプリケーションにおけるシステム全体を対象としたフレームワークルールの検査を行う。なお、ここでいうアプリケーションとは、例えば、企業などの要求により独自に開発された業務アプリケーションや、一般的な文章作成ソフト、表計算ソフトなどの汎用アプリケーションなどである。また、システム全体を対象としたフレームワークルールの検査とは、例えば、プログラムの呼出関係や継承関係、或いは、共通して用いられる部品の利用方法の適合性などである。
具体的には、実施例1に係るプログラム規則検査装置は、アプリケーションの生成に用いられた複数のプログラムの関係を事前に解析する。そして、実施例1に係るプログラム規則検査装置は、事前に解析した複数のプログラム間の関係を検査対象として、各プログラムの呼出関係や継承関係、或いは、共通して用いられる部品の利用方法の適合性などがフレームワークの仕様規定であるフレームワーク規定に則しているか否かを検査する。従って、実施例1に係るプログラム規則検査装置は、例えば、画面処理プログラム、業務処理プログラム、データベース処理プログラムなどの複数階層に跨る処理が適切に実行されているか否かを判定することができ、システム全体を対象としたフレームワークルールの検査を行うことを可能にする。
まず、実施例1に係るプログラム規則検査装置の構成を説明する。図1は、実施例1に係るプログラム規則検査装置の構成を説明するための図である。図1に示すように、プログラム規則検査装置100は、解析データ記憶部110と、プログラム解析処理部120と、プログラム検査処理部130と、プログラム検査規則140と、フレームワーク検査処理部150と、フレームワーク検査規則160と、検査結果記憶部170と、検査結果通知処理部180とを有する。そして、プログラム規則検査装置100は、図示しない入力部から入力された検査対象プログラムに対して各種処理を実行することで、プログラムの品質に係る検査を実行し、検査結果レポートを図示しない表示部に表示する。なお、ここでいう検査対象プログラムは、プログラムソースコードである。
解析データ記憶部110、プログラム検査規則140、フレームワーク検査規則160及び検査結果記憶部170は、例えば、RAM(Random Access Memory)、フラッシュメモリ(Flash Memory)などの半導体メモリ素子、又は、ハードディスク、光ディスクなどの記憶装置である。また、プログラム解析処理部120、プログラム検査処理部130、フレームワーク検査処理部150、及び検査結果通知処理部180は、例えば、ASIC(Application Specific Integrated Circuit)やFPGA(Field Programmable Gate Array)などの集積回路、又は、CPU(Central Processing Unit)やMPU(Micro Processing Unit)などの電子回路である。
解析データ記憶部110は、アプリケーションの生成に用いられた複数のプログラム間の関係を記憶する。具体的には、解析データ記憶部110は、後述するプログラム解析処理部120の処理結果及び入力された検査対象プログラムを記憶する。図2は、解析データ記憶部110によって記憶される管理データの一例を説明するための図である。図2に示すように、解析データ記憶部110は、ファイル名、ファイル更新日時、言語、解析済みフラグ、ソースのハッシュコード及び解析対象フラグを連番に対応付けた管理データを記憶する。
なお、図2の「連番」とは、プログラム解析処理部120によって解析されたプログラムに割当てられた番号を意味している。また、図2の「ファイル名」とは、プログラム解析処理部120によって解析されたプログラムのファイル名を意味している。また、図2の「ファイル更新日時」とは、ファイルが最後に修正された日時を意味している。また、図2の「言語」とは、プログラムの作成に用いられたプログラム言語を意味している。また、図2の「解析済みフラグ」とは、解析が行われたか否かを示すフラグである。また、図2の「ソースのハッシュコード」とは、プログラムを一意に特定し、ファイルが修正されたか否かを判定するためのハッシュコードである。例えば、ファイルが修正された場合にはハッシュコードが変化するため、ファイルが修正されたか否かを判定することに用いられる。また、図2の「解析対象フラグ」とは、後に実行されるフレームワークに関する解析の対象となるか否かを示すフラグである。
例えば、解析データ記憶部110は、図2に示すように、「連番:001」に対応付けて、「ファイル名:M_SHAINView.vb、ファイル更新日時:2010/04/03 10:23:21、言語:VB.NET、解析済みフラグ:1、ソースのハッシュコード:948ad32e、解析対象フラグ:1」を記憶する。すなわち、上述した情報は、プログラム解析処理部120によって「2010/04/03 10:23:21」に解析されたプログラムは、ファイル名が「M_SHAINView.vb」であり、「VB.NET」を用いて作成されていることを示している。そして、上述した情報は、プログラムを特定するためのハッシュコードが「948ad32e」であり、後に実行されるフレームワークに関する解析対象となることを示している。同様に、解析データ記憶部110は、図2に示すように、後述するプログラム解析処理部120によって解析されたプログラムについて、他の解析状況の管理データを記憶する。
図3は、解析データ記憶部110によって記憶されるクラス解析結果の一例を説明するための図である。図3に示すように、解析データ記憶部110は、ファイルパス、パッケージ名、クラス名、開始行番号、終了行番号、メソッド数、修飾子及び継承元に識別IDを対応付けたクラス解析結果を記憶する。
なお、図3の「識別ID」とは、解析されたクラスを一意に識別するための識別子である。また、図3の「ファイルパス」とは、検査対象プログラムが格納されているフォルダの起点となるフォルダである解析ファイルパスからの相対パスを意味している。また、図3の「パッケージ名」とは、検査対象プログラムを含むソフトウェアの名称を意味している。また、図3の「クラス名」とは、検査対象プログラムのクラス名を意味している。また、図3の「開始行番号」とは、検査対象プログラムにおいて、クラスの開始行を示す行番号を意味している。また、図3の「終了行番号」とは、検査対象プログラムにおいて、クラスの終了行を示す行番号を意味している。また、図3の「メソッド数」とは、検査対象プログラムのクラスに含まれるメソッドの数を意味している。また、図3の「修飾子」とは、当該クラスを参照することが可能な領域を意味している。また、図3の「継承元」とは、当該クラスの元となるクラスを意味している。
例えば、解析データ記憶部110は、図3に示すように、クラス解析結果として「識別ID:1001」に対応付けて「ファイルパス:WebASMaster/M_SHAINView.vb、パッケージ名:WebAS、クラス名:M_SHAINView、開始行番号:6、終了行番号:91、メソッド数:5、修飾子:Partial、継承元:BasePage」を記憶する。同様に、解析データ記憶部110は、図3に示すように、他のクラス解析結果を記憶する。
図4は、解析データ記憶部110によって記憶されるメソッド解析結果の一例を説明するための図である。図4においては、図3に示すクラス解析結果に含まれるメソッドについて解析された結果について示している。図4に示すように、解析データ記憶部110は、ファイル名、クラス名、メソッド名、パラメータ、戻り値型、開始行番号及び終了行番号に連番を対応付けたメソッド解析結果を記憶する。
なお、図4の「連番」とは、メソッドごとに割当てられた番号を意味している。また、図4の「ファイル名」とは、メソッドが属するファイル名を意味している。また、図4の「クラス名」とは、メソッドが属するクラス名を意味している。また、図4の「パラメータ」とは、メソッドに定義された処理を実行させるために指定するパラメータを意味している。また、図4の「戻り値型」とは、パラメータに対して引数が指定された場合に、導出される値の型を意味している。また、図4の「開始行番号」とは、検査対象プログラムにおいて、メソッドの開始行を示す行番号を意味している。また、図4の「終了行番号」とは、検査対象プログラムにおいて、メソッドの終了行を示す行番号を意味している。
例えば、解析データ記憶部110は、図4に示すように、メソッド解析結果として「連番:2001」に対応付けて「ファイル名:WebASMaster/M_SHAINView.vb、クラス名:M_SHAINView、メソッド名:Page_Load、パラメータ:Object,EventArgs、戻り値型:Nothing、開始行番号:9、終了行番号:25」を記憶する。同様に、解析データ記憶部110は、図4に示すように、他のメソッド解析結果を記憶する。
図5は、解析データ記憶部110によって記憶されるインスタンス解析結果の一例を説明するための図である。図5においては、図4に示すメソッドに定義されたインスタンスに関して解析された結果を示している。図5に示すように、解析データ記憶部110は、ファイル名、クラス名、メソッド名、引数、戻り値型、宣言変数名、宣言変数型及び宣言行番号に連番を対応付けたインスタンス解析結果を記憶する。
なお、図5の「連番」とは、インスタンスごとに割当てられた番号を意味している。また、図5の「ファイル名」とは、インスタンスが属するファイル名を意味している。また、図5の「クラス名」とは、インスタンスが属するクラス名を意味している。また、図5の「メソッド名」とは、インスタンスを定義するメソッド名を意味している。また、図5の「引数」とは、メソッドのパラメータに対して指定される値を意味している。また、図5の「戻り値型」とは、引数によって導出される値の型を意味している。また、図5の「宣言変数名」とは、設計者によって指定されたインスタンスの変数名を意味している。また、図5の「宣言変数型」とは、インスタンスとして宣言された変数のデータ型又はクラス型などを意味している。また、図5の「宣言行番号」とは、検査対象プログラムにおいて、インスタンス変数が記載された行番号を意味している。
例えば、解析データ記憶部110は、図5に示すように、インスタンス解析結果として「連番:3001」に対応付けて「ファイル名:WebASMaster/M_SHAINView.vb、クラス名:M_SHAINView、メソッド名:InsertButton_Click、引数:Object,EventArgs、戻り値型:Nothing、宣言変数名:param、宣言変数型:M_SHAINMANAGERParam、宣言行番号:39」を記憶する。同様に、解析データ記憶部110は、図5に示すように、他のインスタンス解析結果を記憶する。
図6は、解析データ記憶部110によって記憶されるメソッド呼出し解析結果の一例を説明するための図である。図6においては、図5に示すインスタンスごとの呼出しメソッドについて解析された結果を示している。図6に示すように、解析データ記憶部110は、ファイル名、クラス名、メソッド名、引数、戻り値型、呼出し先クラス、呼出し先メソッド名、呼出し先メソッドパラメータ及び呼出し行番号に識別IDを対応付けたメソッド呼出し解析結果を記憶する。
なお、図6の「識別ID」とは、インスタンスを一意に特定するための識別子を意味している。また、図6の「ファイル名」とは、インスタンスが属するファイル名を意味している。また、図6の「クラス名」とは、インスタンスが属するクラス名を意味している。また、図6の「メソッド名」とは、インスタンスを定義するメソッド名を意味している。また、図6の「引数」とは、メソッドのパラメータに対して指定される値を意味している。また、図6の「戻り値型」とは、引数によって導出される値の型を意味している。また、図6の「呼出し先クラス」とは、各インスタンスにおいて呼出されるクラスを意味している。また、図6の「呼出し先メソッド名」とは、各インスタンスにおいて呼出されるメソッド名を意味している。また、図6の「呼出し先メソッドパラメータ」とは、呼出し先メソッドのパラメータを意味している。また、図6の「呼出し行番号」とは、検査対象プログラムにおいて、メソッドの呼出しが記載された行番号を意味している。
例えば、解析データ記憶部110は、図6に示すように、メソッド呼出し解析結果として「識別ID:4001」に対応付けて「ファイル名:WebASMaster/M_SHAINView.vb、クラス名:M_SHAINView、メソッド名:InsertButton_Click、引数:Object,EventArgs、戻り値型:Nothing、呼出し先クラス:Validator、呼出し先メソッド名:ServerValidate、呼出し先メソッドパラメータ:なし、呼出し行番号:34」を記憶する。同様に、解析データ記憶部110は、図6に示すように、他のメソッド呼出し解析結果を記憶する。
図1に戻って、プログラム検査規則140は、プログラム単体のチェックルールであるプログラムチェックルールを記憶する。フレームワーク検査規則160は、フレームワークのチェックルールであるフレームワークルールを記憶する。検査結果記憶部170は、後述するプログラム検査処理部130及びフレームワーク検査処理部150の処理結果である検査結果を記憶する。なお、プログラムチェックルール、フレームワークルール及び検査結果については、後に詳述する。
プログラム解析処理部120は、アプリケーションの作成に用いられた複数のプログラム間の関係を解析する。具体的には、プログラム解析処理部120は、フレームワークルールの規則検査を実行する事前解析として、アプリケーションの作成に用いられた複数のプログラム間の関係を解析する。より具体的には、プログラム解析処理部120は、利用者によって指定された全てのプログラムを事前解析の対象とし、対象としたプログラムの記載内容、参照関係などを解析して、解析結果を解析データ記憶部110に格納する。以下では、プログラム解析処理部120による解析処理について、図7−1〜図9−2を用いて説明する。
ここで、まず、図7−1〜図9−2に示すプログラムソースコードについて説明する。図7−1及び図7−2は、画面処理に関するプログラムソースコードの一例を説明するための図である。なお、図7−1及び図7−2は、画面処理に関する1つのプログラムソースコードを示している。図7−1及び図7−2においては、図示しない表示部が所定の画面を表示する際の処理について示されている。例えば、図7−1に示すように、画面処理に関するプログラムソースコードには、「コメント:’表示メッセージのクリア」に対応する「プログラム文:Me.ResultMessage.Text=String.Empty」などが記載されている。
図8−1〜図8−3は、業務処理に関するプログラムソースコードの一例を説明するための図である。なお、図8−1〜図8−3は、業務処理に関する1つのプログラムソースコードを示している。図8−1〜図8−3においては、トランザクションの各種処理について示されている。業務処理に関するプログラムソースコードには、画面処理に関するプログラムソースコードと同様に、コメントが付された各種処理のプログラム文が記載されている。
図9−1及び図9−2は、データベース処理に関するプログラムソースコードの一例を説明するための図である。なお、図9−1及び図9−2は、業務処理に関する1つのプログラムソースコードを示している。図9−1及び図9−2においては、データベースに対するアクセス処理などについて示されている。データベース処理に関するプログラムソースコードには、画面処理に関するプログラムソースコードと同様に、コメントが付された各種処理のプログラム文が記載されている。
例えば、プログラム解析処理部120は、図7−1〜図9−2に示すようなプログラムソースコードを事前解析に用いる。プログラム解析処理部120は、利用者によって指定された全てのプログラムソースコードを事前解析の対象とし、対象としたプログラムの記載内容、参照関係などを解析する。例えば、複数階層に跨ってプログラムが格納されている場合に、利用者によって起点フォルダである解析ファイルパスが指定されると、プログラム解析処理部120は、まず、指定された解析ファイルパスの配下にある全てのプログラムソースコードを検査対象プログラムとし、検査対象プログラムのファイルパスを取得する。なお、解析ファイルパスはプロジェクトごとに一意に設定されており、利用者は、事前解析の解析対象として所望する解析ファイルを一意に特定し、指定することが可能である。
例えば、事前解析として、図7−1及び図7−2に示す画面処理に関するプログラムソースコードを解析する場合には、プログラム解析処理部120は、以下のような解析処理を実行して、解析結果を解析データ記憶部110に格納する。プログラム解析処理部120は、まず、プログラムソースコードのパッケージ名が宣言された箇所からパッケージ名を取得する。例えば、プログラム解析処理部120は、図7−1の「4行目」に示すパッケージ名「WebAS」を取得して、取得した「WebAS」を解析データ記憶部110に格納する。
そして、プログラム解析処理部120は、プログラムソースコードのクラス解析を実行して、解析結果を解析データ記憶部110に格納する。具体的には、プログラム解析処理部120は、プログラムソースコードにおけるクラスの判定と、クラス内のメソッド数のカウントと、クラスの修飾子及び継承元の取得とを、正規表現を用いて実行する。なお、ここでいう「正規表現」とは、任意の文字列の中から特定の文字列を抽出するために予め定められたパターンである。例を挙げると、「"((Public|Private|Protected|Partial)(¥s))*((Shared)( ¥s))*(Class) ¥s(¥[?)(¥w+)(¥]?)(.*)"」などがクラス開始行の正規表現として用いられ、「"^End¥sClass?"」などがクラス終了行の正規表現として用いられる。例えば、「"((Public|Private|Protected|Partial)(¥s))*((Shared)( ¥s))*(Class) ¥s(¥[?)(¥w+)(¥]?)(.*)"」は、「Private Class」や「Pertial Class」などを検索対象の文字列とした正規表現である。すわなち、プログラム解析処理部120は、プログラムソースコードを参照して、予め定められた正規表現とのパターンマッチングを実行することにより、クラスの判定やメソッド数のカウントなどを行う。例えば、正規表現は、図示しない記憶部によって記憶されている。
例えば、プログラム解析処理部120は、図7−1及び図7−2を参照して、正規表現のパターンと一致する「6行目」の「Partial Class M_SHAINView」から「91行目」の「End Class」までをクラスと判定する。そして、プログラム解析処理部120は、クラスにおける「Private Sub」と「End Sub」との間を1つのメソッドとして判定して、クラス内のメソッド数をカウントする。上記した場合には、「"^((Public|Private|Protected|Friend|Overridable)(¥s))*((Shared|Shadows|Overrides|Overloads)(¥s))*(Function|Sub)¥s(¥w+?)¥((.*)¥)((¥s(As)¥s(.+))*)?"」及び「"^End¥s(Sub|Function)$"」が、それぞれ「メソッドの開始行」及び「メソッドの終了行」の正規表現として、例えば、図示しない記憶部に予め記憶されている。例えば、正規表現「"^((Public|Private|Protected|Friend|Overridable)(¥s))*((Shared|Shadows|Overrides|Overloads)(¥s))*(Function|Sub)¥s(¥w+?)¥((.*)¥)((¥s(As)¥s(.+))*)?"」は、「Private Sub」や「Private Function」などを検索対象の文字列とした正規表現である。さらに、プログラム解析処理部120は、クラスの修飾子及び継承元を、正規表現を用いて取得する。具体的には、プログラム解析処理部120は、正規表現を用いてクラスの開始行を取得し、クラスの開始行に含まれるクラス修飾子や継承元クラスを取得する。例えば、プログラム解析処理部120は、クラスの修飾子「Partial」及び継承元「BasePage」を、正規表現を用いて取得する。
そして、プログラム解析処理部120は、プログラムソースコードから取得したクラス情報に識別IDを付与して、解析データ記憶部110に格納する。例えば、プログラム解析処理部120は、図3に示すように、「識別ID:1001、ファイルパス:WebASMaster/M_SHAINView.vb、パッケージ名:WebAS、クラス名:M_SHAINView、開始行番号:6、終了行番号:91、メソッド数:5、修飾子:Partial、継承元:BasePage」をクラス解析結果として解析データ記憶部110に格納する。
同様に、プログラム解析処理部120は、図8−1〜図8−3に示す業務処理に関するプログラムソースコードや、図9−1及び図9−2に示すデータベース処理に関するプログラムソースコードなど、事前解析の対象プログラムとして利用者に指定されたプログラムソースコードをクラス解析して、解析結果を解析データ記憶部110に格納する(図3参照)。
そして、プログラム解析処理部120は、クラスに含まれた各メソッドの解析を実行する。具体的には、プログラム解析処理部120は、正規表現を用いて判定したメソッドごとに、メソッドの開始行に含まれるメソッド名、パラメータ、戻り値型などを、正規表現を用いて取得する。例えば、プログラム解析処理部120は、図7−1の「9行目」に示す「Private Sub Page_Load」と「25行目」に示す「End Sub」との間に記載されたメソッドの解析を実行する。そして、プログラム解析処理部120は、解析結果「ファイル名:WebASMaster/M_SHAINView.vb、クラス名:M_SHAINView、メソッド名:Page_Load、パラメータ:Object,EventArgs、戻り値型:Nothing、開始行番号:9、終了行番号:25」を「連番:2001」に対応付けてメソッド解析結果として解析データ記憶部110に格納する(図4参照)。同様に、プログラム解析処理部120は、各クラスに含まれる全てのメソッドを解析して、解析結果を解析データ記憶部110に格納する。例えば、メソッドの解析に用いられる正規表現は、図示しない記憶部によって記憶されている。
さらに、プログラム解析処理部120は、メソッドに定義されたインスタンスの解析を実行する。具体的には、プログラム解析処理部120は、メソッドの開始行と終了行との間に定義されたインスタンスの宣言行番号、インスタンスの変数名、宣言データ型又はクラス型を、正規表現を用いて取得する。例えば、プログラム解析処理部120は、図7−1の「31行目」に示す「Private Sub InsertButton_Click」と「59行目」に示す「End Sub」との間に記載されたメソッドに定義されたインスタンスの解析を実行する。そして、プログラム解析処理部120は、インスタンス解析結果として、図5の「連番:3001」及び「連番:3001」に示す各種情報を解析データ記憶部110に格納する。同様に、プログラム解析処理部120は、各メソッドに定義されたインスタンスを解析して、解析結果を解析データ記憶部110に格納する(図5参照)。例えば、インスタンスの解析に用いられる正規表現は、図示しない記憶部によって記憶されている。
また、さらに、プログラム解析処理部120は、メソッドごとの呼出し先の解析を実行する。具体的には、プログラム解析処理部120は、メソッドごとに、呼出し先クラス、呼出し先メソッド、呼出し先メソッドパラメータ、呼出し行番号などを、正規表現を用いて取得する。例えば、プログラム解析処理部120は、図7−1の「31行目」に示す「Private Sub InsertButton_Click」と「59行目」に示す「End Sub」との間に記載されたメソッドの呼出し先の解析を実行する。そして、プログラム解析処理部120は、メソッド呼出し解析結果として、図6の「識別ID:4001」〜「識別ID:4004」に示す各種情報を解析データ記憶部110に格納する。同様に、プログラム解析処理部120は、各メソッドの呼出し先を解析して、解析結果を解析データ記憶部110に格納する(図6参照)。例えば、呼出し先の解析に用いられる正規表現は、図示しない記憶部によって記憶されている。
プログラム解析処理部120は、利用者によって指定された解析ファイルパスの配下にある全てのプログラムソースコードについて、上述した各解析を実行して、解析結果を解析データ記憶部110に格納する。また、同時に、プログラム解析処理部120は、解析したプログラムソースコードを解析データ記憶部110に格納する。
図1に戻って、プログラム検査処理部130は、複数のプログラムそれぞれが、当該複数のプログラムそれぞれの作成規定であるプログラム規定に則しているか否かを検査する。具体的には、プログラム検査処理部130は、プログラム検査規則140によって記憶されたプログラムチェックルールを用いて、解析データ記憶部110に記憶された検査対象プログラムを検査する。そして、プログラム検査処理部130は、検査結果を検査結果記憶部170に格納する。
ここで、プログラム検査規則140によって記憶されるプログラムチェックルールについて、図10−1〜図12を用いて説明する。なお、プログラムチェックルールは、設計者による処理によって予めプログラム検査規則140に記憶されている。図10−1及び図10−2は、プログラムの実装方法に関する検査に用いられるプログラムチェックルールの一例を説明するための図である。なお、図10−1及び図10−2は、プログラムの実装方法に関する検査に用いられる1つのプログラムチェックルールを示している。例えば、プログラムの実装方法に関する検査に用いられるプログラムチェックルールには、図10−1及び図10−2に示すように、「IF句のネストが閾値を越えていないか」が規定されている。例を挙げると、プログラムの実装方法に関する検査に用いられるプログラムチェックルールには、「IF句のネストが3階層以下であるか否か」などが規定される。
図11は、プログラムの継承に関する検査に用いられるプログラムチェックルールの一例を説明するための図である。例えば、プログラムの継承元の検査に用いられるプログラムチェックルールには、図11に示すように、「プログラム種別に応じた親クラスを継承しているか」が規定されている。例を挙げると、プログラムの継承元の検査に用いられるプログラムチェックルールには、「Logic層のプログラムがBaseLogicClassを継承しているか否か」などが規定される。
図12は、プログラムの呼出し方法に関する検査に用いられるプログラムチェックルールの一例を説明するための図である。例えば、プログラムの呼出し方法に関する検査に用いられるプログラムチェックルールには、図12に示すように、「ループ内でSQLを実行している箇所が無いか」が規定されている。例を挙げると、プログラムの呼出し方法に関する検査に用いられるプログラムチェックルールには、「For句の中にSQL発行処理が記載されているか否か」などが規定される。
例えば、プログラム検査処理部130は、図10−1〜図12に示すプログラムチェックルールを用いて、図7−1〜図9−2に示すプログラムソースコードを検査する。ここで、プログラム検査処理部130は、検査内容に応じて、図3〜図6に示す解析結果を参照して、プログラムソースコードの検査を実行する。例えば、図10−1及び図10−2に示すプログラムの実装方法に関する検査を実行する場合には、プログラム検査処理部130は、図4に示すメソッド解析結果を参照して、メソッドごとにIF句内のネストの検査を実行する。
図1に戻って、フレームワーク検査処理部150は、プログラム解析処理部120によって解析された複数のプログラム間の関係がフレームワークの仕様規定であるフレームワーク規定に則した関係であるか否かを検査する。具体的には、フレームワーク検査処理部150は、解析データ記憶部110によって記憶された事前解析の解析結果を用いて、各プログラムの呼出関係や継承関係、或いは、共通して用いられる部品の利用方法の適合性などがフレームワーク規定に則しているか否かを検査する。例えば、フレームワーク検査処理部150は、複数のプログラムの呼出し順が、アプリケーションが実行される際の呼出し順であるか否かを検査する。なお、どのような検査を実行するかについては、利用者が任意に決定することができる。例えば、予め設定された全てのフレームワーク規定について検査を実行する場合であってもよいし、利用者によって任意に選択されたフレームワーク規定について検査を実行する場合であってもよい。また、利用者が新たに定義したフレームワーク規定について検査を実行する場合であってもよい。
ここで、フレームワーク検査処理部150は、プログラム検査処理部130の検査結果に応じて、フレームワーク規定に基づく検査の内容を決定する。具体的には、フレームワーク検査処理部150は、プログラム検査処理部130による検査において、プログラム規定に則して作成されていると判定されたプログラム数の全プログラム数に対する割合が所定の閾値を超えていることを条件に、フレームワーク規定に基づく検査を実行する。
例えば、フレームワーク検査処理部150は、検査結果記憶部170によって記憶されたプログラム検査処理部130の処理結果を参照して、プログラム規定に則して作成されていると判定されたプログラム数の全プログラム数に対する割合が80%を超えていた場合に、検査を実行する。すなわち、フレームワーク検査処理部150は、全プログラムにおいて、品質がNGである(不良である)プログラムの割合が所定の閾値を超えた場合には、プログラムのコーディングレベルが低いと判定して、フレームワークに関する検査を実行しない。
フレームワークに関する検査を実行する場合には、フレームワーク検査処理部150は、フレームワーク検査規則によって記憶されたフレームワークルールを用いて、検査を実行する。ここで、フレームワーク検査規則160によって記憶されたフレームワークルールについて、図13−1〜図13−3を用いて説明する。図13−1〜図13−3は、プログラムの呼出し順に関するフレームワークルールの一例を説明するための図である。なお、図13−1〜図13−3は、プログラムの呼出し順に関する検査に用いられる1つのフレームワークルールを示している。なお、フレームワークルールは、設計者による処理によって予めフレームワーク検査規則160に記憶されている。
例えば、プログラムの呼出し順に関するフレームワークルールには、図13−1に示すように、「画面クラス一覧の取得」、「画面クラス内メソッド一覧の取得」、「メソッド内インスタンス一覧の取得」及び「呼出メソッド取得」を順次、再帰的に実行することが定義されている。そして、プログラムの呼出し順に関するフレームワークルールには、図13−2及び図13−3に示すように、「呼出し先クラスが正しいかチェック」することが定義されている。呼出し先クラスのチェックとしては、例えば、図13−2に示すように、「View(画面処理)クラスのメソッドからはManager(業務処理)クラスか部品クラスのメソッドのみ呼出可能」とするチェック項目が定義されている。
例えば、フレームワーク検査処理部150は、図13−1〜図13−3に示すフレームワークルールを用いて、複数のプログラム間の呼出し順を検査する。例を挙げると、フレームワーク検査処理部150は、まず、フレームワーク検査規則160から図13−1〜図13−3に示すフレームワークルールを読み出す。そして、フレームワーク検査処理部150は、フレームワークルールに定義されているように、画面処理のクラス一覧を解析データ記憶部110から取得する。例えば、フレームワーク検査処理部150は、解析データ記憶部110から、図3に示すクラス解析結果から、画面処理のクラス「M_SHAINView」を取得する。
そして、フレームワーク検査処理部150は、取得したクラスのメソッド一覧を取得する。例えば、フレームワーク検査処理部150は、図4に示すメソッド解析結果から、取得したクラス「M_SHAINView」のメソッド「Page_Load」、「InsertButton_Click」、「UpdateButton_Click」「DeleteButton_Click」及び「ClearButton_Click」を取得する。
その後、フレームワーク検査処理部150は、取得したメソッド内のインスタンス一覧を取得する。例えば、フレームワーク検査処理部150は、図5に示すインスタンス解析結果から、取得したメソッド「InsertButton_Click」のインスタンスである「連番:3001」及び「連番:3002」を取得する。
そして、フレームワーク検査処理部150は、取得したインスタンスの呼出し先メソッドを順番に取得して、呼出し先が正しいか否かを検査する。例えば、フレームワーク検査処理部150は、図6に示すメソッド呼出し解析結果から、取得したインスタンスの呼出し先クラス及び呼出し先メソッドを順次取得する。すなわち、フレームワーク検査処理部150は、図6に示す識別ID「4001」〜「4004」それぞれに対応付けられた呼出し先クラス及び呼出し先メソッドを順次取得して、呼出し先が正しいか否かを検査する。
例を挙げると、フレームワーク検査処理部150は、図6に示す「識別ID:4003」において「クラス:M_SHAINView、メソッド:InsertButton_Click」の呼出し先が「クラス:M_SHAINManager、メソッド:Entryshain」となっていることから、呼出し順が正しいと判定する。ここで、仮に、「クラス:M_SHAINView、メソッド:InsertButton_Click」の呼出し先が「クラス:M_SHAINLogic」であった場合には、フレームワーク検査処理部150は、呼出し順が正しくないと判定する。
そして、フレームワーク検査処理部150は、次に、取得した呼出し先メソッド「Entryshain」のインスタンス一覧を取得して、上述した処理と同様の処理を実行して、呼出し先が正しいか否かを検査する。すなわち、フレームワーク検査処理部150は、図5のインスタンス解析結果から連番「3003」〜「3006」のインスタンスを取得して、図6に示す識別ID「4005」〜「4012」それぞれの呼出し先クラス及び呼出し先メソッドを取得し、それぞれの呼出し先が正しいか否かを検査する。このようにして、フレームワーク検査処理部150は、画面処理のメソッドから順次呼出される全ての呼出しメソッドの呼出し順がフレームワークルールに則しているか否かを検査する。フレームワーク検査処理部150は、上述した一連の処理を、取得したクラスの全てのメソッドに対して実行し、検査結果を検査結果記憶部170に格納する。
図1に戻って、検査結果通知処理部180は、検査結果記憶部170によって記憶されたプログラムの検査結果又はフレームワークの検査結果を図示しない表示部に検査結果レポートとして表示させる。図14−1及び図14−2は、検査結果レポートの一例を説明するための図である。
例えば、検査結果通知処理部180は、図14−1に示すように、ファイル、行、ルールID、指摘内容、カテゴリ、重要度、分類及び結果を対応付けた検査結果の一覧をチェック結果レポートとして図示しない表示部に表示させる。また、検査結果通知処理部180は、図14−2に示すように、全ての検査結果を総合した総合品質評価を検査結果レポートして表示部に表示させる。図14−2においては、検査結果が重大な欠陥か又は軽度な欠陥か、或いは、指摘程度であるのかを判定したレポートを示している。また、図14−2においては、プログラムのカテゴリ別に検査結果を集約したレポートを示している。このような検査結果レポートを表示部に表示させることによって、設計者が以後に施すべき措置を的確に判断することが可能になる。
次に、図15〜図17を用いて、実施例1に係るプログラム規則検査装置100の処理の手順を説明する。図15は、実施例1に係るプログラム規則検査装置100によるプログラムの事前解析処理の手順を説明するためのフローチャートである。
図15に示すように、実施例1に係るプログラム規則検査装置100においては、プログラム解析処理部120が検査対象プログラムから、ソース情報を取得する(ステップS101)。そして、プログラム解析処理部120は、取得したソースごとのクラス情報を取得する(ステップS102)。その後、プログラム解析処理部120は、取得したクラスごとのメソッド情報を取得する(ステップS103)。
さらに、プログラム解析処理部120は、取得したメソッドに呼出されるメソッドの情報を取得して(ステップS104)、各メソッドの処理内容を取得する(ステップS105)。そして、さらに、プログラム解析処理部120は、取得した各情報を解析データ記憶部110に保存して(ステップS106)、処理を終了する。
図16は、実施例1に係るプログラム規則検査装置100による処理の手順を説明するためのフローチャートである。なお、図16においては、プログラム解析処理部120による事前解析処理が終了した後の処理について示している。
図16に示すように、実施例1に係るプログラム規則検査装置100においては、検査対象プログラムが入力されると(ステップS201肯定)、プログラム検査処理部130が図示しない記憶部からフレームワークルール一覧を取得し(ステップS202)、検査対象プログラムにフレームワークルールが存在するか否かを判定する(ステップS203)。ここで、検査対象プログラムにフレームワークルールが存在しなかった場合には(ステップS203否定)、プログラム検査処理部130は、結果を検査結果記憶部170に保存して(ステップS213)、処理を終了する。
一方、検査対象プログラムにフレームワークルールが存在した場合には(ステップS203肯定)、プログラム検査処理部130は、プログラムチェックルール一覧をプログラム検査規則140から取得して(ステップS204)、チェックルールが存在するか否かを判定する(ステップS205)。ここで、チェックルールが存在しなかった場合には(ステップS205否定)、フレームワーク検査処理部150が、フレームワークチェックモジュールを実行する(ステップS210)。
一方、チェックルールが存在した場合には(ステップS205肯定)、プログラム検査処理部130は、プログラムチェックモジュールを実行して(ステップS206)、結果を検査結果記憶部170に保存する(ステップS207)。そして、全てのチェックルールについてチェックされると(ステップS208肯定)、フレームワーク検査処理部150がプログラム単体のNGが所定の割合以下か否かを判定する(ステップS209)。
ここで、プログラム単体のNGが所定の割合を越えていた場合には(ステップS209否定)、フレームワーク検査処理部150は、フレームワークに関する処理を実行していない旨の結果を検査結果記憶部170に保存して(ステップS214)、処理を終了する。一方、プログラム単体のNGが所定の割合以下であった場合には(ステップS209肯定)、フレームワーク検査処理部150は、フレームワークチェックモジュールを実行して(ステップS210)、結果を検査結果記憶部170に保存する(ステップS211)。
そして、全てのフレームワークルールについてチェックされると(ステップS212肯定)、実施例1に係るプログラム規則検査装置100は、処理を終了する。なお、実施例1に係るプログラム規則検査装置100は、検査対象プログラムが入力されるまで待機状態である(ステップS201否定)。また、実施例1に係るプログラム規則検査装置100は、ステップS208の判定において、全てのチェックルールについてチェックが終了するまで、プログラムの検査を実行する(ステップS208否定)。また、実施例1に係るプログラム規則検査装置100は、ステップS212の判定において、全てのフレームワークルールについてチェックが終了するまで、フレームワークの検査を実行する(ステップS212否定)。
図17は、実施例1に係るプログラム規則検査装置100によるフレームワーク検査処理の手順を説明するためのフローチャートである。なお、図17に示すフレームワーク検査処理の手順は、図16に示すステップS210に対応する。図17に示すように、実施例1に係るプログラム規則検査装置100においては、フレームワーク検査処理部150が、解析データ記憶部110から検査対象プログラムのクラス一覧を取得して(ステップS301)、クラス内のメソッド一覧を取得する(ステップS302)。そして、フレームワーク検査処理部150は、取得したメソッド内のインスタンス一覧を取得して(ステップS303)、インスタンスごとの呼出し先メソッドを取得する(ステップS304)。
その後、フレームワーク検査処理部150は、取得した呼出し先メソッドの呼出し先が正しいか否かを検査して(ステップS305)、検査結果を検査結果記憶部170に保存する(ステップS306)。さらに、フレームワーク検査処理部150は、呼出し先メソッドのインスタンス一覧を取得して(ステップS307)、呼出すメソッドがあるか否かの判定を行う(ステップS308)。
ここで、呼出すメソッドがある場合には(ステップS308肯定)、フレームワーク検査処理部150は、ステップS304に戻って、インスタンスごとの呼出し先メソッドを取得する。一方、呼出すメソッドがない場合には(ステップS308否定)、フレームワーク検査処理部150は、処理を終了する。
上述したように、実施例1によれば、プログラム解析処理部120が複数の検査対象プログラム間の関係を解析する。そして、フレームワーク検査処理部150が、プログラム解析処理部120によって解析された複数の検査対象プログラム間の関係がフレームワークの仕様規定であるフレームワーク規定に則した関係であるか否かを検査する。従って、実施例1に係るプログラム規則検査装置100は、複数のプログラム間の関連について検査を行うことで、複数階層に跨る処理が適切に実行されているか否かを判定することができ、システム全体を対象としたフレームワークルールの検査を行うことを可能にする。さらに、実施例1に係るプログラム規則検査装置100は、システム全体を対象としたフレームワークルールの検査を行うことにより、結果として、販売されるソフトウェアの品質を向上させることを可能にする。
また、実施例1によれば、フレームワーク検査処理部150は、アプリケーションが実行される際に複数の検査対象プログラムが呼出される順番を、フレームワークルールとして用いる。従って、実施例1に係るプログラム規則検査装置100は、複数のプログラム間に跨る呼出し関係、参照関係、及び継承関係が適切かどうかを判定することができる。
また、実施例1によれば、プログラム検査処理部130が、複数の検査対象プログラムそれぞれが、当該プログラムそれぞれの作成規定であるプログラムチェックルールに則しているか否かを検査する。そして、フレームワーク検査処理部150は、プログラム検査処理部130の検査結果に応じて、複数の検査対象プログラムに対する処理の内容を決定する。従って、実施例1に係るプログラム規則検査装置100は、プログラム単体の品質に応じて、臨機応変に処理を変更することができる。
また、実施例1によれば、フレームワーク検査処理部150は、プログラム検査処理部130による検査において、プログラム規定に則して作成されていると判定されたプログラム数の全プログラム数に対する割合が所定の閾値を超えていることを条件に、フレームワーク規定に基づく検査を実行する。従って、実施例1に係るプログラム規則検査装置100は、検査対象プログラムに対して高精度の検査を実行することができる。また、実施例1に係るプログラム規則検査装置100は、効率のよい検査を実行することができる。
例えば、従来技術では、「プログラム記述の変数名が規約通りの命令になっているか否かの検査」、「プログラム記述の文法記述が規約に則しているか否かの検査」、「プログラム記述の繰り返し処理記述の階層が規定数以下になっているか否かの検査」、「規約上、使用が許可されていない外部プログラムが使用されていないかの検査」、「他プログラムの処理メソッドの呼出方法の記述に誤りがないかの検査」などについて、プログラム単体を対象として検査されていたため、システム全体の検査が困難であった。
本実施例に係るプログラム規則検査装置100では、プログラム解析処理部120が検査対象のプログラム間の関係を事前に解析する。そして、フレームワーク検査処理部150が、プログラム解析処理部120によって解析されたプログラム間の関係を対象としてフレームワークに関する検査を行う。このことにより、本実施例に係るプログラム規則検査装置100では、ソフトウェアに含まれるプログラムソースコードの呼出関係や継承関係、或いは、共通して用いられる部品の利用方法の適合性など、従来技術では行えなかったシステム全体を対象としたフレームワークルールの検査を行うことが可能となる。
図18は、実施例1に係るプログラム規則検査装置100によるフレームワーク検査の一例を模式的に示した図である。図18に示すように、実施例1に係るプログラム規則検査装置100は、画面処理に係るプログラムと、業務処理に係るプログラムと、データベース処理に係るプログラムとに跨る一連の処理において、その呼出し順を検査して、各階層に跨る処理が適切に実行されているか否かを判定することができ、ソフトウェア品質を向上させることが可能となる。
さて、これまで実施例1及び2について説明したが、上述した実施例1及び2以外にも、種々の異なる形態にて実施されてよいものである。
(1)検査結果レポート
上述した実施例1及び2では、検査結果通知処理部180が表示部に表示させる検査結果レポートとして、検査結果の一覧や全ての検査結果を総合した総合品質評価を表示させる場合について説明した。しかしながら、本実施例はこれに限定されるものではなく、例えば、検査者が任意のパラメータを用いて、チェックしたい項目を選択する場合であってもいい。
図22−1及び図22−2は、検査結果レポートの変形例を説明するための図である。図22−1に示すように、検査結果通知処理部180は、種々の解析設定を有したGUI(Grafical User Interface)を表示部に表示させるようにしてもよい。解析設定としては、例えば、図22−1に示すように、納品前チェックに用いる各種設定や、開発時のチェックに用いる各種設定などが設けられてもよい。そして、検査結果通知処理部180は、図22−1に示すように、プロジェクトごとに詳細な検査結果を一覧で示した検査結果レポートを表示部に表示させてもよい。
そして、図22−1に示す検査結果レポートにおいては、図22−2に示すように、各種設定及び検査結果の表示領域が、検査者によって任意で変更可能であり、検査者の要求に応じた情報提供を可能にする。
(2)プログラム検査処理
上述した実施例1及び2では、フレームワークの検査を実行する前にプログラムの検査を実行する場合について説明した。しかしながら、本実施例はこれに限定されるものではなく、例えば、プログラムの検査を実行せずに、フレームワークの検査だけを実行する場合であってもよい。
(3)フレームワーク検査処理
上述した実施例1及び2では、フレームワーク検査処理として、プログラムの呼出し順と処理順とを別々に実行する場合について説明した。しかしながら、本実施例はこれに限定されるものではなく、例えば、フレームワーク検査処理としてプログラムの呼出し順と処理順とを同時に実行する場合であってもよい。
(4)フレームワーク検査処理の実行
上述した実施例1及び2では、プログラム検査の検査結果において、品質にNGが多い場合に、フレームワーク検査処理を実行しない場合について説明した。しかしながら、本実施例はこれに限定されるものではなく、例えば、プログラムの呼出し順と処理順とを同時に検査する規則検査装置において、プログラム検査の検査結果に応じて、どちらか一方の検査を実行するようにしてもよい。
(5)事前解析
上述した実施例1及び2では、アプリケーションの作成に用いられた複数のプログラム間の関係を事前解析する場合について説明した。しかしながら、本実施例はこれに限定されるものではなく、例えば、フレームワークルールの規則検査を実行するごとに、アプリケーションの作成に用いられた複数のプログラム間の関係を解析する場合であってもよい。
(6)システム構成等
図示した各装置の各構成要素は機能概念的なものであり、必ずしも物理的に図示された構成要素と同一であることを要しない。すなわち、各装置の分散・統合の具体的形態は図示のものに限られず、その全部または一部を、各種の負荷や使用状況などに応じて、任意の単位で機能的または物理的に分散・統合して構成することができる。例えば、図1に示すプログラム検査規則140とフレームワーク検査規則160とを一つの記憶部として統合してもよい。また、一方で、図1に示す検査結果通知処理部180を、検査結果を用いた演算処理を実行する演算部と、表示部を制御する表示制御部とに分散してもよい。
また、本実施例において説明した各処理のうち、手動的に行われるものとして説明した処理の全部または一部を手動的に行うこともできる。例えば、図16における検査対象プログラムの入力処理を自動で行ってもよい。かかる場合には、プログラムが作成されると、自動的にプログラム規則検査装置100に入力されるように設定されればよい。また、フレームワーク検査処理部150をプログラム規則検査装置100の外部装置としてネットワーク経由で接続するようにしてもよい。さらに、各装置にて行なわれる各処理機能は、その全部または任意の一部が、CPUおよび当該CPUにて解析実行されるプログラムにて実現され、あるいは、ワイヤードロジックによるハードウェアとして実現され得る。
(7)規則検査プログラム
ところで、上記実施例1では、ハードウェアロジックによって各種の処理を実現する場合を説明したが、本実施例はこれに限定されるものではなく、予め用意されたプログラムをコンピュータで実行するようにしてもよい。そこで、以下では、図23を用いて上記実施例1に示したプログラム規則検査装置100と同様の機能を有する規則検査プログラムを実行するコンピュータの一例を説明する。図23は、規則検査プログラムを実行するコンピュータを説明するための図である。
図23に示すように、コンピュータ1000は、例えば、メモリ1010と、CPU(Central Processing Unit)1020と、ハードディスクドライブインタフェース1030とを有する。また、図23に示すように、コンピュータ1000は、例えば、ディスクドライブインタフェース1040と、シリアルポートインタフェース1050と、ビデオアダプタ1060と、ネットワークインタフェース1070とを有し、これらの各部はバス1080によって接続される。
メモリ1010は、図23に示すように、ROM(Read Only Memory)1011及びRAM(Random Access Memory)1012を含む。ROM1011は、例えば、BIOS(Basic Input Output System)等のブートプログラムを記憶する。ハードディスクドライブインタフェース1030は、図23に示すように、ハードディスクドライブ1090に接続される。ディスクドライブインタフェース1040は、図23に示すように、ディスクドライブ1100に接続される。例えば磁気ディスクや光ディスク等の着脱可能な記憶媒体が、ディスクドライブ1100に挿入される。シリアルポートインタフェース1050は、図23に示すように、例えばマウス1110、キーボード1120に接続される。ビデオアダプタ1060は、図23に示すように、例えばディスプレイ1130に接続される。
ここで、図23に示すように、ハードディスクドライブ1090は、例えば、OS(Operating System)、アプリケーションプログラム、プログラムモジュール、プログラムデータを記憶する。すなわち、解析プログラムは、コンピュータ1000によって実行される指令が記述されたプログラムモジュールとして、例えばハードディスクに記憶される。具体的には、上述した実施例で説明したプログラム解析処理部120と同様の解析処理を実行する解析手順と、フレームワーク検査処理部150と同様の検査処理を実行するフレームワーク検査手順とが記述されたプログラムモジュールが、ハードディスクに記憶される。
また、上述した実施例で説明した解析データ記憶部110に記憶されるデータのように、規則検査プログラムによる情報処理に用いられるデータは、プログラムデータとして、例えばハードディスクに記憶される。そして、CPU1020が、ハードディスクに記憶されたプログラムモジュールやプログラムデータを必要に応じてRAM1012に読み出し、解析手順、フレームワーク検査手順を実行する。
なお、規則検査プログラムに係るプログラムモジュールやプログラムデータは、ハードディスクに記憶される場合に限られず、例えば着脱可能な記憶媒体に記憶され、ディスクドライブ1100等を介してCPU1020によって読み出されてもよい。あるいは、解析プログラムに係るプログラムモジュールやプログラムデータは、ネットワーク(LAN(Local Area Network)、WAN(Wide Area Network)等)を介して接続された他のコンピュータに記憶され、ネットワークインタフェース1070を介してCPU1020によって読み出されてもよい。