(57)【特許請求の範囲】
【請求項１】
アプリケーションの作成に用いられた複数のファイルについて、クラス解析、メソッド解析、インスタンス解析、メソッド呼出し解析及びインスタンス呼出し解析を含む解析処理を実行することで、前記複数のファイルに含まれるクラス構造、メソッド構造、インスタンス構造、メソッド呼出し関係、インスタンス呼出し関係を解析する解析部と、
前記解析部によって解析された呼出し関係が連続する複数のメソッドにおいて、最初の呼出し元となるメソッドを起点として、当該メソッドの呼出し関係に沿って順次呼出されるインスタンスの呼出し関係がフレームワークの仕様規定である複数のフレームワーク規定に則した関係であるか否かを前記解析部によって事前に解析された解析結果をもとに検査するフレームワーク検査部と、
を有することを特徴とする規則検査装置。
【請求項２】
前記フレームワーク検査部は、前記アプリケーションが実行される際に前記複数のファイルに含まれるメソッドが呼出される順番を、前記フレームワーク規定として用いることを特徴とする請求項１に記載の規則検査装置。
【請求項３】
前記フレームワーク検査部は、前記アプリケーションが実行される際に前記複数のファイルによって実行される処理の順番を、前記フレームワーク規定として用いることを特徴とする請求項１又は２に記載の規則検査装置。
【請求項４】
前記複数のファイルに含まれるクラス、メソッド、インスタンスの構造単位それぞれが、当該複数のファイルに含まれる構造単位それぞれの作成規定であるプログラム規定に則しているか否かを検査するプログラム検査部をさらに有し、
前記フレームワーク検査部は、前記プログラム検査部の検査結果に応じて、前記フレームワークの規定に基づく検査の内容を決定することを特徴とする請求項１〜３のいずれか１つに記載された規則検査装置。
【請求項５】
前記フレームワーク検査部は、前記プログラム検査部による検査において、前記プログラム規定に則して作成されていると判定された構造単位数の前記検査の対象となる全構造単位数に対する割合が所定の閾値を超えていることを条件に、前記フレームワーク規定に基づく検査を実行することを特徴とする請求項４に記載の規則検査装置。
【請求項６】
アプリケーションの作成に用いられた複数のファイルについて、クラス解析、メソッド解析、インスタンス解析、メソッド呼出し解析及びインスタンス呼出し解析を含む解析処理を実行することで、前記複数のファイルに含まれるクラス構造、メソッド構造、インスタンス構造、メソッド呼出し関係、インスタンス呼出し関係を解析する解析ステップと、
前記解析ステップによって解析された呼出し関係が連続する複数のメソッドにおいて、最初の呼出し元となるメソッドを起点として、当該メソッドの呼出し関係に沿って順次呼出されるインスタンスの呼出し関係がフレームワークの仕様規定である複数のフレームワーク規定に則した関係であるか否かを前記解析ステップによって事前に解析された解析結果をもとに検査するフレームワーク検査ステップと、
を含んだことを特徴とする規則検査方法。
【請求項７】
アプリケーションの作成に用いられた複数のファイルについて、クラス解析、メソッド解析、インスタンス解析、メソッド呼出し解析及びインスタンス呼出し解析を含む解析処理を実行することで、前記複数のファイルに含まれるクラス構造、メソッド構造、インスタンス構造、メソッド呼出し関係、インスタンス呼出し関係を解析する解析手順と、
フレームワークの仕様規定であるフレームワーク規定を記憶した記憶部から当該フレームワーク規定を読み出し、前記解析手順によって解析された呼出し関係が連続する複数のメソッドにおいて、最初の呼出し元となるメソッドを起点として、当該メソッドの呼出し関係に沿って順次呼出されるインスタンスの呼出し関係がフレームワークの仕様規定である複数のフレームワーク規定に則した関係であるか否かを前記解析手順によって事前に解析された解析結果をもとに検査するフレームワーク検査手順と、
をコンピュータに実行させることを特徴とする規則検査プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、規則検査装置、規則検査方法及び規則検査プログラムに関する。
【背景技術】
【０００２】
従来、ソフトウェアの開発では、作業効率の向上やプログラムソースコードの品質維持を目的として、フレームワークを用いた開発が行われている。フレームワークは、ソフトウェアの開発において標準的に用いられるプログラムソースコードや部品の利用規約などの枠組みである。例えば、フレームワークには、Ｊａｖａ（登録商標）やＶＢ．ＮＥＴそれぞれにデータベースアクセス用のフレームワーク、画面動作記述用のフレームワーク、帳票処理用のフレームワークなどがある。
【０００３】
ここで、ソフトウェアの開発においては、ソフトウェアの品質を向上させるために、品質診断が行われている。例えば、ソフトウェアの品質診断に用いられるツールとしては、プログラム検査システムが知られている。プログラム検査システムは、設計者によって作成されたプログラムソースコードが特定の方式設計に従って作成されているか否かを検査する。なお、特定の方式設計とは、例えば、プログラムソースコードの作成に用いられたプログラム言語ごとに規定された文法や規約などである。
【０００４】
また、プログラム検査システムは、ソフトウェアに含まれるプログラムソースコードの呼出先や継承元などを検査することで、フレームワークルールに従って作成されているか否かを検査する。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特許３３６０６３５号公報
【特許文献２】特開２００５−０５６１８３号公報
【特許文献３】特開２００９−９９１１１号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
しかしながら、上述した従来技術では、システム全体を対象としたフレームワークルールの検査を行うことが困難であった。具体的には、上述した従来技術では、プログラム単体を基準とした検査であることから、システム全体を対象としたフレームワークルールの検査を行うことが困難であった。
【０００７】
そこで、本開示の技術は、上述した従来技術の問題を鑑みて、システム全体を対象としたフレームワークルールの検査を行うことを可能にする規則検査装置、規則検査方法及び規則検査プログラムを提供することを目的とする。
【課題を解決するための手段】
【０００８】
上述した課題を解決し、目的を達成するため、開示の装置は、解析部とフレームワーク検査部とを有する。解析部は、アプリケーションの作成に用いられた複数のプログラム間の関係を解析する。フレームワーク検査部は、解析部によって解析された複数のプログラム間の関係がフレームワークの仕様規定であるフレームワーク規定に則した関係であるか否かを検査する。
【発明の効果】
【０００９】
開示の装置は、システム全体を対象としたフレームワークルールの検査を行うことを可能にする。
【図面の簡単な説明】
【００１０】
【図１】図１は、実施例１に係るプログラム規則検査装置の構成を説明するための図である。
【図２】図２は、解析データ記憶部によって記憶される管理データの一例を説明するための図である。
【図３】図３は、解析データ記憶部によって記憶されるクラス解析結果の一例を説明するための図である。
【図４】図４は、解析データ記憶部によって記憶されるメソッド解析結果の一例を説明するための図である。
【図５】図５は、解析データ記憶部によって記憶されるインスタンス解析結果の一例を説明するための図である。
【図６】図６は、解析データ記憶部によって記憶されるメソッド呼出し解析結果の一例を説明するための図である。
【図７−１】図７−１は、画面処理に関するプログラムソースコードの一例（１）を説明するための図である。
【図７−２】図７−２は、画面処理に関するプログラムソースコードの一例（２）を説明するための図である。
【図８−１】図８−１は、業務処理に関するプログラムソースコードの一例（１）を説明するための図である。
【図８−２】図８−２は、業務処理に関するプログラムソースコードの一例（２）を説明するための図である。
【図８−３】図８−３は、業務処理に関するプログラムソースコードの一例（３）を説明するための図である。
【図９−１】図９−１は、データベース処理に関するプログラムソースコードの一例（１）を説明するための図である。
【図９−２】図９−２は、データベース処理に関するプログラムソースコードの一例（２）を説明するための図である。
【図１０−１】図１０−１は、プログラムの実装方法に関する検査に用いられるプログラムチェックルールの一例（１）を説明するための図である。
【図１０−２】図１０−２は、プログラムの実装方法に関する検査に用いられるプログラムチェックルールの一例（２）を説明するための図である。
【図１１】図１１は、プログラムの継承に関する検査に用いられるプログラムチェックルールの一例を説明するための図である。
【図１２】図１２は、プログラムの呼出し方法に関する検査に用いられるプログラムチェックルールの一例を説明するための図である。
【図１３−１】図１３−１は、プログラムの呼出し順に関するフレームワークルールの一例（１）を説明するための図である。
【図１３−２】図１３−２は、プログラムの呼出し順に関するフレームワークルールの一例（２）を説明するための図である。
【図１３−３】図１３−３は、プログラムの呼出し順に関するフレームワークルールの一例（３）を説明するための図である。
【図１４−１】図１４−１は、検査結果レポートの一例（１）を説明するための図である。
【図１４−２】図１４−２は、検査結果レポートの一例（２）を説明するための図である。
【図１５】図１５は、実施例１に係るプログラム規則検査装置によるプログラムの事前解析処理の手順を説明するためのフローチャートである。
【図１６】図１６は、実施例１に係るプログラム規則検査装置による処理の手順を説明するためのフローチャートである。
【図１７】図１７は、実施例１に係るプログラム規則検査装置によるフレームワーク検査処理の手順を説明するためのフローチャートである。
【図１８】図１８は、実施例１に係るプログラム規則検査装置によるフレームワーク検査の一例を模式的に示した図である。
【図１９−１】図１９−１は、プログラムの処理順に関するフレームワークルールの一例（１）を説明するための図である。
【図１９−２】図１９−２は、プログラムの処理順に関するフレームワークルールの一例（２）を説明するための図である。
【図２０】図２０は、実施例２に係るプログラム規則検査装置によるフレームワーク検査処理の手順を説明するためのフローチャートである。
【図２１】図２１は、実施例２に係るプログラム規則検査装置によるフレームワーク検査の一例を模式的に示した図である。
【図２２−１】図２２−１は、検査結果レポートの変形例（１）を説明するための図である。
【図２２−２】図２２−２は、検査結果レポートの変形例（２）を説明するための図である。
【図２３】図２３は、規則検査プログラムを実行するコンピュータを説明するための図である。
【発明を実施するための形態】
【００１１】
以下に添付図面を参照して、本願の開示する規則検査装置、規則検査方法及び規則検査プログラムの実施例を詳細に説明する。なお、本願の開示する規則検査装置、規則検査方法及び規則検査プログラムは、以下の実施例により限定されるものではない。
【実施例１】
【００１２】
実施例１に係るプログラム規則検査装置は、アプリケーションの生成に用いられた複数のプログラム間の関係に基づいて、アプリケーションにおけるシステム全体を対象としたフレームワークルールの検査を行う。なお、ここでいうアプリケーションとは、例えば、企業などの要求により独自に開発された業務アプリケーションや、一般的な文章作成ソフト、表計算ソフトなどの汎用アプリケーションなどである。また、システム全体を対象としたフレームワークルールの検査とは、例えば、プログラムの呼出関係や継承関係、或いは、共通して用いられる部品の利用方法の適合性などである。
【００１３】
具体的には、実施例１に係るプログラム規則検査装置は、アプリケーションの生成に用いられた複数のプログラムの関係を事前に解析する。そして、実施例１に係るプログラム規則検査装置は、事前に解析した複数のプログラム間の関係を検査対象として、各プログラムの呼出関係や継承関係、或いは、共通して用いられる部品の利用方法の適合性などがフレームワークの仕様規定であるフレームワーク規定に則しているか否かを検査する。従って、実施例１に係るプログラム規則検査装置は、例えば、画面処理プログラム、業務処理プログラム、データベース処理プログラムなどの複数階層に跨る処理が適切に実行されているか否かを判定することができ、システム全体を対象としたフレームワークルールの検査を行うことを可能にする。
【００１４】
まず、実施例１に係るプログラム規則検査装置の構成を説明する。図１は、実施例１に係るプログラム規則検査装置の構成を説明するための図である。図１に示すように、プログラム規則検査装置１００は、解析データ記憶部１１０と、プログラム解析処理部１２０と、プログラム検査処理部１３０と、プログラム検査規則１４０と、フレームワーク検査処理部１５０と、フレームワーク検査規則１６０と、検査結果記憶部１７０と、検査結果通知処理部１８０とを有する。そして、プログラム規則検査装置１００は、図示しない入力部から入力された検査対象プログラムに対して各種処理を実行することで、プログラムの品質に係る検査を実行し、検査結果レポートを図示しない表示部に表示する。なお、ここでいう検査対象プログラムは、プログラムソースコードである。
【００１５】
解析データ記憶部１１０、プログラム検査規則１４０、フレームワーク検査規則１６０及び検査結果記憶部１７０は、例えば、ＲＡＭ（Random Access Memory）、フラッシュメモリ（Flash Memory）などの半導体メモリ素子、又は、ハードディスク、光ディスクなどの記憶装置である。また、プログラム解析処理部１２０、プログラム検査処理部１３０、フレームワーク検査処理部１５０、及び検査結果通知処理部１８０は、例えば、ＡＳＩＣ（Application Specific Integrated Circuit）やＦＰＧＡ（Field Programmable Gate Array）などの集積回路、又は、ＣＰＵ（Central Processing Unit）やＭＰＵ（Micro Processing Unit）などの電子回路である。
【００１６】
解析データ記憶部１１０は、アプリケーションの生成に用いられた複数のプログラム間の関係を記憶する。具体的には、解析データ記憶部１１０は、後述するプログラム解析処理部１２０の処理結果及び入力された検査対象プログラムを記憶する。図２は、解析データ記憶部１１０によって記憶される管理データの一例を説明するための図である。図２に示すように、解析データ記憶部１１０は、ファイル名、ファイル更新日時、言語、解析済みフラグ、ソースのハッシュコード及び解析対象フラグを連番に対応付けた管理データを記憶する。
【００１７】
なお、図２の「連番」とは、プログラム解析処理部１２０によって解析されたプログラムに割当てられた番号を意味している。また、図２の「ファイル名」とは、プログラム解析処理部１２０によって解析されたプログラムのファイル名を意味している。また、図２の「ファイル更新日時」とは、ファイルが最後に修正された日時を意味している。また、図２の「言語」とは、プログラムの作成に用いられたプログラム言語を意味している。また、図２の「解析済みフラグ」とは、解析が行われたか否かを示すフラグである。また、図２の「ソースのハッシュコード」とは、プログラムを一意に特定し、ファイルが修正されたか否かを判定するためのハッシュコードである。例えば、ファイルが修正された場合にはハッシュコードが変化するため、ファイルが修正されたか否かを判定することに用いられる。また、図２の「解析対象フラグ」とは、後に実行されるフレームワークに関する解析の対象となるか否かを示すフラグである。
【００１８】
例えば、解析データ記憶部１１０は、図２に示すように、「連番：００１」に対応付けて、「ファイル名：Ｍ＿ＳＨＡＩＮＶｉｅｗ．ｖｂ、ファイル更新日時：２０１０／０４／０３  １０：２３：２１、言語：ＶＢ．ＮＥＴ、解析済みフラグ：１、ソースのハッシュコード：９４８ａｄ３２ｅ、解析対象フラグ：１」を記憶する。すなわち、上述した情報は、プログラム解析処理部１２０によって「２０１０／０４／０３  １０：２３：２１」に解析されたプログラムは、ファイル名が「Ｍ＿ＳＨＡＩＮＶｉｅｗ．ｖｂ」であり、「ＶＢ．ＮＥＴ」を用いて作成されていることを示している。そして、上述した情報は、プログラムを特定するためのハッシュコードが「９４８ａｄ３２ｅ」であり、後に実行されるフレームワークに関する解析対象となることを示している。同様に、解析データ記憶部１１０は、図２に示すように、後述するプログラム解析処理部１２０によって解析されたプログラムについて、他の解析状況の管理データを記憶する。
【００１９】
図３は、解析データ記憶部１１０によって記憶されるクラス解析結果の一例を説明するための図である。図３に示すように、解析データ記憶部１１０は、ファイルパス、パッケージ名、クラス名、開始行番号、終了行番号、メソッド数、修飾子及び継承元に識別ＩＤを対応付けたクラス解析結果を記憶する。
【００２０】
なお、図３の「識別ＩＤ」とは、解析されたクラスを一意に識別するための識別子である。また、図３の「ファイルパス」とは、検査対象プログラムが格納されているフォルダの起点となるフォルダである解析ファイルパスからの相対パスを意味している。また、図３の「パッケージ名」とは、検査対象プログラムを含むソフトウェアの名称を意味している。また、図３の「クラス名」とは、検査対象プログラムのクラス名を意味している。また、図３の「開始行番号」とは、検査対象プログラムにおいて、クラスの開始行を示す行番号を意味している。また、図３の「終了行番号」とは、検査対象プログラムにおいて、クラスの終了行を示す行番号を意味している。また、図３の「メソッド数」とは、検査対象プログラムのクラスに含まれるメソッドの数を意味している。また、図３の「修飾子」とは、当該クラスを参照することが可能な領域を意味している。また、図３の「継承元」とは、当該クラスの元となるクラスを意味している。
【００２１】
例えば、解析データ記憶部１１０は、図３に示すように、クラス解析結果として「識別ＩＤ：１００１」に対応付けて「ファイルパス：ＷｅｂＡＳＭａｓｔｅｒ／Ｍ＿ＳＨＡＩＮＶｉｅｗ．ｖｂ、パッケージ名：ＷｅｂＡＳ、クラス名：Ｍ＿ＳＨＡＩＮＶｉｅｗ、開始行番号：６、終了行番号：９１、メソッド数：５、修飾子：Ｐａｒｔｉａｌ、継承元：ＢａｓｅＰａｇｅ」を記憶する。同様に、解析データ記憶部１１０は、図３に示すように、他のクラス解析結果を記憶する。
【００２２】
図４は、解析データ記憶部１１０によって記憶されるメソッド解析結果の一例を説明するための図である。図４においては、図３に示すクラス解析結果に含まれるメソッドについて解析された結果について示している。図４に示すように、解析データ記憶部１１０は、ファイル名、クラス名、メソッド名、パラメータ、戻り値型、開始行番号及び終了行番号に連番を対応付けたメソッド解析結果を記憶する。
【００２３】
なお、図４の「連番」とは、メソッドごとに割当てられた番号を意味している。また、図４の「ファイル名」とは、メソッドが属するファイル名を意味している。また、図４の「クラス名」とは、メソッドが属するクラス名を意味している。また、図４の「パラメータ」とは、メソッドに定義された処理を実行させるために指定するパラメータを意味している。また、図４の「戻り値型」とは、パラメータに対して引数が指定された場合に、導出される値の型を意味している。また、図４の「開始行番号」とは、検査対象プログラムにおいて、メソッドの開始行を示す行番号を意味している。また、図４の「終了行番号」とは、検査対象プログラムにおいて、メソッドの終了行を示す行番号を意味している。
【００２４】
例えば、解析データ記憶部１１０は、図４に示すように、メソッド解析結果として「連番：２００１」に対応付けて「ファイル名：ＷｅｂＡＳＭａｓｔｅｒ／Ｍ＿ＳＨＡＩＮＶｉｅｗ．ｖｂ、クラス名：Ｍ＿ＳＨＡＩＮＶｉｅｗ、メソッド名：Ｐａｇｅ＿Ｌｏａｄ、パラメータ：Ｏｂｊｅｃｔ，ＥｖｅｎｔＡｒｇｓ、戻り値型：Ｎｏｔｈｉｎｇ、開始行番号：９、終了行番号：２５」を記憶する。同様に、解析データ記憶部１１０は、図４に示すように、他のメソッド解析結果を記憶する。
【００２５】
図５は、解析データ記憶部１１０によって記憶されるインスタンス解析結果の一例を説明するための図である。図５においては、図４に示すメソッドに定義されたインスタンスに関して解析された結果を示している。図５に示すように、解析データ記憶部１１０は、ファイル名、クラス名、メソッド名、引数、戻り値型、宣言変数名、宣言変数型及び宣言行番号に連番を対応付けたインスタンス解析結果を記憶する。
【００２６】
なお、図５の「連番」とは、インスタンスごとに割当てられた番号を意味している。また、図５の「ファイル名」とは、インスタンスが属するファイル名を意味している。また、図５の「クラス名」とは、インスタンスが属するクラス名を意味している。また、図５の「メソッド名」とは、インスタンスを定義するメソッド名を意味している。また、図５の「引数」とは、メソッドのパラメータに対して指定される値を意味している。また、図５の「戻り値型」とは、引数によって導出される値の型を意味している。また、図５の「宣言変数名」とは、設計者によって指定されたインスタンスの変数名を意味している。また、図５の「宣言変数型」とは、インスタンスとして宣言された変数のデータ型又はクラス型などを意味している。また、図５の「宣言行番号」とは、検査対象プログラムにおいて、インスタンス変数が記載された行番号を意味している。
【００２７】
例えば、解析データ記憶部１１０は、図５に示すように、インスタンス解析結果として「連番：３００１」に対応付けて「ファイル名：ＷｅｂＡＳＭａｓｔｅｒ／Ｍ＿ＳＨＡＩＮＶｉｅｗ．ｖｂ、クラス名：Ｍ＿ＳＨＡＩＮＶｉｅｗ、メソッド名：ＩｎｓｅｒｔＢｕｔｔｏｎ＿Ｃｌｉｃｋ、引数：Ｏｂｊｅｃｔ，ＥｖｅｎｔＡｒｇｓ、戻り値型：Ｎｏｔｈｉｎｇ、宣言変数名：ｐａｒａｍ、宣言変数型：Ｍ＿ＳＨＡＩＮＭＡＮＡＧＥＲＰａｒａｍ、宣言行番号：３９」を記憶する。同様に、解析データ記憶部１１０は、図５に示すように、他のインスタンス解析結果を記憶する。
【００２８】
図６は、解析データ記憶部１１０によって記憶されるメソッド呼出し解析結果の一例を説明するための図である。図６においては、図５に示すインスタンスごとの呼出しメソッドについて解析された結果を示している。図６に示すように、解析データ記憶部１１０は、ファイル名、クラス名、メソッド名、引数、戻り値型、呼出し先クラス、呼出し先メソッド名、呼出し先メソッドパラメータ及び呼出し行番号に識別ＩＤを対応付けたメソッド呼出し解析結果を記憶する。
【００２９】
なお、図６の「識別ＩＤ」とは、インスタンスを一意に特定するための識別子を意味している。また、図６の「ファイル名」とは、インスタンスが属するファイル名を意味している。また、図６の「クラス名」とは、インスタンスが属するクラス名を意味している。また、図６の「メソッド名」とは、インスタンスを定義するメソッド名を意味している。また、図６の「引数」とは、メソッドのパラメータに対して指定される値を意味している。また、図６の「戻り値型」とは、引数によって導出される値の型を意味している。また、図６の「呼出し先クラス」とは、各インスタンスにおいて呼出されるクラスを意味している。また、図６の「呼出し先メソッド名」とは、各インスタンスにおいて呼出されるメソッド名を意味している。また、図６の「呼出し先メソッドパラメータ」とは、呼出し先メソッドのパラメータを意味している。また、図６の「呼出し行番号」とは、検査対象プログラムにおいて、メソッドの呼出しが記載された行番号を意味している。
【００３０】
例えば、解析データ記憶部１１０は、図６に示すように、メソッド呼出し解析結果として「識別ＩＤ：４００１」に対応付けて「ファイル名：ＷｅｂＡＳＭａｓｔｅｒ／Ｍ＿ＳＨＡＩＮＶｉｅｗ．ｖｂ、クラス名：Ｍ＿ＳＨＡＩＮＶｉｅｗ、メソッド名：ＩｎｓｅｒｔＢｕｔｔｏｎ＿Ｃｌｉｃｋ、引数：Ｏｂｊｅｃｔ，ＥｖｅｎｔＡｒｇｓ、戻り値型：Ｎｏｔｈｉｎｇ、呼出し先クラス：Ｖａｌｉｄａｔｏｒ、呼出し先メソッド名：ＳｅｒｖｅｒＶａｌｉｄａｔｅ、呼出し先メソッドパラメータ：なし、呼出し行番号：３４」を記憶する。同様に、解析データ記憶部１１０は、図６に示すように、他のメソッド呼出し解析結果を記憶する。
【００３１】
図１に戻って、プログラム検査規則１４０は、プログラム単体のチェックルールであるプログラムチェックルールを記憶する。フレームワーク検査規則１６０は、フレームワークのチェックルールであるフレームワークルールを記憶する。検査結果記憶部１７０は、後述するプログラム検査処理部１３０及びフレームワーク検査処理部１５０の処理結果である検査結果を記憶する。なお、プログラムチェックルール、フレームワークルール及び検査結果については、後に詳述する。
【００３２】
プログラム解析処理部１２０は、アプリケーションの作成に用いられた複数のプログラム間の関係を解析する。具体的には、プログラム解析処理部１２０は、フレームワークルールの規則検査を実行する事前解析として、アプリケーションの作成に用いられた複数のプログラム間の関係を解析する。より具体的には、プログラム解析処理部１２０は、利用者によって指定された全てのプログラムを事前解析の対象とし、対象としたプログラムの記載内容、参照関係などを解析して、解析結果を解析データ記憶部１１０に格納する。以下では、プログラム解析処理部１２０による解析処理について、図７−１〜図９−２を用いて説明する。
【００３３】
ここで、まず、図７−１〜図９−２に示すプログラムソースコードについて説明する。図７−１及び図７−２は、画面処理に関するプログラムソースコードの一例を説明するための図である。なお、図７−１及び図７−２は、画面処理に関する１つのプログラムソースコードを示している。図７−１及び図７−２においては、図示しない表示部が所定の画面を表示する際の処理について示されている。例えば、図７−１に示すように、画面処理に関するプログラムソースコードには、「コメント：’表示メッセージのクリア」に対応する「プログラム文：Ｍｅ．ＲｅｓｕｌｔＭｅｓｓａｇｅ．Ｔｅｘｔ＝Ｓｔｒｉｎｇ．Ｅｍｐｔｙ」などが記載されている。
【００３４】
図８−１〜図８−３は、業務処理に関するプログラムソースコードの一例を説明するための図である。なお、図８−１〜図８−３は、業務処理に関する１つのプログラムソースコードを示している。図８−１〜図８−３においては、トランザクションの各種処理について示されている。業務処理に関するプログラムソースコードには、画面処理に関するプログラムソースコードと同様に、コメントが付された各種処理のプログラム文が記載されている。
【００３５】
図９−１及び図９−２は、データベース処理に関するプログラムソースコードの一例を説明するための図である。なお、図９−１及び図９−２は、業務処理に関する１つのプログラムソースコードを示している。図９−１及び図９−２においては、データベースに対するアクセス処理などについて示されている。データベース処理に関するプログラムソースコードには、画面処理に関するプログラムソースコードと同様に、コメントが付された各種処理のプログラム文が記載されている。
【００３６】
例えば、プログラム解析処理部１２０は、図７−１〜図９−２に示すようなプログラムソースコードを事前解析に用いる。プログラム解析処理部１２０は、利用者によって指定された全てのプログラムソースコードを事前解析の対象とし、対象としたプログラムの記載内容、参照関係などを解析する。例えば、複数階層に跨ってプログラムが格納されている場合に、利用者によって起点フォルダである解析ファイルパスが指定されると、プログラム解析処理部１２０は、まず、指定された解析ファイルパスの配下にある全てのプログラムソースコードを検査対象プログラムとし、検査対象プログラムのファイルパスを取得する。なお、解析ファイルパスはプロジェクトごとに一意に設定されており、利用者は、事前解析の解析対象として所望する解析ファイルを一意に特定し、指定することが可能である。
【００３７】
例えば、事前解析として、図７−１及び図７−２に示す画面処理に関するプログラムソースコードを解析する場合には、プログラム解析処理部１２０は、以下のような解析処理を実行して、解析結果を解析データ記憶部１１０に格納する。プログラム解析処理部１２０は、まず、プログラムソースコードのパッケージ名が宣言された箇所からパッケージ名を取得する。例えば、プログラム解析処理部１２０は、図７−１の「４行目」に示すパッケージ名「ＷｅｂＡＳ」を取得して、取得した「ＷｅｂＡＳ」を解析データ記憶部１１０に格納する。
【００３８】
そして、プログラム解析処理部１２０は、プログラムソースコードのクラス解析を実行して、解析結果を解析データ記憶部１１０に格納する。具体的には、プログラム解析処理部１２０は、プログラムソースコードにおけるクラスの判定と、クラス内のメソッド数のカウントと、クラスの修飾子及び継承元の取得とを、正規表現を用いて実行する。なお、ここでいう「正規表現」とは、任意の文字列の中から特定の文字列を抽出するために予め定められたパターンである。例を挙げると、「"((Ｐｕｂｌｉｃ|Ｐｒｉｖａｔｅ|Ｐｒｏｔｅｃｔｅｄ|Ｐａｒｔｉａｌ)(￥ｓ))＊((Ｓｈａｒｅｄ)( ￥ｓ))＊(Ｃｌａｓｓ) ￥ｓ(￥[？)(￥ｗ＋)(￥]？)(.＊)"」などがクラス開始行の正規表現として用いられ、「"^Ｅｎｄ￥ｓＣｌａｓｓ？"」などがクラス終了行の正規表現として用いられる。例えば、「"((Ｐｕｂｌｉｃ|Ｐｒｉｖａｔｅ|Ｐｒｏｔｅｃｔｅｄ|Ｐａｒｔｉａｌ)(￥ｓ))＊((Ｓｈａｒｅｄ)( ￥ｓ))＊(Ｃｌａｓｓ) ￥ｓ(￥[？)(￥ｗ＋)(￥]？)(.＊)"」は、「Ｐｒｉｖａｔｅ  Ｃｌａｓｓ」や「Ｐｅｒｔｉａｌ  Ｃｌａｓｓ」などを検索対象の文字列とした正規表現である。すわなち、プログラム解析処理部１２０は、プログラムソースコードを参照して、予め定められた正規表現とのパターンマッチングを実行することにより、クラスの判定やメソッド数のカウントなどを行う。例えば、正規表現は、図示しない記憶部によって記憶されている。
【００３９】
例えば、プログラム解析処理部１２０は、図７−１及び図７−２を参照して、正規表現のパターンと一致する「６行目」の「Ｐａｒｔｉａｌ  Ｃｌａｓｓ  Ｍ＿ＳＨＡＩＮＶｉｅｗ」から「９１行目」の「Ｅｎｄ  Ｃｌａｓｓ」までをクラスと判定する。そして、プログラム解析処理部１２０は、クラスにおける「Ｐｒｉｖａｔｅ  Ｓｕｂ」と「Ｅｎｄ  Ｓｕｂ」との間を１つのメソッドとして判定して、クラス内のメソッド数をカウントする。上記した場合には、「"^((Ｐｕｂｌｉｃ|Ｐｒｉｖａｔｅ|Ｐｒｏｔｅｃｔｅｄ|Ｆｒｉｅｎｄ|Ｏｖｅｒｒｉｄａｂｌｅ)(￥ｓ))＊((Ｓｈａｒｅｄ|Ｓｈａｄｏｗｓ|Ｏｖｅｒｒｉｄｅｓ|Ｏｖｅｒｌｏａｄｓ)(￥ｓ))＊(Ｆｕｎｃｔｉｏｎ|Ｓｕｂ)￥ｓ(￥ｗ＋？)￥((.＊)￥)((￥ｓ(Ａｓ)￥ｓ(.＋))＊)？"」及び「"^Ｅｎｄ￥ｓ(Ｓｕｂ|Ｆｕｎｃｔｉｏｎ)＄"」が、それぞれ「メソッドの開始行」及び「メソッドの終了行」の正規表現として、例えば、図示しない記憶部に予め記憶されている。例えば、正規表現「"^((Ｐｕｂｌｉｃ|Ｐｒｉｖａｔｅ|Ｐｒｏｔｅｃｔｅｄ|Ｆｒｉｅｎｄ|Ｏｖｅｒｒｉｄａｂｌｅ)(￥ｓ))＊((Ｓｈａｒｅｄ|Ｓｈａｄｏｗｓ|Ｏｖｅｒｒｉｄｅｓ|Ｏｖｅｒｌｏａｄｓ)(￥ｓ))＊(Ｆｕｎｃｔｉｏｎ|Ｓｕｂ)￥ｓ(￥ｗ＋？)￥((.＊)￥)((￥ｓ(Ａｓ)￥ｓ(.＋))＊)？"」は、「Ｐｒｉｖａｔｅ  Ｓｕｂ」や「Ｐｒｉｖａｔｅ  Ｆｕｎｃｔｉｏｎ」などを検索対象の文字列とした正規表現である。さらに、プログラム解析処理部１２０は、クラスの修飾子及び継承元を、正規表現を用いて取得する。具体的には、プログラム解析処理部１２０は、正規表現を用いてクラスの開始行を取得し、クラスの開始行に含まれるクラス修飾子や継承元クラスを取得する。例えば、プログラム解析処理部１２０は、クラスの修飾子「Ｐａｒｔｉａｌ」及び継承元「ＢａｓｅＰａｇｅ」を、正規表現を用いて取得する。
【００４０】
そして、プログラム解析処理部１２０は、プログラムソースコードから取得したクラス情報に識別ＩＤを付与して、解析データ記憶部１１０に格納する。例えば、プログラム解析処理部１２０は、図３に示すように、「識別ＩＤ：１００１、ファイルパス：ＷｅｂＡＳＭａｓｔｅｒ／Ｍ＿ＳＨＡＩＮＶｉｅｗ．ｖｂ、パッケージ名：ＷｅｂＡＳ、クラス名：Ｍ＿ＳＨＡＩＮＶｉｅｗ、開始行番号：６、終了行番号：９１、メソッド数：５、修飾子：Ｐａｒｔｉａｌ、継承元：ＢａｓｅＰａｇｅ」をクラス解析結果として解析データ記憶部１１０に格納する。
【００４１】
同様に、プログラム解析処理部１２０は、図８−１〜図８−３に示す業務処理に関するプログラムソースコードや、図９−１及び図９−２に示すデータベース処理に関するプログラムソースコードなど、事前解析の対象プログラムとして利用者に指定されたプログラムソースコードをクラス解析して、解析結果を解析データ記憶部１１０に格納する（図３参照）。
【００４２】
そして、プログラム解析処理部１２０は、クラスに含まれた各メソッドの解析を実行する。具体的には、プログラム解析処理部１２０は、正規表現を用いて判定したメソッドごとに、メソッドの開始行に含まれるメソッド名、パラメータ、戻り値型などを、正規表現を用いて取得する。例えば、プログラム解析処理部１２０は、図７−１の「９行目」に示す「Ｐｒｉｖａｔｅ  Ｓｕｂ  Ｐａｇｅ＿Ｌｏａｄ」と「２５行目」に示す「Ｅｎｄ  Ｓｕｂ」との間に記載されたメソッドの解析を実行する。そして、プログラム解析処理部１２０は、解析結果「ファイル名：ＷｅｂＡＳＭａｓｔｅｒ／Ｍ＿ＳＨＡＩＮＶｉｅｗ．ｖｂ、クラス名：Ｍ＿ＳＨＡＩＮＶｉｅｗ、メソッド名：Ｐａｇｅ＿Ｌｏａｄ、パラメータ：Ｏｂｊｅｃｔ，ＥｖｅｎｔＡｒｇｓ、戻り値型：Ｎｏｔｈｉｎｇ、開始行番号：９、終了行番号：２５」を「連番：２００１」に対応付けてメソッド解析結果として解析データ記憶部１１０に格納する（図４参照）。同様に、プログラム解析処理部１２０は、各クラスに含まれる全てのメソッドを解析して、解析結果を解析データ記憶部１１０に格納する。例えば、メソッドの解析に用いられる正規表現は、図示しない記憶部によって記憶されている。
【００４３】
さらに、プログラム解析処理部１２０は、メソッドに定義されたインスタンスの解析を実行する。具体的には、プログラム解析処理部１２０は、メソッドの開始行と終了行との間に定義されたインスタンスの宣言行番号、インスタンスの変数名、宣言データ型又はクラス型を、正規表現を用いて取得する。例えば、プログラム解析処理部１２０は、図７−１の「３１行目」に示す「Ｐｒｉｖａｔｅ  Ｓｕｂ  ＩｎｓｅｒｔＢｕｔｔｏｎ＿Ｃｌｉｃｋ」と「５９行目」に示す「Ｅｎｄ  Ｓｕｂ」との間に記載されたメソッドに定義されたインスタンスの解析を実行する。そして、プログラム解析処理部１２０は、インスタンス解析結果として、図５の「連番：３００１」及び「連番：３００１」に示す各種情報を解析データ記憶部１１０に格納する。同様に、プログラム解析処理部１２０は、各メソッドに定義されたインスタンスを解析して、解析結果を解析データ記憶部１１０に格納する（図５参照）。例えば、インスタンスの解析に用いられる正規表現は、図示しない記憶部によって記憶されている。
【００４４】
また、さらに、プログラム解析処理部１２０は、メソッドごとの呼出し先の解析を実行する。具体的には、プログラム解析処理部１２０は、メソッドごとに、呼出し先クラス、呼出し先メソッド、呼出し先メソッドパラメータ、呼出し行番号などを、正規表現を用いて取得する。例えば、プログラム解析処理部１２０は、図７−１の「３１行目」に示す「Ｐｒｉｖａｔｅ  Ｓｕｂ  ＩｎｓｅｒｔＢｕｔｔｏｎ＿Ｃｌｉｃｋ」と「５９行目」に示す「Ｅｎｄ  Ｓｕｂ」との間に記載されたメソッドの呼出し先の解析を実行する。そして、プログラム解析処理部１２０は、メソッド呼出し解析結果として、図６の「識別ＩＤ：４００１」〜「識別ＩＤ：４００４」に示す各種情報を解析データ記憶部１１０に格納する。同様に、プログラム解析処理部１２０は、各メソッドの呼出し先を解析して、解析結果を解析データ記憶部１１０に格納する（図６参照）。例えば、呼出し先の解析に用いられる正規表現は、図示しない記憶部によって記憶されている。
【００４５】
プログラム解析処理部１２０は、利用者によって指定された解析ファイルパスの配下にある全てのプログラムソースコードについて、上述した各解析を実行して、解析結果を解析データ記憶部１１０に格納する。また、同時に、プログラム解析処理部１２０は、解析したプログラムソースコードを解析データ記憶部１１０に格納する。
【００４６】
図１に戻って、プログラム検査処理部１３０は、複数のプログラムそれぞれが、当該複数のプログラムそれぞれの作成規定であるプログラム規定に則しているか否かを検査する。具体的には、プログラム検査処理部１３０は、プログラム検査規則１４０によって記憶されたプログラムチェックルールを用いて、解析データ記憶部１１０に記憶された検査対象プログラムを検査する。そして、プログラム検査処理部１３０は、検査結果を検査結果記憶部１７０に格納する。
【００４７】
ここで、プログラム検査規則１４０によって記憶されるプログラムチェックルールについて、図１０−１〜図１２を用いて説明する。なお、プログラムチェックルールは、設計者による処理によって予めプログラム検査規則１４０に記憶されている。図１０−１及び図１０−２は、プログラムの実装方法に関する検査に用いられるプログラムチェックルールの一例を説明するための図である。なお、図１０−１及び図１０−２は、プログラムの実装方法に関する検査に用いられる１つのプログラムチェックルールを示している。例えば、プログラムの実装方法に関する検査に用いられるプログラムチェックルールには、図１０−１及び図１０−２に示すように、「ＩＦ句のネストが閾値を越えていないか」が規定されている。例を挙げると、プログラムの実装方法に関する検査に用いられるプログラムチェックルールには、「ＩＦ句のネストが３階層以下であるか否か」などが規定される。
【００４８】
図１１は、プログラムの継承に関する検査に用いられるプログラムチェックルールの一例を説明するための図である。例えば、プログラムの継承元の検査に用いられるプログラムチェックルールには、図１１に示すように、「プログラム種別に応じた親クラスを継承しているか」が規定されている。例を挙げると、プログラムの継承元の検査に用いられるプログラムチェックルールには、「Ｌｏｇｉｃ層のプログラムがＢａｓｅＬｏｇｉｃＣｌａｓｓを継承しているか否か」などが規定される。
【００４９】
図１２は、プログラムの呼出し方法に関する検査に用いられるプログラムチェックルールの一例を説明するための図である。例えば、プログラムの呼出し方法に関する検査に用いられるプログラムチェックルールには、図１２に示すように、「ループ内でＳＱＬを実行している箇所が無いか」が規定されている。例を挙げると、プログラムの呼出し方法に関する検査に用いられるプログラムチェックルールには、「Ｆｏｒ句の中にＳＱＬ発行処理が記載されているか否か」などが規定される。
【００５０】
例えば、プログラム検査処理部１３０は、図１０−１〜図１２に示すプログラムチェックルールを用いて、図７−１〜図９−２に示すプログラムソースコードを検査する。ここで、プログラム検査処理部１３０は、検査内容に応じて、図３〜図６に示す解析結果を参照して、プログラムソースコードの検査を実行する。例えば、図１０−１及び図１０−２に示すプログラムの実装方法に関する検査を実行する場合には、プログラム検査処理部１３０は、図４に示すメソッド解析結果を参照して、メソッドごとにＩＦ句内のネストの検査を実行する。
【００５１】
図１に戻って、フレームワーク検査処理部１５０は、プログラム解析処理部１２０によって解析された複数のプログラム間の関係がフレームワークの仕様規定であるフレームワーク規定に則した関係であるか否かを検査する。具体的には、フレームワーク検査処理部１５０は、解析データ記憶部１１０によって記憶された事前解析の解析結果を用いて、各プログラムの呼出関係や継承関係、或いは、共通して用いられる部品の利用方法の適合性などがフレームワーク規定に則しているか否かを検査する。例えば、フレームワーク検査処理部１５０は、複数のプログラムの呼出し順が、アプリケーションが実行される際の呼出し順であるか否かを検査する。なお、どのような検査を実行するかについては、利用者が任意に決定することができる。例えば、予め設定された全てのフレームワーク規定について検査を実行する場合であってもよいし、利用者によって任意に選択されたフレームワーク規定について検査を実行する場合であってもよい。また、利用者が新たに定義したフレームワーク規定について検査を実行する場合であってもよい。
【００５２】
ここで、フレームワーク検査処理部１５０は、プログラム検査処理部１３０の検査結果に応じて、フレームワーク規定に基づく検査の内容を決定する。具体的には、フレームワーク検査処理部１５０は、プログラム検査処理部１３０による検査において、プログラム規定に則して作成されていると判定されたプログラム数の全プログラム数に対する割合が所定の閾値を超えていることを条件に、フレームワーク規定に基づく検査を実行する。
【００５３】
例えば、フレームワーク検査処理部１５０は、検査結果記憶部１７０によって記憶されたプログラム検査処理部１３０の処理結果を参照して、プログラム規定に則して作成されていると判定されたプログラム数の全プログラム数に対する割合が８０％を超えていた場合に、検査を実行する。すなわち、フレームワーク検査処理部１５０は、全プログラムにおいて、品質がＮＧである（不良である）プログラムの割合が所定の閾値を超えた場合には、プログラムのコーディングレベルが低いと判定して、フレームワークに関する検査を実行しない。
【００５４】
フレームワークに関する検査を実行する場合には、フレームワーク検査処理部１５０は、フレームワーク検査規則によって記憶されたフレームワークルールを用いて、検査を実行する。ここで、フレームワーク検査規則１６０によって記憶されたフレームワークルールについて、図１３−１〜図１３−３を用いて説明する。図１３−１〜図１３−３は、プログラムの呼出し順に関するフレームワークルールの一例を説明するための図である。なお、図１３−１〜図１３−３は、プログラムの呼出し順に関する検査に用いられる１つのフレームワークルールを示している。なお、フレームワークルールは、設計者による処理によって予めフレームワーク検査規則１６０に記憶されている。
【００５５】
例えば、プログラムの呼出し順に関するフレームワークルールには、図１３−１に示すように、「画面クラス一覧の取得」、「画面クラス内メソッド一覧の取得」、「メソッド内インスタンス一覧の取得」及び「呼出メソッド取得」を順次、再帰的に実行することが定義されている。そして、プログラムの呼出し順に関するフレームワークルールには、図１３−２及び図１３−３に示すように、「呼出し先クラスが正しいかチェック」することが定義されている。呼出し先クラスのチェックとしては、例えば、図１３−２に示すように、「Ｖｉｅｗ（画面処理）クラスのメソッドからはＭａｎａｇｅｒ（業務処理）クラスか部品クラスのメソッドのみ呼出可能」とするチェック項目が定義されている。
【００５６】
例えば、フレームワーク検査処理部１５０は、図１３−１〜図１３−３に示すフレームワークルールを用いて、複数のプログラム間の呼出し順を検査する。例を挙げると、フレームワーク検査処理部１５０は、まず、フレームワーク検査規則１６０から図１３−１〜図１３−３に示すフレームワークルールを読み出す。そして、フレームワーク検査処理部１５０は、フレームワークルールに定義されているように、画面処理のクラス一覧を解析データ記憶部１１０から取得する。例えば、フレームワーク検査処理部１５０は、解析データ記憶部１１０から、図３に示すクラス解析結果から、画面処理のクラス「Ｍ＿ＳＨＡＩＮＶｉｅｗ」を取得する。
【００５７】
そして、フレームワーク検査処理部１５０は、取得したクラスのメソッド一覧を取得する。例えば、フレームワーク検査処理部１５０は、図４に示すメソッド解析結果から、取得したクラス「Ｍ＿ＳＨＡＩＮＶｉｅｗ」のメソッド「Ｐａｇｅ＿Ｌｏａｄ」、「ＩｎｓｅｒｔＢｕｔｔｏｎ＿Ｃｌｉｃｋ」、「ＵｐｄａｔｅＢｕｔｔｏｎ＿Ｃｌｉｃｋ」「ＤｅｌｅｔｅＢｕｔｔｏｎ＿Ｃｌｉｃｋ」及び「ＣｌｅａｒＢｕｔｔｏｎ＿Ｃｌｉｃｋ」を取得する。
【００５８】
その後、フレームワーク検査処理部１５０は、取得したメソッド内のインスタンス一覧を取得する。例えば、フレームワーク検査処理部１５０は、図５に示すインスタンス解析結果から、取得したメソッド「ＩｎｓｅｒｔＢｕｔｔｏｎ＿Ｃｌｉｃｋ」のインスタンスである「連番：３００１」及び「連番：３００２」を取得する。
【００５９】
そして、フレームワーク検査処理部１５０は、取得したインスタンスの呼出し先メソッドを順番に取得して、呼出し先が正しいか否かを検査する。例えば、フレームワーク検査処理部１５０は、図６に示すメソッド呼出し解析結果から、取得したインスタンスの呼出し先クラス及び呼出し先メソッドを順次取得する。すなわち、フレームワーク検査処理部１５０は、図６に示す識別ＩＤ「４００１」〜「４００４」それぞれに対応付けられた呼出し先クラス及び呼出し先メソッドを順次取得して、呼出し先が正しいか否かを検査する。
【００６０】
例を挙げると、フレームワーク検査処理部１５０は、図６に示す「識別ＩＤ：４００３」において「クラス：Ｍ＿ＳＨＡＩＮＶｉｅｗ、メソッド：ＩｎｓｅｒｔＢｕｔｔｏｎ＿Ｃｌｉｃｋ」の呼出し先が「クラス：Ｍ＿ＳＨＡＩＮＭａｎａｇｅｒ、メソッド：Ｅｎｔｒｙｓｈａｉｎ」となっていることから、呼出し順が正しいと判定する。ここで、仮に、「クラス：Ｍ＿ＳＨＡＩＮＶｉｅｗ、メソッド：ＩｎｓｅｒｔＢｕｔｔｏｎ＿Ｃｌｉｃｋ」の呼出し先が「クラス：Ｍ＿ＳＨＡＩＮＬｏｇｉｃ」であった場合には、フレームワーク検査処理部１５０は、呼出し順が正しくないと判定する。
【００６１】
そして、フレームワーク検査処理部１５０は、次に、取得した呼出し先メソッド「Ｅｎｔｒｙｓｈａｉｎ」のインスタンス一覧を取得して、上述した処理と同様の処理を実行して、呼出し先が正しいか否かを検査する。すなわち、フレームワーク検査処理部１５０は、図５のインスタンス解析結果から連番「３００３」〜「３００６」のインスタンスを取得して、図６に示す識別ＩＤ「４００５」〜「４０１２」それぞれの呼出し先クラス及び呼出し先メソッドを取得し、それぞれの呼出し先が正しいか否かを検査する。このようにして、フレームワーク検査処理部１５０は、画面処理のメソッドから順次呼出される全ての呼出しメソッドの呼出し順がフレームワークルールに則しているか否かを検査する。フレームワーク検査処理部１５０は、上述した一連の処理を、取得したクラスの全てのメソッドに対して実行し、検査結果を検査結果記憶部１７０に格納する。
【００６２】
図１に戻って、検査結果通知処理部１８０は、検査結果記憶部１７０によって記憶されたプログラムの検査結果又はフレームワークの検査結果を図示しない表示部に検査結果レポートとして表示させる。図１４−１及び図１４−２は、検査結果レポートの一例を説明するための図である。
【００６３】
例えば、検査結果通知処理部１８０は、図１４−１に示すように、ファイル、行、ルールＩＤ、指摘内容、カテゴリ、重要度、分類及び結果を対応付けた検査結果の一覧をチェック結果レポートとして図示しない表示部に表示させる。また、検査結果通知処理部１８０は、図１４−２に示すように、全ての検査結果を総合した総合品質評価を検査結果レポートして表示部に表示させる。図１４−２においては、検査結果が重大な欠陥か又は軽度な欠陥か、或いは、指摘程度であるのかを判定したレポートを示している。また、図１４−２においては、プログラムのカテゴリ別に検査結果を集約したレポートを示している。このような検査結果レポートを表示部に表示させることによって、設計者が以後に施すべき措置を的確に判断することが可能になる。
【００６４】
次に、図１５〜図１７を用いて、実施例１に係るプログラム規則検査装置１００の処理の手順を説明する。図１５は、実施例１に係るプログラム規則検査装置１００によるプログラムの事前解析処理の手順を説明するためのフローチャートである。
【００６５】
図１５に示すように、実施例１に係るプログラム規則検査装置１００においては、プログラム解析処理部１２０が検査対象プログラムから、ソース情報を取得する（ステップＳ１０１）。そして、プログラム解析処理部１２０は、取得したソースごとのクラス情報を取得する（ステップＳ１０２）。その後、プログラム解析処理部１２０は、取得したクラスごとのメソッド情報を取得する（ステップＳ１０３）。
【００６６】
さらに、プログラム解析処理部１２０は、取得したメソッドに呼出されるメソッドの情報を取得して（ステップＳ１０４）、各メソッドの処理内容を取得する（ステップＳ１０５）。そして、さらに、プログラム解析処理部１２０は、取得した各情報を解析データ記憶部１１０に保存して（ステップＳ１０６）、処理を終了する。
【００６７】
図１６は、実施例１に係るプログラム規則検査装置１００による処理の手順を説明するためのフローチャートである。なお、図１６においては、プログラム解析処理部１２０による事前解析処理が終了した後の処理について示している。
【００６８】
図１６に示すように、実施例１に係るプログラム規則検査装置１００においては、検査対象プログラムが入力されると（ステップＳ２０１肯定）、プログラム検査処理部１３０が図示しない記憶部からフレームワークルール一覧を取得し（ステップＳ２０２）、検査対象プログラムにフレームワークルールが存在するか否かを判定する（ステップＳ２０３）。ここで、検査対象プログラムにフレームワークルールが存在しなかった場合には（ステップＳ２０３否定）、プログラム検査処理部１３０は、結果を検査結果記憶部１７０に保存して（ステップＳ２１３）、処理を終了する。
【００６９】
一方、検査対象プログラムにフレームワークルールが存在した場合には（ステップＳ２０３肯定）、プログラム検査処理部１３０は、プログラムチェックルール一覧をプログラム検査規則１４０から取得して（ステップＳ２０４）、チェックルールが存在するか否かを判定する（ステップＳ２０５）。ここで、チェックルールが存在しなかった場合には（ステップＳ２０５否定）、フレームワーク検査処理部１５０が、フレームワークチェックモジュールを実行する（ステップＳ２１０）。
【００７０】
一方、チェックルールが存在した場合には（ステップＳ２０５肯定）、プログラム検査処理部１３０は、プログラムチェックモジュールを実行して（ステップＳ２０６）、結果を検査結果記憶部１７０に保存する（ステップＳ２０７）。そして、全てのチェックルールについてチェックされると（ステップＳ２０８肯定）、フレームワーク検査処理部１５０がプログラム単体のＮＧが所定の割合以下か否かを判定する（ステップＳ２０９）。
【００７１】
ここで、プログラム単体のＮＧが所定の割合を越えていた場合には（ステップＳ２０９否定）、フレームワーク検査処理部１５０は、フレームワークに関する処理を実行していない旨の結果を検査結果記憶部１７０に保存して（ステップＳ２１４）、処理を終了する。一方、プログラム単体のＮＧが所定の割合以下であった場合には（ステップＳ２０９肯定）、フレームワーク検査処理部１５０は、フレームワークチェックモジュールを実行して（ステップＳ２１０）、結果を検査結果記憶部１７０に保存する（ステップＳ２１１）。
【００７２】
そして、全てのフレームワークルールについてチェックされると（ステップＳ２１２肯定）、実施例１に係るプログラム規則検査装置１００は、処理を終了する。なお、実施例１に係るプログラム規則検査装置１００は、検査対象プログラムが入力されるまで待機状態である（ステップＳ２０１否定）。また、実施例１に係るプログラム規則検査装置１００は、ステップＳ２０８の判定において、全てのチェックルールについてチェックが終了するまで、プログラムの検査を実行する（ステップＳ２０８否定）。また、実施例１に係るプログラム規則検査装置１００は、ステップＳ２１２の判定において、全てのフレームワークルールについてチェックが終了するまで、フレームワークの検査を実行する（ステップＳ２１２否定）。
【００７３】
図１７は、実施例１に係るプログラム規則検査装置１００によるフレームワーク検査処理の手順を説明するためのフローチャートである。なお、図１７に示すフレームワーク検査処理の手順は、図１６に示すステップＳ２１０に対応する。図１７に示すように、実施例１に係るプログラム規則検査装置１００においては、フレームワーク検査処理部１５０が、解析データ記憶部１１０から検査対象プログラムのクラス一覧を取得して（ステップＳ３０１）、クラス内のメソッド一覧を取得する（ステップＳ３０２）。そして、フレームワーク検査処理部１５０は、取得したメソッド内のインスタンス一覧を取得して（ステップＳ３０３）、インスタンスごとの呼出し先メソッドを取得する（ステップＳ３０４）。
【００７４】
その後、フレームワーク検査処理部１５０は、取得した呼出し先メソッドの呼出し先が正しいか否かを検査して（ステップＳ３０５）、検査結果を検査結果記憶部１７０に保存する（ステップＳ３０６）。さらに、フレームワーク検査処理部１５０は、呼出し先メソッドのインスタンス一覧を取得して（ステップＳ３０７）、呼出すメソッドがあるか否かの判定を行う（ステップＳ３０８）。
【００７５】
ここで、呼出すメソッドがある場合には（ステップＳ３０８肯定）、フレームワーク検査処理部１５０は、ステップＳ３０４に戻って、インスタンスごとの呼出し先メソッドを取得する。一方、呼出すメソッドがない場合には（ステップＳ３０８否定）、フレームワーク検査処理部１５０は、処理を終了する。
【００７６】
上述したように、実施例１によれば、プログラム解析処理部１２０が複数の検査対象プログラム間の関係を解析する。そして、フレームワーク検査処理部１５０が、プログラム解析処理部１２０によって解析された複数の検査対象プログラム間の関係がフレームワークの仕様規定であるフレームワーク規定に則した関係であるか否かを検査する。従って、実施例１に係るプログラム規則検査装置１００は、複数のプログラム間の関連について検査を行うことで、複数階層に跨る処理が適切に実行されているか否かを判定することができ、システム全体を対象としたフレームワークルールの検査を行うことを可能にする。さらに、実施例１に係るプログラム規則検査装置１００は、システム全体を対象としたフレームワークルールの検査を行うことにより、結果として、販売されるソフトウェアの品質を向上させることを可能にする。
【００７７】
また、実施例１によれば、フレームワーク検査処理部１５０は、アプリケーションが実行される際に複数の検査対象プログラムが呼出される順番を、フレームワークルールとして用いる。従って、実施例１に係るプログラム規則検査装置１００は、複数のプログラム間に跨る呼出し関係、参照関係、及び継承関係が適切かどうかを判定することができる。
【００７８】
また、実施例１によれば、プログラム検査処理部１３０が、複数の検査対象プログラムそれぞれが、当該プログラムそれぞれの作成規定であるプログラムチェックルールに則しているか否かを検査する。そして、フレームワーク検査処理部１５０は、プログラム検査処理部１３０の検査結果に応じて、複数の検査対象プログラムに対する処理の内容を決定する。従って、実施例１に係るプログラム規則検査装置１００は、プログラム単体の品質に応じて、臨機応変に処理を変更することができる。
【００７９】
また、実施例１によれば、フレームワーク検査処理部１５０は、プログラム検査処理部１３０による検査において、プログラム規定に則して作成されていると判定されたプログラム数の全プログラム数に対する割合が所定の閾値を超えていることを条件に、フレームワーク規定に基づく検査を実行する。従って、実施例１に係るプログラム規則検査装置１００は、検査対象プログラムに対して高精度の検査を実行することができる。また、実施例１に係るプログラム規則検査装置１００は、効率のよい検査を実行することができる。
【００８０】
例えば、従来技術では、「プログラム記述の変数名が規約通りの命令になっているか否かの検査」、「プログラム記述の文法記述が規約に則しているか否かの検査」、「プログラム記述の繰り返し処理記述の階層が規定数以下になっているか否かの検査」、「規約上、使用が許可されていない外部プログラムが使用されていないかの検査」、「他プログラムの処理メソッドの呼出方法の記述に誤りがないかの検査」などについて、プログラム単体を対象として検査されていたため、システム全体の検査が困難であった。
【００８１】
本実施例に係るプログラム規則検査装置１００では、プログラム解析処理部１２０が検査対象のプログラム間の関係を事前に解析する。そして、フレームワーク検査処理部１５０が、プログラム解析処理部１２０によって解析されたプログラム間の関係を対象としてフレームワークに関する検査を行う。このことにより、本実施例に係るプログラム規則検査装置１００では、ソフトウェアに含まれるプログラムソースコードの呼出関係や継承関係、或いは、共通して用いられる部品の利用方法の適合性など、従来技術では行えなかったシステム全体を対象としたフレームワークルールの検査を行うことが可能となる。
【００８２】
図１８は、実施例１に係るプログラム規則検査装置１００によるフレームワーク検査の一例を模式的に示した図である。図１８に示すように、実施例１に係るプログラム規則検査装置１００は、画面処理に係るプログラムと、業務処理に係るプログラムと、データベース処理に係るプログラムとに跨る一連の処理において、その呼出し順を検査して、各階層に跨る処理が適切に実行されているか否かを判定することができ、ソフトウェア品質を向上させることが可能となる。
【実施例２】
【００８３】
上述した実施例１では、フレームワークルールとして、プログラムの呼出し順を用いる場合について説明した。実施例２では、フレームワークルールとして、プログラムの処理順を用いる場合について説明する。
【００８４】
実施例２においては、フレームワーク検査処理部１５０による処理の内容と、フレームワーク検査規則１６０によって記憶される内容とが実施例１とは異なる。以下、これらを中心に説明する。実施例２に係るプログラム規則検査装置１００のフレームワーク検査処理部１５０は、プログラム解析処理部１２０によって解析された複数のプログラムの処理順が、アプリケーションが実行される際の処理順であるか否かを検査する。
【００８５】
ここで、実施例２に係るフレームワーク検査処理部１５０によって用いられるフレームワークルールについて、図１９−１及び図１９−２を用いて説明する。図１９−１及び図１９−２は、プログラムの処理順に関するフレームワークルールの一例を説明するための図である。なお、図１９−１及び図１９−２は、プログラムの処理順に関する検査に用いられる１つのフレームワークルールを示している。なお、フレームワークルールは、設計者による処理によって予めフレームワーク検査規則１６０に記憶されている。
【００８６】
例えば、プログラムの処理順に関するフレームワークルールには、図１９−１に示すように、「画面クラス一覧の取得」、「画面クラス内メソッド一覧の取得」、「メソッド内インスタンス一覧の取得」及び「呼出メソッド取得」を順次、再帰的に実行することが定義されている。ここで、プログラムの処理順に関するフレームワークルールでは、図１９−１に示すように、「呼出インスタンスを順に保持する」ことが定義されている。
【００８７】
そして、プログラムの処理順に関するフレームワークルールには、図１９−２に示すように、順に保持していた呼出インスタンスの「呼出し順序をチェック」することが定義されている。すなわち、プログラムの処理順の検査においては、呼出しインスタンスを呼出した順に保持しておき、その呼出し順序をチェックすることによって、プログラムの処理順の検査を実行する。
【００８８】
例えば、フレームワーク検査処理部１５０は、図１９−１〜図１９−２に示すフレームワークルールを用いて、複数のプログラム間の処理順を検査する。ここで、フレームワーク検査処理部１５０は、呼出し順の検査時と同様に、クラス、メソッド及びインスタンスの一覧を順に取得する。例えば、フレームワーク検査処理部１５０は、画面処理のクラス「Ｍ＿ＳＨＡＩＮＶｉｅｗ」からメソッド「ＩｎｓｅｒｔＢｕｔｔｏｎ＿Ｃｌｉｃｋ」のインスタンスである「連番：３００１」及び「連番：３００２」を取得する（図５参照）。
【００８９】
そして、フレームワーク検査処理部１５０は、図６に示す識別ＩＤ「４００１」〜「４００４」に対応付けられた呼出し先クラス及び呼出し先メソッドを順次取得しながら、順に呼出しメソッドのチェックを実行する。ここで、識別ＩＤ「４００３」において、呼出し先が「クラス：Ｍ＿ＳＨＡＩＮＭａｎａｇｅｒ、メソッド：Ｅｎｔｒｙｓｈａｉｎ」となっていることから、フレームワーク検査処理部１５０は、次に、識別ＩＤ「４００５」」〜「４０１２」の呼出し先のメソッドを順にチェックすることとなる。
【００９０】
実施例２に係るフレームワーク検査処理部１５０は、呼出し先のメソッドを順にチェックしながら順番を保持する。すなわち、実施例２に係るフレームワーク検査処理部１５０は、識別ＩＤ「４００５」及び「４００６」でログ出力処理が実行された後、識別ＩＤ「４００７」でトランザクション処理が開始されることを識別する。このようにして、実施例２に係るフレームワーク検査処理部１５０は、画面処理から派生する一連の処理の処理順がフレームワークルールに則しているか否かを検査する。実施例２に係るフレームワーク検査処理部１５０は、上述した処理順の検査を、取得したクラスの全てのメソッドに対して実行し、検査結果を検査結果記憶部１７０に格納する。
【００９１】
図２０は、実施例２に係るプログラム規則検査装置１００によるフレームワーク検査処理の手順を説明するためのフローチャートである。なお、図２０に示すフレームワーク検査処理の手順は、図１５に示すステップＳ１１１に対応する。図２０に示すように、実施例２に係るプログラム規則検査装置１００においては、フレームワーク検査処理部１５０が、解析データ記憶部１１０から検査対象プログラムのクラス一覧を取得して（ステップＳ４０１）、クラス内のメソッド一覧を取得する（ステップＳ４０２）。そして、フレームワーク検査処理部１５０は、取得したメソッド内のインスタンス一覧を取得して（ステップＳ４０３）、インスタンスごとの呼出し先メソッドを呼出す順番に対応付けて取得する（ステップＳ４０４）。
【００９２】
その後、フレームワーク検査処理部１５０は、呼出し先メソッドのインスタンス一覧を取得して（ステップ４０５）、呼出すメソッドがあるか否かを判定する（ステップＳ４０６）。ここで、呼出すメソッドがある場合には（ステップＳ４０６肯定）、フレームワーク検査処理部１５０は、ステップＳ４０４に戻って、呼出し先メソッドを呼出す順番に対応付けて取得する。
【００９３】
一方、呼出すメソッドがない場合には（ステップＳ４０６否定）、フレームワーク検査処理部１５０は、メソッドの呼出し順番を検査して（ステップＳ４０７）、検査結果を検査結果記憶部１７０に保存して（ステップＳ４０８）、処理を終了する。
【００９４】
上述したように、実施例２によれば、フレームワーク検査処理部１５０は、アプリケーションが実行される際に複数のプログラムによって実行される処理の順番を、フレームワーク規定として用いる。従って、実施例２に係るプログラム規則検査装置１００は、プログラムの詳細な検査を実行することを可能にする。
【００９５】
図２１は、実施例２に係るプログラム規則検査装置１００によるフレームワーク検査の一例を模式的に示した図である。図２１に示すように、実施例２に係るプログラム規則検査装置１００は、画面処理に係るプログラムの処理、業務処理に係るプログラムの処理及びデータベース処理に係るプログラムの処理の処理順を検査することができる。例えば、実施例２に係るプログラム規則検査装置１００は、図２１に示すように、入力チェック処理、ログ出力処理、トランザクション開始処理、登録処理、トランザクション終了処理、画面表示処理が順番に実行されるか否かを検査することができる。すなわち、実施例２に係るプログラム規則検査装置１００は、各階層に跨る処理が適切に実行されているか否かを詳細に検査することができ、システム全体を対象としたフレームワークルールの高精度な検査を行うことを可能にする。
【実施例３】
【００９６】
さて、これまで実施例１及び２について説明したが、上述した実施例１及び２以外にも、種々の異なる形態にて実施されてよいものである。
【００９７】
（１）検査結果レポート
上述した実施例１及び２では、検査結果通知処理部１８０が表示部に表示させる検査結果レポートとして、検査結果の一覧や全ての検査結果を総合した総合品質評価を表示させる場合について説明した。しかしながら、本実施例はこれに限定されるものではなく、例えば、検査者が任意のパラメータを用いて、チェックしたい項目を選択する場合であってもいい。
【００９８】
図２２−１及び図２２−２は、検査結果レポートの変形例を説明するための図である。図２２−１に示すように、検査結果通知処理部１８０は、種々の解析設定を有したＧＵＩ（Ｇｒａｆｉｃａｌ  Ｕｓｅｒ  Ｉｎｔｅｒｆａｃｅ）を表示部に表示させるようにしてもよい。解析設定としては、例えば、図２２−１に示すように、納品前チェックに用いる各種設定や、開発時のチェックに用いる各種設定などが設けられてもよい。そして、検査結果通知処理部１８０は、図２２−１に示すように、プロジェクトごとに詳細な検査結果を一覧で示した検査結果レポートを表示部に表示させてもよい。
【００９９】
そして、図２２−１に示す検査結果レポートにおいては、図２２−２に示すように、各種設定及び検査結果の表示領域が、検査者によって任意で変更可能であり、検査者の要求に応じた情報提供を可能にする。
【０１００】
（２）プログラム検査処理
上述した実施例１及び２では、フレームワークの検査を実行する前にプログラムの検査を実行する場合について説明した。しかしながら、本実施例はこれに限定されるものではなく、例えば、プログラムの検査を実行せずに、フレームワークの検査だけを実行する場合であってもよい。
【０１０１】
（３）フレームワーク検査処理
上述した実施例１及び２では、フレームワーク検査処理として、プログラムの呼出し順と処理順とを別々に実行する場合について説明した。しかしながら、本実施例はこれに限定されるものではなく、例えば、フレームワーク検査処理としてプログラムの呼出し順と処理順とを同時に実行する場合であってもよい。
【０１０２】
（４）フレームワーク検査処理の実行
上述した実施例１及び２では、プログラム検査の検査結果において、品質にＮＧが多い場合に、フレームワーク検査処理を実行しない場合について説明した。しかしながら、本実施例はこれに限定されるものではなく、例えば、プログラムの呼出し順と処理順とを同時に検査する規則検査装置において、プログラム検査の検査結果に応じて、どちらか一方の検査を実行するようにしてもよい。
【０１０３】
（５）事前解析
上述した実施例１及び２では、アプリケーションの作成に用いられた複数のプログラム間の関係を事前解析する場合について説明した。しかしながら、本実施例はこれに限定されるものではなく、例えば、フレームワークルールの規則検査を実行するごとに、アプリケーションの作成に用いられた複数のプログラム間の関係を解析する場合であってもよい。
【０１０４】
（６）システム構成等
図示した各装置の各構成要素は機能概念的なものであり、必ずしも物理的に図示された構成要素と同一であることを要しない。すなわち、各装置の分散・統合の具体的形態は図示のものに限られず、その全部または一部を、各種の負荷や使用状況などに応じて、任意の単位で機能的または物理的に分散・統合して構成することができる。例えば、図１に示すプログラム検査規則１４０とフレームワーク検査規則１６０とを一つの記憶部として統合してもよい。また、一方で、図１に示す検査結果通知処理部１８０を、検査結果を用いた演算処理を実行する演算部と、表示部を制御する表示制御部とに分散してもよい。
【０１０５】
また、本実施例において説明した各処理のうち、手動的に行われるものとして説明した処理の全部または一部を手動的に行うこともできる。例えば、図１６における検査対象プログラムの入力処理を自動で行ってもよい。かかる場合には、プログラムが作成されると、自動的にプログラム規則検査装置１００に入力されるように設定されればよい。また、フレームワーク検査処理部１５０をプログラム規則検査装置１００の外部装置としてネットワーク経由で接続するようにしてもよい。さらに、各装置にて行なわれる各処理機能は、その全部または任意の一部が、ＣＰＵおよび当該ＣＰＵにて解析実行されるプログラムにて実現され、あるいは、ワイヤードロジックによるハードウェアとして実現され得る。
【０１０６】
（７）規則検査プログラム
ところで、上記実施例１では、ハードウェアロジックによって各種の処理を実現する場合を説明したが、本実施例はこれに限定されるものではなく、予め用意されたプログラムをコンピュータで実行するようにしてもよい。そこで、以下では、図２３を用いて上記実施例１に示したプログラム規則検査装置１００と同様の機能を有する規則検査プログラムを実行するコンピュータの一例を説明する。図２３は、規則検査プログラムを実行するコンピュータを説明するための図である。
【０１０７】
図２３に示すように、コンピュータ１０００は、例えば、メモリ１０１０と、ＣＰＵ（Central  Processing  Unit）１０２０と、ハードディスクドライブインタフェース１０３０とを有する。また、図２３に示すように、コンピュータ１０００は、例えば、ディスクドライブインタフェース１０４０と、シリアルポートインタフェース１０５０と、ビデオアダプタ１０６０と、ネットワークインタフェース１０７０とを有し、これらの各部はバス１０８０によって接続される。
【０１０８】
メモリ１０１０は、図２３に示すように、ＲＯＭ（Read  Only  Memory）１０１１及びＲＡＭ（Random  Access  Memory）１０１２を含む。ＲＯＭ１０１１は、例えば、ＢＩＯＳ（Basic  Input  Output  System）等のブートプログラムを記憶する。ハードディスクドライブインタフェース１０３０は、図２３に示すように、ハードディスクドライブ１０９０に接続される。ディスクドライブインタフェース１０４０は、図２３に示すように、ディスクドライブ１１００に接続される。例えば磁気ディスクや光ディスク等の着脱可能な記憶媒体が、ディスクドライブ１１００に挿入される。シリアルポートインタフェース１０５０は、図２３に示すように、例えばマウス１１１０、キーボード１１２０に接続される。ビデオアダプタ１０６０は、図２３に示すように、例えばディスプレイ１１３０に接続される。
【０１０９】
ここで、図２３に示すように、ハードディスクドライブ１０９０は、例えば、ＯＳ（Operating  System）、アプリケーションプログラム、プログラムモジュール、プログラムデータを記憶する。すなわち、解析プログラムは、コンピュータ１０００によって実行される指令が記述されたプログラムモジュールとして、例えばハードディスクに記憶される。具体的には、上述した実施例で説明したプログラム解析処理部１２０と同様の解析処理を実行する解析手順と、フレームワーク検査処理部１５０と同様の検査処理を実行するフレームワーク検査手順とが記述されたプログラムモジュールが、ハードディスクに記憶される。
【０１１０】
また、上述した実施例で説明した解析データ記憶部１１０に記憶されるデータのように、規則検査プログラムによる情報処理に用いられるデータは、プログラムデータとして、例えばハードディスクに記憶される。そして、ＣＰＵ１０２０が、ハードディスクに記憶されたプログラムモジュールやプログラムデータを必要に応じてＲＡＭ１０１２に読み出し、解析手順、フレームワーク検査手順を実行する。
【０１１１】
なお、規則検査プログラムに係るプログラムモジュールやプログラムデータは、ハードディスクに記憶される場合に限られず、例えば着脱可能な記憶媒体に記憶され、ディスクドライブ１１００等を介してＣＰＵ１０２０によって読み出されてもよい。あるいは、解析プログラムに係るプログラムモジュールやプログラムデータは、ネットワーク（ＬＡＮ（Local  Area  Network）、ＷＡＮ（Wide  Area  Network）等）を介して接続された他のコンピュータに記憶され、ネットワークインタフェース１０７０を介してＣＰＵ１０２０によって読み出されてもよい。
【符号の説明】
【０１１２】
１００  プログラム規則検査装置
１１０  解析データ記憶部
１２０  プログラム解析処理部
１３０  プログラム検査処理部
１４０  プログラム検査規則
１５０  フレームワーク検査処理部
１６０  フレームワーク検査規則
１７０  検査結果記憶部
１８０  検査結果通知処理部
【図１】
0005121891.tif 000002
【図２】
0005121891.tif 000003
【図３】
0005121891.tif 000004
【図４】
0005121891.tif 000005
【図５】
0005121891.tif 000006
【図６】
0005121891.tif 000007
【図７−１】
0005121891.tif 000008
【図７−２】
0005121891.tif 000009
【図８−１】
0005121891.tif 000010
【図８−２】
0005121891.tif 000011
【図８−３】
0005121891.tif 000012
【図９−１】
0005121891.tif 000013
【図９−２】
0005121891.tif 000014
【図１０−１】
0005121891.tif 000015
【図１０−２】
0005121891.tif 000016
【図１１】
0005121891.tif 000017
【図１２】
0005121891.tif 000018
【図１３−１】
0005121891.tif 000019
【図１３−２】
0005121891.tif 000020
【図１３−３】
0005121891.tif 000021
【図１４−１】
0005121891.tif 000022
【図１４−２】
0005121891.tif 000023
【図１５】
0005121891.tif 000024
【図１６】
0005121891.tif 000025
【図１７】
0005121891.tif 000026
【図１８】
0005121891.tif 000027
【図１９−１】
0005121891.tif 000028
【図１９−２】
0005121891.tif 000029
【図２０】
0005121891.tif 000030
【図２１】
0005121891.tif 000031
【図２２−１】
0005121891.tif 000032
【図２２−２】
0005121891.tif 000033
【図２３】
0005121891.tif 000034