(57)【要約】【課題】ソースコードにどのような設計ルールが適用されているか、開発者が知らない場合でも、そのソースコードに適用されている設計ルールを推測する。【解決手段】依存関係抽出部は、ソースコードに含まれる構成要素相互の依存関係のそれぞれを記述したデータである依存関係リストを生成する。構造パターン照合部は、依存関係リストから、設計ルールを構成する構造パターンに合致する構成要素群を抽出し、抽出した構成要素群の情報をルール適用候補リストとして出力する。ルール適用判定部は、ルール適用候補リストに含まれる構成要素群の依存関係のそれぞれが、設計ルールをなす制約を満たすか否かを判定する。【選択図】図１
2015132960.tif 000002
【特許請求の範囲】
【請求項１】
ソースコードに含まれる構成要素相互の依存関係のそれぞれを記述したデータである依存関係リストを生成する第１の手段と、
前記依存関係リストから、設計ルールを構成する構造パターンに合致する構成要素群を抽出し、抽出した構成要素群の情報をルール適用候補リストとして出力する第２の手段と、
前記ルール適用候補リストに含まれる構成要素群の依存関係のそれぞれが、前記設計ルールをなす制約を満たすか否かを判定する第３の手段と
を有するソフトウェア設計改善支援装置。
【請求項２】
前記第３の手段は、前記ルール適用候補リストに含まれる依存関係のうち、前記制約を満たすものの割合が、閾値を越えるか否かを判定し、閾値を越えていないと判定した場合は、前記構造パターンと前記制約からなる設計ルールが前記ソースコードに適用されていると判定する、請求項１のソフトウェア設計改善支援装置。
【請求項３】
前記ソフトウェア設計改善支援装置は、前記第３の手段の判定結果に基づいて、ルール適用候補リストに含まれる依存関係のうち、前記制約を満たさない依存関係の情報を、逸脱箇所指摘メッセージとして出力する第４の手段をさらに有する、請求項１又は２のソフトウェア設計改善支援装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本明細書に記載の実施の形態は、ソフトウェア設計改善支援装置に関する。
【背景技術】
【０００２】
一般に、ソフトウェアの新規開発時には、そのソースコードは保守性高く設計されている。保守性を高くする手法として、特定のモジュール間の依存方向などの方針が定められる設計ルールが適用されている。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２０１３−２１８３８１号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
よりよいソフトウェアとするために、バージョンアップや改修が行われることが多く、そのよう場合には、既存資産であるソースコードに追加や変更を行う派生開発がなされるが、その結果としてソフトウェア構造の劣化が生じてしまうことがある。また、ソフトウェアの改変等に際して、設計書がその都度作成されない等、変更管理がなされていないため、当初の設計方針からソースコードが乖離している場合もあるが、そのような設計方針からの乖離を知る方法はなかった。
【０００５】
本発明の目的は、ソースコードにどのような設計ルールが適用されているかを開発者が知らない場合でも、そのソースコードに適用されている設計ルールを推測することを可能にする技術を提供することにある。
【課題を解決するための手段】
【０００６】
本発明の実施の形態はソフトウェア設計改善支援装置として提案される。このソフトウェア設計改善支援装置は、第１の手段と、第２の手段と、第３の手段とを有する。
第１の手段は、ソースコードに含まれる構成要素相互の依存関係のそれぞれを記述したデータである依存関係リストを生成する。
【０００７】
第２の手段は、依存関係リストから、設計ルールを構成する構造パターンに合致する構成要素群を抽出し、抽出した構成要素群の情報をルール適用候補リストとして出力する。
第３の手段は、ルール適用候補リストに含まれる構成要素群の依存関係のそれぞれが、設計ルールをなす制約を満たすか否かを判定する。
【０００８】
上記の第３の手段は、ルール適用候補リストに含まれる依存関係のうち、制約を満たすものの割合が、閾値を越えるか否かを判定し、閾値を越えていないと判定した場合は、構造パターンと制約からなる設計ルールがソースコードに適用されていると判定することができてもよい。
【０００９】
ソフトウェア設計改善支援装置は、第３の手段の判定結果に基づいて、ルール適用候補リストに含まれる依存関係のうち、制約を満たさない依存関係の情報を、逸脱箇所指摘メッセージとして出力する第４の手段をさらに有していてもよい。
【図面の簡単な説明】
【００１０】
【図１】実施の形態に係るソフトウェア設計改善支援装置の構成例を示す機能ブロック図
【図２】設計ルールの例を示す図
【図３】ソースコードに含まれる各モジュールの依存関係を示す図
【図４】図３に示す依存関係を有するソースコードから依存関係抽出部によって生成される依存関係リストの例を示す図
【図５】構造パターン記憶部に記憶されている構造パターンの例を示す図
【図６】依存関係リスト記憶部に記憶されている依存関係リストを、モジュールの依存関係のツリー図として示した図
【図７】図５、図６に示す例において、構造パターン記憶部が出力するルール適用候補リストの例を示す図
【図８】逸脱箇所指摘メッセージの一例を示す図
【図９】設計ルール適用推測処理の一例を示すフローチャート
【図１０】ステップS103の処理内容の一例を示すフローチャート
【図１１】ステップS107からS109の具体的処理例を示すフローチャート
【図１２】ソースコードに含まれるモジュールの依存関係を示すツリー図
【図１３】実施例における構造パターンの条件を満たすモジュールのツリー図
【図１４】依存関係抽出部がソースコードから生成する、依存関係リストの一部の例を示す図
【図１５】実施例において生成されるルール適用候補リストの例を示す図
【図１６】図１３に示したツリー図において、このルール適用候補リストに含まれるモジュール群を示す図
【図１７】実施例における逸脱箇所指摘メッセージの例を示す図
【発明を実施するための形態】
【００１１】
以下、図面を参照して本発明の実施の形態に係るソフトウェア設計改善支援装置を説明する。
【００１２】
[０．用語の定義]
本明細書中で使用する用語の定義を述べる。
【００１３】
［０．１．構成要素］
「構成要素」とは、プログラム若しくはソースコードを構成する要素であって、例えばクラス、関数、変数である。
【００１４】
［０．２．依存関係］
「依存関係」とは、ある構成要素が他の構成要素に含まれる関数の呼び出しを行い、若しくは、ある構成要素が他の構成要素に含まれる変数の参照・書き込みを行う、構成要素間の関係をいう。
【００１５】
［０．３．ソフトウェア構造］
「ソフトウェア構造」とは、構成要素と、各構成要素の依存関係で表現される、ソフトウェアの特徴をいう。
【００１６】
［０．４．ソフトウェア構造の劣化］
「ソフトウェア構造の劣化」とは、ソフトウェアのソースコード上に保守性を下げるような問題箇所が多く存在し、それぞれが互いに悪影響を及ぼしあっているという状況をいう。例えば、モジュール・関数・変数の構成要素の間の依存関係が複雑に絡み合っているソフトウェアは、ソフトウェア構造の劣化に該当する。
【００１７】
［０．５．構造パターン］
「構造パターン」とは、複数の構成要素の依存関係の特徴をいう。
【００１８】
[１．実施の形態]
本発明の実施の形態は、ソフトウェア設計改善支援装置として提案される。このソフトウェア設計改善支援装置は、予め用意した設計ルールとのパターンマッチングにより、ソースコードから設計ルール適用範囲の候補を抽出し、抽出した候補の中で、偶然候補に含まれたと考えられるものと、設計ルールが適用されている可能性の高いものを判定し、設計ルールが適用されていると判断した場合、逸脱箇所の有無の検出する装置である。
このソフトウェア設計改善支援装置は、複数の構成要素を扱うことができるため、多様な設計ルール（検出パターン）を使用可能である。
【００１９】
ソフトウェア設計改善支援装置は、コンピュータ、ワークステーション、サーバなどの情報処理装置であって、この情報処理装置は、演算処理装置（ＣＰＵ）、主メモリ（ＲＡＭ）、読み出し専用メモリ（ROM）、入出力装置（Ｉ／Ｏ）、及び必要な場合にはハードディスク装置等の外部記憶装置を具備している装置である。
【００２０】
[１．１．構成例]
本発明の実施の形態に係るソフトウェア設計改善支援装置の構成について説明する。図１は、本実施の形態に係るソフトウェア設計改善支援装置の構成例を示す機能ブロック図である。なお、機能ブロック図中に示す構成要素は、ソフトウェア設計改善支援装置の機能を機能ごとにまとめてブロックとして捉えたものであり、ソフトウェア設計改善支援装置が各構成要素に対応する基板、装置、回路、部品などの物理的構成要素を備えていなければならないことを意味するわけではない。また、「接続」とは、データ、情報、命令などの送信及び／又は受信、受け取り、受け渡しなどが可能な状態になっていることをいい、互いに配線で連結されているような物理的な接続に限られる意味ではない。本明細書中の他の構成要素の機能ブロック図の説明についても同様である。
【００２１】
本発明の実施の形態に係るソフトウェア設計改善支援装置１は、依存関係抽出部２１と、依存関係抽出部２１に接続された構造パターン照合部２２と、構造パターン照合部２２に接続されたルール適用候補リスト記憶部１５と、ルール適用候補リスト記憶部１５に接続されたルール適用判定部２３と、ルール適用判定部２３に接続された逸脱箇所指摘部２４と、依存関係抽出部２１に接続された依存関係リスト記憶部１４を有している。依存関係リスト記憶部１４は構造パターン照合部２２、ルール適用判定部２３、逸脱箇所指摘部２４に接続されている。
依存関係抽出部２１は、実施の形態の第１の手段に相当する。構造パターン照合部２２は、実施の形態の第２の手段に相当する。ルール適用判定部２３は、実施の形態の第３の手段に相当する。逸脱箇所指摘部２４は、実施の形態の第４の手段に相当する。
【００２２】
ソフトウェア設計改善支援装置１は、入力データを記憶する手段として、ソースコード記憶部１１と、構造パターン記憶部１２と、制約記憶部１３とを有している。ソースコード記憶部１１は依存関係抽出部２１に接続されている。構造パターン記憶部１２は構造パターン照合部２２に接続されている。制約記憶部１３は、ルール適用判定部２３と逸脱箇所指摘部２４に接続されている。
【００２３】
［１．０．設計ルール］
設計ルールは、構造パターンと制約とで構成される。ソフトウェア設計改善支援装置１のユーザ、オペレータなどは、ソースコードに適用される可能性のある設計ルールの構造パターンと制約とをそれぞれ構造パターン記憶部１２と制約記憶部１３に入力する。なお、ルール作成者(ルールを予め用意する人)が見つけたい（改善したい）関係を制約とするようにしてよい。
【００２４】
［１．０．１．構造パターンの例］
図２に、設計ルールの例を示す図を掲げる。図２に示す例では、依存元のモジュールＡの関数が、依存先のモジュールであるモジュールＢ，モジュールＣ，モジュールＤの関数を呼び出しているという依存関係を有している。この例に示すモジュール群に適用される設計ルールの構造パターンは以下のように記述される。
条件１：  依存元のモジュールの関数は他モジュールの関数をSIZE以上呼び出している
条件２：上記の呼び出されている関数は、そのモジュールにのみ呼び出される
条件３：依存先のモジュール同士で、依存しない
［１．０．２．制約の例］
図２に示したモジュール群に適用される設計ルールの制約を述べる。この例の制約は「依存先モジュールは依存元モジュールに依存しない」と記述される。
【００２５】
なお、構造パターン及び制約は、ソフトウェア設計改善支援装置１の使用者、操作者等によって予め準備されるデータであって、検査対象であるソースコードに適用されている設計ルールか否かを推定するための入力データとして、ソフトウェア設計改善支援装置１に入力され、それぞれ構造パターン記憶部１２と制約記憶部１３に格納される。
【００２６】
［１．１．ソースコード記憶部］
ソースコード記憶部１１は、ソフトウェア設計改善支援装置１による検査対象であるソースコードを記憶する機能を有する。
【００２７】
［１．２．依存関係抽出部］
依存関係抽出部２１は、ソースコード記憶部１１に記憶されたソースコードから、ソースコードに含まれる各モジュールの依存関係を記述したデータである依存関係リストを生成し、出力する機能を有する。
【００２８】
図３に、ソースコードに含まれる各モジュールの依存関係を示す図を掲げる。図３に示すように、ソースコードはモジュールＡ、モジュールＢ，モジュールＣ，モジュールＤ，モジュールＥ，モジュールＦ，モジュールＧ，モジュールＨ，モジュールＩ、モジュールＪ，モジュールＫ，モジュールＬ，モジュールＭ，モジュールＮを含んでいる。これらのモジュールＡ〜Ｎはそれぞれ一つの関数Ａ１，関数Ｂ１，関数Ｃ１，関数Ｄ１，関数Ｅ１，関数Ｆ１，関数Ｇ１，関数Ｈ１，関数Ｉ１、関数Ｊ１，関数Ｋ１，関数Ｌ１，関数Ｍ１，関数Ｎ１を含んでいる。
【００２９】
モジュールＦに含まれる関数Ｆ１は、モジュールＧに含まれる関数Ｇ１と、モジュールＨに含まれる関数Ｈ１を呼び出す。
モジュールＨに含まれる関数Ｈ１は、モジュールＪに含まれる関数Ｊ１を呼び出す。
モジュールＩに含まれる関数Ｉ１は、モジュールＪに含まれる関数Ｊ１と、モジュールＫに含まれる関数Ｋ１と、モジュールＬに含まれる関数Ｌ１を呼び出す。
モジュールＪに含まれる関数Ｊ１は、モジュールＭに含まれる関数Ｍ１を呼び出す。
モジュールＫに含まれる関数Ｋ１は、モジュールＭに含まれる関数Ｍ１を呼び出す。
モジュールＬに含まれる関数Ｌ１は、モジュールＭに含まれる関数Ｍ１を呼び出す。
モジュールＭに含まれる関数Ｍ１は、モジュールＮに含まれる関数Ｎ１を呼び出す。
モジュールＮに含まれる関数Ｎ１は他の関数を呼び出すことはない。
モジュールＧに含まれる関数Ｇ１は、モジュールＡに含まれる関数Ａ１を呼び出す。
【００３０】
モジュールＡに含まれる関数Ａ１は、モジュールＢに含まれる関数Ｂ１と、モジュールＣに含まれる関数Ｃ１と、モジュールＤに含まれる関数Ｄ１と、モジュールＥに含まれる関数Ｅ１とを呼び出す。モジュールＢに含まれる関数Ｂ１、モジュールＣに含まれる関数Ｃ１、モジュールＤに含まれる関数Ｄ１、モジュールＥに含まれる関数Ｅ１はいずれも他の関数を呼び出すことはない。
【００３１】
図３に示す依存関係を有するソースコードに基づいて、依存関係抽出部２１は依存関係リストを生成する。図３に示す依存関係を有するソースコードから依存関係抽出部２１によって生成される依存関係リストの例を図４に示す。なお、図４に示す依存関係リストは、図３に示す依存関係を有するソースコードから依存関係抽出部２１によって生成される依存関係リストの一部である。
【００３２】
図４に示す依存関係リストは、一つの依存元モジュール、依存元関数、依存先モジュール、依存先関数、関係、場所のそれぞれを格納するフィールドを有するレコードからなるデータである。なお、「依存元モジュール」は他のモジュールに含まれる関数を呼び出す関数を有するモジュールをいう。「依存元関数」は他のモジュールに含まれる関数を呼び出す関数である。「依存先モジュール」は、「依存元モジュール」は依存先モジュールに含まれる関数によって呼び出される関数を有するモジュールをいう。「依存先関数」は、他のモジュールに含まれる関数によって呼び出される関数である。「関係」は、依存元関数と依存先関数の関係である。「場所」は、依存元関数を含んでいるモジュールである。
【００３３】
依存関係抽出部２１はソースコードに含まれる構成要素（モジュールなど）相互のすべての依存関係のそれぞれについて、対応するレコードを生成し、各フィールドに依存元モジュールを特定する情報を格納して、依存関係リストを生成する。
【００３４】
［１．３．依存関係リスト記憶部］
依存関係リスト記憶部１４は、依存関係抽出部２１から出力された依存関係リストを記憶する機能を有する。
【００３５】
［１．４．構造パターン照合部］
構造パターン照合部２２は、依存関係リスト記憶部１４に記憶されている依存関係リストから、構造パターン記憶部１２に記憶されている構造パターンに合致するモジュール群を抽出し、抽出したモジュール群の情報をルール適用候補リストとして出力する。
【００３６】
図５は、構造パターン記憶部１２に記憶されている構造パターンの例を示す図である。この構造パターンの成立条件は以下の３つである。
条件１：呼び出し元のモジュールの関数が他モジュールの関数を３以上呼び出している。
条件２：上記の呼び出されている関数は、その呼び出し元のモジュールにのみ呼び出される。
条件３：呼び出し先のモジュール同士で、依存しない。
図６に、依存関係リスト記憶部１４に記憶されている依存関係リストを、モジュールの依存関係のツリー図として示した図を掲げる。
【００３７】
この例では、構造パターン照合部２２は、図４に示す依存関係リストから、図５に示す構造パターンに合致するモジュール群を抽出する。モジュール群の抽出をＳＱＬ文を用いて行う場合の例として、上記条件１についてのＳＱＬ文の例を以下に示す。
SELECT 依存元モジュール, 依存先モジュール
FROM 依存関係リスト Group by 依存元モジュール
HAVING Count(依存先モジュール) >＝３
なお、構造パターン照合部２２は、条件２、条件３についても、ＳＱＬ文などを用いて依存関係リストから、条件に合致するモジュール群の抽出を行う。
【００３８】
上記図５、図６に示す例において、構造パターン照合部２２はモジュールＡ，Ｂ，Ｃ，Ｄからなるモジュール群７００を、構造パターン記憶部１２に入力された構造パターンに合致するものとして抽出し、これらモジュール群７００のモジュールの依存関係を示す情報をルール適用候補リストとして出力する。
【００３９】
図７に、図５、図６に示す例において、構造パターン記憶部１２が出力するルール適用候補リストの例を示す。ルール適用候補リスト８００は依存元モジュールとその依存先モジュールとを対（つい）として記憶するレコードを有する。ルール適用候補リスト８００は一つの依存関係について一つのレコードを有し、各レコードは依存関係をなす依存元モジュールを特定する情報（モジュール番号、モジュール名、モジュールＩＤなど）を格納するフィールドと、依存関係をなす依存先モジュールを特定する情報（モジュール番号、モジュール名、モジュールＩＤなど）を格納するフィールドとを有する。図８に示すルール適用候補リスト８００はモジュールＡを依存元モジュールとし、モジュールＢを依存先モジュールとする依存関係を記述したレコード８０１と、モジュールＡを依存元モジュールとしモジュールＣを依存先モジュールとする依存関係を記述したレコード８０２と、モジュールＡを依存元モジュールとしモジュールＤを依存先モジュールとする依存関係を記述したレコード８０３と、モジュールＡを依存元モジュールとしモジュールＥを依存先モジュールとする依存関係を記述したレコード８０４とを有する。
【００４０】
［１．５．ルール適用候補リスト記憶部］
ルール適用候補リスト記憶部１５は、構造パターン照合部２２から出力されたルール適用候補リストを記憶する機能を有する。
【００４１】
［１．６．ルール適用判定部］
ルール適用判定部２３は、ルール適用候補リストに含まれるモジュールの依存関係のそれぞれが、制約記憶部１３に記憶される制約という条件を満たすか否かを判定する機能を有する。なお、ルール適用判定部２３は、ルール適用候補リストに含まれる依存関係のうち、制約として記述された条件を満たすものの割合が、閾値を越えるか否かを判定し、閾値を越えていないと判定した場合は、構造パターンと制約からなる設計ルールがソースコードに適用されていると判定し、一方閾値を越えていると判定した場合は、逸脱箇所指摘部２４に設計ルール逸脱箇所指摘メッセージを生成するように命令する。
【００４２】
制約が「依存先モジュールは依存元モジュールに依存しない」という内容である例を述べる。ルール適用判定部２３は、以下のＳＱＬ文により上記制約として記述された条件を満たすものを抽出することができる。
SELECT * FROM 依存関係リスト  
INNER JOIN ルール適用候補リスト 
ON 依存関係リスト．依存元モジュール = ルール適用候補リスト．子モジュール 
WHERE 依存関係リスト．依存先モジュール = ルール適用候補リスト．親モジュール
【００４３】
図７に示したルール適用候補リストにおいて、３つのモジュールＣ，Ｄ，Ｅが、依存元モジュールＡに依存せず、モジュールＢのみモジュールＡに依存している。ここで閾値を５０％であるとすると、（制約を満たす依存関係の数／ルール適用候補リスト中の全依存関係の個数）＝３／４＝７５％となり、ルール適用候補リスト中の全依存関係における制約に合致する依存関係の割合が上記閾値を越える。この場合ルール適用判定部２３は、構造パターン記憶部１２に記憶されている構造パターンと、制約記憶部１３に記憶されている制約からなる設計ルールはソースコード記憶部１１に記憶されているソースコードに適応されている設計ルールであると判定する。
【００４４】
［１．７．逸脱箇所提示部］
逸脱箇所指摘部２４は、ルール適用判定部２３の判定結果に基づいて、ルール適用候補リストに含まれる依存元モジュールと依存先モジュールの対（つい）のうち、制約記憶部１３に記憶されている制約に合致しない依存元モジュールと依存先モジュールの対（つい）の情報を、逸脱箇所指摘メッセージとして出力する機能を有する。
【００４５】
図８に、逸脱箇所指摘メッセージの一例を示す。図８に示す逸脱箇所指摘メッセージは前述の［１．６．ルール適用判定部］の項で用いた例について、逸脱箇所指摘部２４が出力する逸脱箇所指摘メッセージの一例である。逸脱箇所指摘メッセージ９００は、一つの逸脱箇所について一つのレコード９０１を有する。レコード９０１はレコードを特定する情報を格納するフィールド９１１と、逸脱箇所についての記述を格納するフィールド９１２と、逸脱箇所が発生している場所を格納するフィールド９１３を有している。図８に示す例では、「依存先モジュールは依存元モジュールに依存しない」という制約に合致しない依存関係である、モジュールＢに含まれる関数funcB1がモジュールＡに含まれる関数funcA1を呼び出しているという依存関係が逸脱箇所として記述されている。
【００４６】
［２．動作例］
［２．１．主要動作（設計ルール適用推測処理）］
ソフトウェア設計改善支援装置１の主たる動作である設計ルール適用推測処理を説明する。設計ルール適用推測処理は、予め用意した設計ルールとソースコードとのパターンマッチングにより、ソースコードにおける設計ルール適用範囲の候補を抽出し、抽出した候補の中で、偶然候補に含まれたと考えられるものと、設計ルールが適用されている可能性の高いものを判定し、当該ソースコードに設計ルールが適用されていると判定した場合、設計ルールから逸脱している箇所である逸脱箇所の有無を検出する処理である。図９は、設計ルール適用推測処理の一例を示すフローチャートである。以下に図９を参照しながら設計ルール適用推測処理の内容を説明する。
【００４７】
設計ルール適用推測処理において、まずソフトウェア設計改善支援装置１は、ソースコード、構造パターン、制約の入力を受け付ける（S101）。入力されたソースコード、構造パターン、制約はそれぞれソースコード記憶部１１、構造パターン記憶部１２、制約記憶部１３に記憶される。
【００４８】
次にソフトウェア設計改善支援装置１、より詳しくは依存関係抽出部２１は、ソースコードから依存関係を有する構成要素名、関係、場所を抽出してリスト化したデータである依存関係リストを生成し、出力する（S102）。依存関係抽出部２１から出力された依存関係リストは、依存関係リスト記憶部１４に記憶される。
【００４９】
次にソフトウェア設計改善支援装置１、より詳しくは構造パターン照合部２２は、構造パターン記憶部１２に記憶されている構造パターンと一致する箇所を依存関係リストから検出する（S103）。
【００５０】
ステップS103の内容をより詳しく述べる。図１０に、ステップS103の処理内容の一例を示すフローチャートを掲げる。ステップS103において、ソフトウェア設計改善支援装置１、より詳しくは構造パターン照合部２２は、構造パターン記憶部１２に記憶されている構造パターンの条件をすべて満たすソフトウェア構造を依存関係リストから取得する（S201）。
【００５１】
次にソフトウェア設計改善支援装置１、より詳しくは構造パターン照合部２２は、依存関係リストに構造パターンの条件をすべて満たすソフトウェア構造が存在するか否かを判定する（S202）。依存関係リストに構造パターンの条件をすべて満たすソフトウェア構造が存在しないと判定した場合（S202, No）、ソフトウェア設計改善支援装置１、より詳しくは構造パターン照合部２２は、ステップS103の処理を終了する。
【００５２】
一方、依存関係リストに構造パターンの条件をすべて満たすソフトウェア構造が存在すると判定した場合（S202, Yes）、ソフトウェア設計改善支援装置１、より詳しくは構造パターン照合部２２は、ステップS201で抽出したソフトウェア構造に依存している、又は依存されている構成要素及び関係を抽出し、抽出した構成要素及び関係などを有するリストを生成し、出力する（S203）。ステップS203で生成されるリストがルール適用候補リストである。出力されたルール適用候補リストはルール適用候補リスト記憶部１５に記憶される。
図９に戻り設計ルール適用推測処理の説明を続ける。
【００５３】
ステップS103の後、ソフトウェア設計改善支援装置１、より詳しくは構造パターン照合部２２は、依存関係リストに構造パターンと一致する箇所があるか否かを判定する（S104）。依存関係リストに構造パターンと一致する箇所がないと判定した場合（S104, No）、ソフトウェア設計改善支援装置１は設計ルール適用推測処理を終了する。
【００５４】
一方、ステップS104において、依存関係リストに構造パターンと一致する箇所があると判定した場合（S104, Yes）、ソフトウェア設計改善支援装置１、より詳しくはルール適用判定部２３は、ルール適用候補リスト記憶部１５に記憶されているルール適用候補リストに含まれる箇所のそれぞれについて、制約記憶部１３に記憶されている制約を満たすか否かを判定し、制約を満たす箇所と制約を満たさない箇所の個数に基づいて、設計ルールがソースコードに適用されているか否かを調べる（S105）。次に、ソフトウェア設計改善支援装置１、より詳しくはルール適用判定部２３は、ステップS105の実行の結果に基づいて設計ルールがソースコードに適用されているか否かを判定する（S106）。設計ルールがソースコードに適用されていないと判定した場合（S106, No）、ソフトウェア設計改善支援装置１は設計ルール適用推測処理を終了する。
【００５５】
一方、ステップS106において設計ルールがソースコードに適用されていると判定した場合（S106, Yes）、ソフトウェア設計改善支援装置１、より詳しくは逸脱箇所指摘部２４は、ルール適用候補リストから、制約を満たさない箇所である逸脱箇所を抽出する（S107）。
【００５６】
ステップS107の後、ソフトウェア設計改善支援装置１、より詳しくは逸脱箇所指摘部２４は、ステップS107の実行結果に基づいて、制約を満たさない箇所である逸脱箇所があるか否かを判定する（S108）。ステップS108において制約を満たさない箇所である逸脱箇所がないと判定した場合（S108, No）、ソフトウェア設計改善支援装置１は設計ルール適用推測処理を終了する。この場合、処理終了前にソフトウェア設計改善支援装置１、より詳しくは逸脱箇所指摘部２４は、「入力されている設計ルールが適用されていると推測できる」旨のメッセージを出力するようにしても良い。
【００５７】
一方、ステップS108において、制約を満たさない箇所である逸脱箇所が存在すると判定した場合（S108, Yes）、ソフトウェア設計改善支援装置１、より詳しくは逸脱箇所指摘部２４は、逸脱箇所の構成要素名・ルール・場所をリストに格納し、このリストを逸脱箇所指摘メッセージ９００として出力する(S109)。逸脱箇所指摘メッセージ９００出力後、ソフトウェア設計改善支援装置１は設計ルール適用推測処理を終了する。
【００５８】
図１１に、ステップS107からS109の具体的処理例を示すフローチャートを掲げる。なお、図１１に示すフローチャートでは、制約記憶部１３に記憶されている制約として「依存先モジュールは依存元モジュールに依存しない」という条件が用いられ、閾値として半数（５０％）が用いられているものとする。
【００５９】
まず、ソフトウェア設計改善支援装置１、より詳しくは逸脱箇所指摘部２４は、ルール適用候補リストにおいて依存先モジュールから依存元モジュールに依存している数を数える（S301）。これは制約を満たさない箇所をカウントしていることを意味する。なお、これは制約を満たす箇所をカウントするようにしても、本実施の形態が成立することはいうまでもない。
【００６０】
次にソフトウェア設計改善支援装置１、より詳しくは逸脱箇所指摘部２４は、依存先モジュールから依存元モジュールに依存している依存関係の個数が１以上半数未満であるか否かを判定する（S302）。なお「半数」とは、ルール適用候補リストに含まれる依存関係の個数の半数を意味する。
【００６１】
ステップS302において依存先モジュールから依存元モジュールに依存している依存関係の個数が１以上半数未満でないと判定した場合（S302, No）、ソフトウェア設計改善支援装置１、より詳しくは逸脱箇所指摘部２４は、ステップS107〜ステップS109に相当する処理を終了する。これは、ルール適用候補リストに含まれるモジュール群が設計ルールの条件に合致していないと判断できるためである。
【００６２】
一方、ステップS302において依存先モジュールから依存元モジュールに依存している依存関係の個数が１以上半数未満であると判定した場合（S302, No）、ソフトウェア設計改善支援装置１、より詳しくは逸脱箇所指摘部２４は、依存先モジュールから依存元モジュールへの依存関係を有する依存関係を逸脱箇所とし、逸脱箇所の構成要素名・場所と設計ルール名をリスト（逸脱箇所指摘メッセージ）に格納する（S303）。
【００６３】
次にソフトウェア設計改善支援装置１、より詳しくは逸脱箇所指摘部２４は、上記リスト（逸脱箇所指摘メッセージ）を出力し（S304）、ステップS107〜ステップS109に相当する処理を終了する。なお、逸脱箇所指摘メッセージは、ソースコードには、設計ルールが適用されていると推測できるが、一部に設計ルールを逸脱する箇所（依存関係）が含まれていること、及びその箇所をユーザに示す役割を有する。
【００６４】
［３．実施例］
本実施の形態の実施例について述べる。
［３．１．ソースコード］
図１２に、本実施例で設計ルールの適用の推定対象となるソースコードに含まれるモジュールの依存関係を示すツリー図を示す。本実施例で使用されるソースコードは、モジュールＡ，モジュールＢ，モジュールＣ，モジュールＤ，モジュールＥ，モジュールＦ，モジュールＧ，モジュールＨ，モジュールＩ、モジュールＪを含んでいる。
【００６５】
上記モジュールＡ，モジュールＢ，モジュールＣ，モジュールＤ，モジュールＥ，モジュールＦ，モジュールＧ，モジュールＨ，モジュールＩ、モジュールＪの依存関係は以下のとおりである。
【００６６】
モジュールＧはモジュールＨ及びモジュールＩに依存している。モジュールＨはモジュールＡに依存している。モジュールＩはモジュールＢに依存している。モジュールＪはモジュールＣ及びモジュールＤに依存している。モジュールＢ，モジュールＣ、及びモジュールＤはモジュールＥに依存している。モジュールＢ，モジュールＣ、及びモジュールＤはモジュールＥに依存している。モジュールＡ及びモジュールＥはモジュールＦに依存している。モジュールＦはいずれの他のモジュールにも依存していない。
【００６７】
［３．２．構造パターン］
本実施例で使用される構造パターンの内容は、以下のとおりである。
（１）複数のモジュールから依存されているモジュールを含んでいる
（２）前記依存されているモジュールは、一つ以上のモジュールに依存している
上記（１）の条件に合致するモジュールを抽出する方法をＳＱＬ文で表すと、以下のようになる。
SELECT 依存先モジュール, COUNT(依存元モジュール) FROM 依存関係リスト 
GROUP BY 依存先モジュール
HAVING COUNT(依存元モジュール) > 1
【００６８】
上記構造パターンの条件を満たすモジュールのツリー図を図１３に示す。図１３に示すモジュール群において、モジュールＫ，モジュールＬ、モジュールＭはモジュールＮに依存している。この依存関係は上述の（１）複数のモジュールから依存されているモジュールを含んでいる、という条件を満たしている。モジュールＮはモジュールＯに依存している。この依存関係は、上述の（２）前記依存されているモジュールは、一つ以上のモジュールに依存している、という条件を満たしている。
【００６９】
［３．３．制約］
本実施例で使用される制約は以下のとおりである。
制約：中継モジュールの依存先モジュールは、中継モジュールのみ依存可能である
上記制約の条件に合致するモジュールを抽出する方法をＳＱＬ文で表すと、以下のようになる。
SELECT COUNT(依存元モジュール) -中継モジュールの依存先数 
FROM 依存関係リスト
INNER JOIN ルール適用候補リスト
ON 依存関係リスト．依存先モジュール = ルール適用候補リスト．中継モジュールの依存先
GROUP BY  ルール適用候補リスト．中継モジュール
【００７０】
［３．４．依存関係リスト］
ソフトウェア設計改善支援装置１、より詳しくは依存関係抽出部２１が上記ソースコードから生成する、依存関係リストの一部の例を図１４に示す。
【００７１】
［３．５．ルール適用候補リスト］
ソフトウェア設計改善支援装置１、より詳しくは構造パターン照合部２２は、図１４に示す依存関係リストから、上記構造パターンに合致するモジュール群を抽出してルール適用候補リストを生成する。本実施例において生成されるルール適用候補リストの例を図１５に示す。また、図１２に示したツリー図において、このルール適用候補リストに含まれるモジュール群１８００を、図１６に示す。
【００７２】
［３．６．逸脱箇所指摘メッセージ］
ソフトウェア設計改善支援装置１、より詳しくはルール適用判定部２３は、制約記憶部１３に記憶されている制約とルール適用候補リストから、ルール適用候補リストに含まれるモジュール群１８００に対して設計ルールが適用されていると推定できるかどうかを判定する。
【００７３】
本実施例の閾値は５０％であるものとする。本実施例では３つのモジュールＢ，Ｃ，Ｄが、中継モジュールＥを通じてモジュールＦへ通じているが、モジュールＡのみモジュールＦと直接依存している。よって設計ルールは適用されていると判定する。
【００７４】
ソフトウェア設計改善支援装置１、より詳しくは逸脱箇所指摘部２４は、上記モジュール群１８００のうち、モジュールＡからモジュールＦへの依存関係を、設計ルールの逸脱箇所とする逸脱箇所指摘メッセージを生成し、出力する。この逸脱箇所指摘メッセージの例を図１７に示す。逸脱箇所指摘メッセージにより、ソースコードは、構造パターン及び制約からなる設計ルールが適用されていると推定され、このソースコードにおける設計ルールを逸脱する箇所がモジュールＡからモジュールＦへの依存関係であることをソフトウェア設計改善支援装置１のユーザは知ることができる。
【００７５】
［４．利点］
本実施の形態によれば、ソースコードにどのような設計ルールが適用されているか、開発者が知らない場合でも、そのソースコードに適用されている設計ルールを推測することが可能となる。
【００７６】
本実施の形態によれば、改変されたソースコードであっても、当該ソースコードに適用されている可能性の高い設計ルールを推測することが可能となり、当該ソースコードの設計書が存在しない場合でも、ソースコードから設計ルールを抽出することができる。
また、本実施の形態によれば、ソースコードにおいて設計ルールから逸脱している箇所について、どの箇所がどの程度逸脱しているかを示すことが可能となる。
【００７７】
［５．まとめ、その他］
以上、本発明の実施の形態を説明したが、本発明はこれらに限定されるものではなく、発明の趣旨を逸脱しない範囲内において、種々の変更、追加、組み合わせ等が可能である。
【００７８】
変形例として、ソフトウェア設計改善支援装置１は、逸脱箇所指摘メッセージとともに、若しくは逸脱箇所指摘メッセージに代えて、入力されている設計ルールの適用が推測できるか否かを示すメッセージ出力をするようにしても本実施の形態は成立する。
【符号の説明】
【００７９】
１・・・ソフトウェア設計改善支援装置；  １１・・・ソースコード記憶部；  １２・・・構造パターン記憶部；  １３・・・制約記憶部；  １４・・・依存関係リスト記憶部；  １５・・・ルール適用候補リスト記憶部；  ２１・・・依存関係抽出部；  ２２・・・構造パターン照合部；  ２３・・・ルール適用判定部；  ２４・・・逸脱箇所指摘部；  ３０・・・逸脱箇所指摘メッセージ；
【図１】
2015132960.tif 000003
【図２】
2015132960.tif 000004
【図３】
2015132960.tif 000005
【図４】
2015132960.tif 000006
【図５】
2015132960.tif 000007
【図６】
2015132960.tif 000008
【図７】
2015132960.tif 000009
【図８】
2015132960.tif 000010
【図９】
2015132960.tif 000011
【図１０】
2015132960.tif 000012
【図１１】
2015132960.tif 000013
【図１２】
2015132960.tif 000014
【図１３】
2015132960.tif 000015
【図１４】
2015132960.tif 000016
【図１５】
2015132960.tif 000017
【図１６】
2015132960.tif 000018
【図１７】
2015132960.tif 000019