(57)【要約】【課題】プログラムに新規機能を追加する場合のユーザの作業効率を向上させ、必要な変更がなされないことを防止するプログラム開発支援システムを提供することを目的とする。【解決手段】ユーザが開発するプログラムのソースファイルの変更履歴を管理するプログラム開発支援システムにおいて、前記機能モジュールを前記プログラムに新たに追加した場合、前記機能モジュールの追加前後の前記基本モジュールのソースファイルの差分が、前記差分リストに登録された差分と重複する場合、前記重複する差分をユーザに提示することを特徴とする。【選択図】図１
2012220979.tif 000002
【特許請求の範囲】
【請求項１】
プログラムを実行するプロセッサと、前記プロセッサによって実行されるプログラムを格納する記憶領域と、を備え、ユーザが開発するプログラムのソースファイルの変更履歴を管理するプログラム開発支援システムにおいて、
前記プロセッサは、
前記プログラムのソースファイルを、前記プログラムの基本機能を実現する基本モジュールと、前記基本モジュールよりも後に前記プログラムに追加され、前記プログラムの追加的な機能を実現する機能モジュール群と、に論理的に分割し、
前記機能グループ群が実現する機能ごとに前記機能モジュール群を一つに纏めることによって、同じ機能を実現する機能モジュール群を機能モジュールとして管理し、
前記機能モジュールを前記プログラムに追加するごとに、前記機能モジュールの追加前後の前記基本モジュールのソースファイルの差分を差分リストとして前記記憶領域に格納し、
前記機能モジュールを前記プログラムに新たに追加した場合、前記機能モジュールの追加前後の前記基本モジュールのソースファイルの差分が、前記差分リストに登録された差分と重複するか否かを判定し、
前記機能モジュールの追加前後の前記基本モジュールのソースファイルの差分が前記差分リストに登録された差分と重複すると判定された場合、前記重複する差分をユーザに提示することを特徴とするプログラム開発支援システム。
【請求項２】
前記プロセッサは、前記同じ機能を実現する機能モジュール群に同じタグを付与することによって、前記同じ機能を実現する機能モジュール群を一つに纏めることを特徴とする請求項１に記載のプログラム開発支援システム。
【請求項３】
前記記憶領域には、予め指定された差分ごとに、当該差分に対応して前記基本モジュールのソースファイルを修正した修正ソースファイルである修正パターンデータが格納され、
前記プロセッサは、
前記重複する差分が前記修正パターンデータの予め指定された差分に一致するか否かを判定し、
前記重複する差分が前記修正パターンデータの予め指定された差分に一致すると判定された場合、前記一致する差分に対応する前記修正ソースファイルをユーザに提示することを特徴とする請求項１に記載のプログラム開発支援システム。
【請求項４】
前記プロセッサは、
前記機能モジュールが実現する機能を示すキーワードの入力を受け付け、
前記差分リストにおいて、前記追加された機能モジュールのキーワードと前記追加された機能モジュールによる差分とを対応付け、
前記機能モジュールを前記プログラムに新たに追加した場合、前記差分リストを参照し、前記追加された機能モジュールのキーワードと一致する機能モジュールが存在するか否かを判定し、
前記追加された機能モジュールのキーワードと一致する機能モジュールが存在すると判定された場合、当該機能モジュールの差分をユーザに提示することを特徴とする請求項１に記載のプログラム開発支援システム。
【請求項５】
前記プロセッサは、
前記機能モジュールのソースファイルを解析することによって、前記機能モジュールで定義される機能関数によって呼び出され、前記基本モジュールで定義される基本関数を特定し、
前記複数の機能モジュールの機能関数で共通して呼び出される基本関数が複数存在するか否かを判定し、
前記複数の機能モジュールの機能関数で共通して呼び出される基本関数が複数存在すると判定された場合、前記複数の基本関数を集約した集約関数を新たに生成し、
前記新たに生成された集約関数、前記集約関数を構成する複数の基本関数、前記複数の基本関数の呼び出し元の機能関数をユーザに提示することを特徴する請求項１に記載のプログラム開発支援システム。
【請求項６】
前記複数存在すると判定された基本関数のうち、少なくとも一つの基本関数が、ある機能モジュールで定義される第１機能関数が呼び出す第２機能関数を介して呼び出される間接呼出関数である場合、当該間接呼出関数以外の基本関数のみを集約した集約関数を新たに生成することを特徴とする請求項５に記載のプログラム開発支援システム。
【請求項７】
第１機能モジュールを前記プログラムに追加した場合に少なくとも三つの前記基本関数からなる第１基本関数を集約した第１集約関数が生成されている場合、
前記プロセッサは、
第２機能モジュールを前記プログラムに新たに追加する場合、前記第２機能モジュールで定義される機能関数が、前記第１基本関数のうち少なくとも二つ以上であって前記第１基本関数の数未満の前記基本関数からなる第２基本関数を呼び出す場合、当該機能関数によって呼び出される第２基本関数を集約した新たな第２集約関数を生成し、
前記第２集約関数と、前記第１基本関数のうち第２基本関数でない基本関数と、を集約した新たな第３集約関数を生成することを特徴とする請求項５に記載のプログラム開発支援システム。
【請求項８】
前記プロセッサは、
前記機能モジュールのソースファイルを解析することによって、前記機能モジュールで定義される機能関数によって呼び出される前記基本モジュールで定義される基本関数を特定し、
前記特定した基本関数に、ある機能モジュールで定義される第１機能関数が呼び出す第２機能関数を介して呼び出される間接呼出関数が含まれるか否かを判定し、
前記基本関数に前記間接呼出関数が含まれると判定された場合、前記間接呼出関数を、前記第２機能関数を介して前記第１機能関数から呼び出される関数として管理し、
当該間接呼出関数が前記第２機能関数を経由して前記第１機能関数から呼び出されることを把握可能にユーザに提示することを特徴とする請求項１に記載のプログラム開発支援システム。
【請求項９】
前記基本モジュール及び前記機能モジュールは複数の状態を定義し、
前記プロセッサは、
前記複数の状態を遷移しながら、前記プログラムを実行し、
前記状態の遷移元及び遷移先を示す状態遷移図をユーザに提示し、
前記機能モジュールを前記プログラムに追加した場合、又は、前記機能モジュールを前記プログラムから削除した場合、当該機能モジュールの追加又は削除の前後で変更された状態、及び、前記変更された状態が遷移元又は遷移先となる遷移関係の差分を状態差分リストとして前記記憶領域に格納することを特徴とする請求項１に記載のプログラム開発支援システム。
【請求項１０】
前記プロセッサは、
前記機能モジュールを追加する場合、前記状態差分リストを参照し、前記追加する機能モジュールが前記プログラムから削除された機能モジュールであるか否かを判定し、
前記追加する機能モジュールが前記プログラムから削除された機能モジュールであると判定された場合、前記状態差分リストを参照し、前記削除された機能モジュールの状態の差分に基づいて、当該削除された機能モジュールが前記プログラムから削除される前の状態遷移図をユーザに提示することを特徴とする請求項９に記載のプログラム開発支援システム。
【請求項１１】
プログラムを実行するプロセッサと、前記プロセッサによって実行されるプログラムを格納する記憶領域と、を備える計算機システムによって実行され、ユーザが開発するプログラムのソースファイルの変更履歴を管理するプログラム開発支援方法において、
前記方法は、
前記プロセッサが、前記プログラムのソースファイルを、前記プログラムの基本機能を実現する基本モジュールと、前記基本モジュールよりも後に前記プログラムに追加され前記プログラムの追加的な機能を実現する機能モジュール群と、に論理的に分割するステップと、
前記プロセッサが、前記機能グループ群が実現する機能ごとに前記機能モジュール群を一つに纏めることによって、同じ機能を実現する機能モジュール群を機能モジュールとして管理するステップと、
前記プロセッサが、前記機能モジュールを前記プログラムに追加するごとに、前記機能モジュールの追加前後の前記基本モジュールのソースファイルの差分を差分リストとして前記記憶領域に格納するステップと、
前記プロセッサが、前記機能モジュールを前記プログラムに新たに追加した場合、前記機能モジュールの追加前後の前記基本モジュールのソースファイルの差分が、前記差分リストに登録された差分と重複するか否かを判定するステップと、
前記機能モジュールの追加前後の前記基本モジュールのソースファイルの差分が前記差分リストに登録された差分と重複すると判定された場合、前記プロセッサが、前記重複する差分をユーザに提示するステップと、を含むことを特徴とするプログラム開発支援方法。
【請求項１２】
前記機能モジュールを管理するステップでは、前記プロセッサが、前記同じ機能を実現する機能モジュール群に同じタグを付与することによって、前記実現する機能が同じ機能モジュール群を一つに纏めることを特徴とする請求項１１に記載のプログラム開発支援方法。
【請求項１３】
前記記憶領域には、予め指定された差分ごとに、当該差分に対応して前記基本モジュールのソースファイルを修正した修正ソースファイルである修正パターンデータが格納され、
前記方法は、
前記プロセッサが、前記重複する差分が前記修正パターンデータの予め指定された差分に一致するか否かを判定するステップと、
前記重複する差分が前記修正パターンデータの予め指定された差分に一致すると判定された場合、前記プロセッサが、前記一致する差分に対応する前記修正ソースファイルをユーザに提示するステップと、を含むことを特徴とする請求項１１に記載のプログラム開発支援方法。
【請求項１４】
前記方法は、
前記プロセッサが、前記機能モジュールが実現する機能を示すキーワードの入力を受け付けるステップと、
前記プロセッサが、前記差分リストにおいて、前記追加された機能モジュールのキーワードと前記追加された機能モジュールによる差分とを対応付けるステップと、
前記プロセッサが、前記機能モジュールを前記プログラムに新たに追加した場合、前記差分リストを参照し、前記追加された機能モジュールのキーワードと一致する機能モジュールが存在するか否かを判定するステップと、
前記追加された機能モジュールのキーワードと一致する機能モジュールが存在すると判定された場合、前記プロセッサが、当該機能モジュールの差分をユーザに提示するステップと、を含むことを特徴とする請求項１１に記載のプログラム開発支援方法。
【請求項１５】
前記方法は、
前記プロセッサが、前記機能モジュールのソースファイルを解析することによって、前記機能モジュールで定義される機能関数によって呼び出され、前記基本モジュールで定義される基本関数を特定するステップと、
前記プロセッサが、前記複数の機能モジュールの機能関数で共通して呼び出される基本関数が複数存在するか否かを判定するステップと、
前記複数の機能モジュールの機能関数で共通して呼び出される基本関数が複数存在すると判定された場合、前記プロセッサが、前記複数の基本関数を集約した集約関数を新たに生成するステップと、
前記プロセッサが、前記新たに生成された集約関数、前記集約関数を構成する複数の基本関数、前記複数の基本関数の呼び出し元の機能関数をユーザに提示するステップと、を含むことを特徴する請求項１１に記載のプログラム開発支援方法。
【請求項１６】
前記複数存在すると判定された基本関数のうち、少なくとも一つの基本関数が、ある機能モジュールで定義される第１機能関数が呼び出す第２機能関数を介して呼び出される間接呼出関数である場合、前記プロセッサが、当該間接呼出関数以外の基本関数のみを集約した集約関数を新たに生成するステップを含むことを特徴とする請求項１５に記載のプログラム開発支援方法。
【請求項１７】
第１機能モジュールを前記プログラムに追加した場合に少なくとも三つの前記基本関数からなる第１基本関数を集約した第１集約関数が生成されている場合、
前記方法は、
前記プロセッサが、第２機能モジュールを前記プログラムに新たに追加する場合、前記第２機能モジュールで定義される機能関数が、前記第１基本関数のうち少なくとも二つ以上であって前記第１基本関数の数未満の前記基本関数からなる第２基本関数を呼び出す場合、当該機能関数によって呼び出される第２基本関数を集約した新たな第２集約関数を生成するステップと、
前記第２集約関数と、前記第１基本関数のうち第２基本関数でない基本関数と、を集約した新たな第３集約関数を生成するステップと、を含むことを特徴とする請求項１５に記載のプログラム開発支援方法。
【請求項１８】
前記方法は、
前記プロセッサが、前記機能モジュールのソースファイルを解析することによって、前記機能モジュールで定義される機能関数によって呼び出される前記基本モジュールで定義される基本関数を特定するステップと、
前記プロセッサが、前記特定した基本関数に、ある機能モジュールで定義される第１機能関数が呼び出す第２機能関数を介して呼び出される間接呼出関数が含まれるか否かを判定するステップと、
前記プロセッサが、前記基本関数に前記間接呼出関数が含まれると判定された場合、前記間接呼出関数を、前記第２機能関数を介して前記第１機能関数から呼び出される関数として管理するステップと、
前記プロセッサが、当該間接呼出関数が前記第２機能関数を経由して前記第１機能関数から呼び出されることを把握可能にユーザに提示するステップと、を含むことを特徴とする請求項１１に記載のプログラム開発支援方法。
【請求項１９】
前記基本モジュール及び前記機能モジュールは複数の状態を定義し、
前記方法は、
前記プロセッサが、前記複数の状態を遷移しながら、前記プログラムを実行するステップと
前記プロセッサが、前記状態の遷移元及び遷移先を示す状態遷移図をユーザに提示するステップと、
前記プロセッサが、前記機能モジュールを前記プログラムに追加した場合、又は、前記機能モジュールを前記プログラムから削除した場合、当該機能モジュールの追加又は削除の前後で変更された状態、及び、前記変更された状態が遷移元又は遷移先となる遷移関係の差分を状態差分リストとして前記記憶領域に格納するステップと、を含むことを特徴とする請求項１１に記載のプログラム開発支援方法。
【請求項２０】
前記方法は、
前記プロセッサが、前記機能モジュールを追加する場合、前記状態差分リストを参照し、前記追加する機能モジュールが前記プログラムから削除された機能モジュールであるか否かを判定するステップと、
前記追加する機能モジュールが前記プログラムから削除された機能モジュールであると判定された場合、前記プロセッサが、前記状態差分リストを参照し、前記削除された機能モジュールの状態の差分に基づいて、当該削除された機能モジュールが前記プログラムから削除される前の状態遷移図をユーザに提示するステップと、を含むことを特徴とする請求項１９に記載のプログラム開発支援方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムの開発を支援するプログラム開発支援システムに関し、特に、開発するプログラムの変更履歴を管理するプログラム開発支援システムに関する。
【背景技術】
【０００２】
大規模プログラムの開発には複数のプログラマが開発に携わり、各プログラマがそれぞれプログラムを開発する。各プログラマによるプログラムへの変更が矛盾なく行われるためには、開発中のプログラムの変更履歴を記憶領域に格納するシステムが知られている（例えば、特許文献１参照）。この変更履歴によって各プログラマによるプログラムへの変更等が矛盾しないように管理できる。
【０００３】
上述のようなプログラムの変更履歴を管理するバージョン管理ソフトとして、集中管理型のＳｕｂｖｅｒｓｉｏｎ、及び分散管理型のＧｉｔが知られている。
【０００４】
これらのバージョン管理ソフトは、開発中のプログラムのすべての変更履歴を記憶し、また、ブランチも管理する。
【０００５】
集中管理型について説明する。各ユーザ端末に接続される管理サーバでプログラムの最新のソースファイルが管理される。ユーザがユーザ端末でプログラムを開発する場合、ユーザ端末は、管理サーバからプログラムの最新のソースファイルを各ユーザ端末の作業用ディレクトリにコピーし、コピーされたソースファイルに対してソースコードを変更する。ソースコードの変更には、ソースコードの追加、ソースコードの削除、及びソースコードの修正が含まれる。ユーザ端末は、変更されたソースファイルを管理サーバに記憶する。
【０００６】
管理サーバは、新たに追加されたソースファイルに新たな番号を付与し、当該ソースファイルが最新版となる。この場合、管理サーバは、当該ソースファイルに対して、変更日、変更者、及びログメッセージを含めて記憶可能である。
【０００７】
管理サーバは、変更されたソースファイルを時系列で管理し、修正日及び修正者等をキーにソースファイルがどのような変更されたかをリストアップすることができる。
【０００８】
また、分散管理型では、ユーザ端末は、ソースファイルを管理するリポジトリを備え、必要に応じてソースファイルのバージョン情報を公開し、他のユーザ端末のソースファイルとマージする。
【０００９】
既存のプログラムに新たに何らかの機能が追加される場合、つまり、既存のソースコード（既存コード）に新たなソースコード（新規コード）が追加される場合、既存コードの変更が必要になる場合もある。既存コードの度重なる変更は、既存のプログラムに悪影響を与える可能性もある。
【００１０】
さらに、新規コード追加時に必要となる既存コードの変更がなされなかった場合、プログラムが動作をしなくなる可能性もある。
【先行技術文献】
【特許文献】
【００１１】
【特許文献１】特開2004-185519号公報
【発明の概要】
【発明が解決しようとする課題】
【００１２】
上述の変更履歴技術では、単に変更履歴を管理するだけであって、新規コード追加時に既存コードの同じ部分が複数回変更されていても、当該部分をユーザに提示するものではない。
【００１３】
このため、ユーザは、新規コード追加する場合、既存コードの変更が必要になるコードを探索し、当該コードを変更する作業が繰り返され、作業効率が悪く、既存コードに必要な変更がなされない可能性もある。
【００１４】
したがって、本発明は、プログラムに新規機能を追加する場合のユーザの作業効率を向上させ、必要な変更がなされないことを防止するプログラム開発支援システムを提供することを目的とする。
【課題を解決するための手段】
【００１５】
本発明の代表的な一例を示せば、各種プログラムを実行するプロセッサと、前記プロセッサによって実行される各種プログラムを格納する記憶領域と、を備え、ユーザが開発するプログラムのソースファイルの変更履歴を管理するプログラム開発支援システムにおいて、前記プロセッサは、前記プログラムのソースファイルを、前記プログラムの基本機能を実現する基本モジュールと、前記基本モジュールよりも後に前記プログラムに追加され前記プログラムの追加的な機能を実現する機能モジュール群と、に論理的に分割し、前記機能グループ群が実現する機能ごとに前記機能モジュール群のソースファイルを一つに纏めることによって、実現する機能が同じ機能モジュール群のソースファイルを機能モジュールとして管理し、前記機能モジュールを前記プログラムに追加するごとに、前記機能モジュールの追加前後の前記基本モジュールのソースファイルの差分を差分リストとして前記記憶領域に格納し、前記機能モジュールを前記プログラムに新たに追加した場合、前記機能モジュールの追加前後の前記基本モジュールのソースファイルの差分が、前記差分リストに登録された差分と重複するか否かを判定し、前記機能モジュールの追加前後の前記基本モジュールのソースファイルの差分が前記差分リストに登録された差分と重複すると判定された場合、前記重複する差分をユーザに提示することを特徴とする。
【発明の効果】
【００１６】
本発明によれば、プログラムに新規機能を追加する場合のユーザの作業効率を向上させ、必要な変更がなされないことを防止するプログラム開発支援システムを提供できる。
【図面の簡単な説明】
【００１７】
【図１】本発明の第１実施形態のプログラム開発支援システムのブロック図である。
【図２】本発明の第１実施形態のソースファイル格納部の説明図である。
【図３】本発明の第１実施形態の差分リストの説明図である。
【図４Ａ】本発明の第１実施形態の基本関数リスト比較部によって集約関数が作成される前の基本関数リストの説明図である。
【図４Ｂ】本発明の第１実施形態の基本関数リスト比較部によって集約関数が作成された後の基本関数リストの説明図である。
【図５Ａ】本発明の第１実施形態の機能モジュールがプログラムに追加され、集約関数が作成される前の基本関数リストの説明図である。
【図５Ｂ】本発明の第１実施形態の機能モジュールがプログラムに追加され、集約関数が作成された後の基本関数リストの説明図である。
【図６】本発明の第１実施形態の機能モジュール追加時処理のフローチャートである。
【図７】本発明の第１実施形態の基本モジュール差分処理のフローチャートである。
【図８】本発明の第１実施形態のユーザに提示する修正ソースファイルの説明図である。
【図９】本発明の第１実施形態の重複関数集約処理のフローチャートである。
【図１０Ａ】本発明の第１実施形態の集約関数作成前のプログラムのソースコードの説明図である。
【図１０Ｂ】本発明の第１実施形態の集約関数作成後のプログラムのソースコードの説明図である。
【図１０Ｃ】所定条件が成立した場合、基本モジュールで集約関数ｆ＿ｆ及びｆ＿ｇを呼び出すように修正された基本ソースコードの説明図である。
【図１１】本発明の第１実施形態の入れ子構造の関数のソースコードの説明図である。
【図１２】本発明の第１実施形態の入れ子構造の関数を定義する機能関数の基本関数リスト１０８を作成するための補助リストの説明図である。
【図１３】本発明の第１実施形態の補助リストに基づいて作成された基本関数リストの説明図である。
【図１４】本発明の第１実施形態の入れ子構造を把握可能な形式の検出画面の説明図である。
【図１５】本発明の第１実施形態の機能モジュールが追加された場合の基本モジュール及び機能モジュールに対する修正の説明図である。
【図１６】本発明の第１実施形態の機能モジュールの開発作業時間の説明図である。
【図１７】本発明の第２実施形態の差分リストの説明図である。
【図１８】本発明の第２実施形態の差分リスト検索テーブルの説明図である。
【図１９】本発明の第２実施形態のユーザ提示処理のフローチャートである。
【図２０】本発明の第３実施形態の基本モジュール及び機能モジュールによって提供される状態の説明図である。
【図２１】本発明の第３実施形態の機能モジュールが追加される前の状態遷移図を表示させるためのファイルであるｓｔｄ＿ｃｏｎｆの説明図である。
【図２２】本発明の第３実施形態の機能モジュールが追加された後のｓｔｄ＿ｃｏｎｆの説明図である。
【図２３】本発明の第３実施形態の状態差分リストの説明図である。
【図２４】本発明の第３実施形態の削除する状態を表示した状態遷移図の説明図である。
【図２５】本発明の第３実施形態の機能モジュール削除後のｓｔｄ＿ｃｏｎｆの説明図である。
【図２６】本発明の第３実施形態の機能モジュール削除後の状態遷移図の説明図である。
【図２７】本発明の第３実施形態の機能モジュールが再度追加された場合の状態遷移図の説明図である。
【発明を実施するための形態】
【００１８】
以下、本発明の実施の形態について図面を参照しつつ説明する。
【００１９】
（第１実施形態）
以下、本発明の第１実施の形態について、図１〜図１６を用いて説明する。
【００２０】
図１は、本発明の第１実施形態のプログラム開発支援システム１０１のブロック図である。
【００２１】
プログラム開発支援システム１０１は、図示しないプロセッサ、メモリ、及びハードディスクドライブ（ＨＤＤ）を備える。プロセッサは、メモリに格納された各種プログラムを実行する。メモリは、各種プログラム、及び各種プログラムを実行する場合に使用する各種データを格納する。ＨＤＤは、各種データを格納する。
【００２２】
プログラム開発支援システム１０１は、ソースファイル格納部１０２、差分リスト１０３、基本モジュール差分検出部１０４、差分比較部１０５、修正案作成部１０６、プログラム修正処理部１０７、基本関数リスト１０８、基本関数リスト作成部１０９、基本関数リスト比較部１１０、及び入出力インタフェース部１１１を備える。
【００２３】
ソースファイル格納部１０２、差分リスト１０３、及び基本関数リスト１０８は、図示しないメモリに格納される。
【００２４】
基本モジュール差分検出部１０４、差分比較部１０５、修正案作成部１０６、プログラム修正処理部１０７、基本関数リスト作成部１０９、及び基本関数リスト比較部１１０は、図示しないメモリに格納されるプログラムであって、図示しないＣＰＵによって実行される。
【００２５】
入出力インタフェース部１１１は、入力部（例えば、キーボード及びマウス等）及び出力部（例えば、ディスプレイ等の表示装置及びプリンタ等）に接続されるインタフェースである。
【００２６】
プログラム開発支援システム１０１の各構成部について説明する。
【００２７】
ソースファイル格納部１０２は、プログラムの開発中の最新バージョンのソースファイル、及び、過去のバージョンのソースファイルを格納する記憶領域である。ソースファイル格納部１０２については図２で詳細を説明する。
【００２８】
差分リスト１０３は、ある機能モジュールを開発中のプログラム（以下、開発中のプログラムを単にプログラムという）に追加した場合の機能モジュール追加前後の基本モジュールのソースファイル（以下、基本ソースファイルという）の差分を示すリストであり、図示しないメモリに格納される。
【００２９】
ここで、基本モジュールは、プログラムの基本的な機能な実現するソースファイルであり、機能モジュールは、基本モジュールより後にプログラムに追加され、プログラムの追加的な機能を実現する機能モジュール群のソースファイルを同じ機能ごとに一つに纏めたソースファイルである。基本モジュール及び機能モジュールについては、図２で詳細を説明する。
【００３０】
基本モジュール差分検出部１０４は、ある機能モジュールをプログラムに追加した場合の基本ソースファイルの差分を検出し、差分リスト１０３を生成する。
【００３１】
差分比較部１０５は、差分リスト１０３を参照し、ある機能モジュールを追加した場合の基本ソースファイルの差分が、他の機能モジュールを追加する前の差分と重複しているか否かを判定し、差分が重複している場合、重複した差分を入出力インタフェース部１１１を介してユーザに提示する。ユーザに提示するとは、当該差分を表示装置に表示してもよいし、当該差分をプリンタから出力してもよいし、他の計算機等に出力する等を含む。
【００３２】
修正案作成部１０６について説明する。
【００３３】
図示しないメモリには、予め指定された差分ごとに基本ソースファイルの修正案を記憶した修正パターンデータ（不図示）が格納されている。
【００３４】
修正案作成部１０６は、修正パターンデータを参照し、差分比較部１０５によって重複すると判定された差分に対応する修正案を作成し、作成した修正案を入出力インタフェース部１１１を介して提示する。
【００３５】
プログラム修正処理部１０７は、基本ソースファイル、機能モジュールのソースファイル（機能ソースファイル）を修正する。
【００３６】
基本関数リスト１０８は、機能モジュールで定義される機能関数が呼び出す基本関数及び集約関数を管理するリストであり、図示しないメモリに格納される。基本関数は、基本モジュールで定義される関数である。集約関数は、複数の機能モジュールの機能関数が共通して呼び出す複数の基本関数を集約した関数である。なお、基本関数リスト１０８については、図４及び図５で詳細を説明する。
【００３７】
基本関数リスト作成部１０９は、機能ソースファイルを解析することによって、機能関数で呼び出す基本関数を特定し、基本関数リスト１０８を作成する。
【００３８】
基本関数リスト比較部１１０は、基本関数リスト１０８を参照し、複数の機能モジュールの機能関数が共通して呼び出す複数の基本関数を検出し、検出した複数の基本関数を集約した集約関数を作成する。
【００３９】
図２は、本発明の第１実施形態のソースファイル格納部１０２の説明図である。
【００４０】
ソースファイル格納部１０２は、上述したように、すべてのバージョンのプログラムのソースファイルを格納する。ソースファイル格納部１０２は、プログラムのバージョン２０１ごとに、プログラムを基本モジュール２０２及び機能モジュール群２０４を分けて管理する。
【００４１】
具体的には、図示しないＣＰＵが同じ機能モジュール２０３に属するソースファイルに同じタグを付与することによって、ソースファイル格納部１０２は各機能モジュール２０３を管理する。この場合、ソースファイル格納部１０２は、基本モジュール２０２にはタグが付与されていないので、基本モジュール２０２と機能モジュール群２０４とを分けて管理できる。なお、基本モジュール２０２のソースファイルに基本モジュールを示すタグが付与されてもよい。
【００４２】
また、ソースファイル格納部１０２は、タグによって基本モジュール２０２及び機能モジュール群２０４を管理しなくてもよく、例えば、格納される記憶領域を分けて管理してもよい。この場合、機能モジュール２０３ごとに格納される記憶領域が異なる。
【００４３】
バージョン２０１について説明する。
【００４４】
機能モジュールが追加された場合、ＣＰＵがバージョン２０１の整数部分をインクリメントし、既存の基本モジュール及び既存の機能モジュールが変更された場合、ＣＰＵがバージョン２０１の小数点以下の値をインクリメントする。
【００４５】
図２において、例えば、バージョン２０１が「ｖ０．１」であるプログラムは、「ｖ０」の基本モジュールのソースファイルが変更されたプログラムである。バージョン２０１が「ｖ１」は、「ｖ０．１」のプログラムに機能モジュール１が追加されたプログラムである。
【００４６】
図３は、本発明の第１実施形態の差分リスト１０３の説明図である。
【００４７】
差分リスト１０３は、機能モジュールｎをプログラムに追加した場合、機能モジュールｎの追加後の基本ソースファイルと、機能モジュールｎの追加前の直前のバージョン（ｖｎ−１．ｘ）の基本ソースファイルとの差分が登録される。
【００４８】
当該差分は基本モジュール差分検出部１０４によって検出されるが、基本モジュール差分検出部１０４は、差分を検出する場合、機能モジュール追加前後の基本ソースファイルの異なる箇所の構造のまとまりを差分として検出する。
【００４９】
具体的には、機能モジュールを追加したことによって、ｓｗｉｔｃｈ分の分岐が一つ増加した場合、増加した分岐を差分として検出するのではなく、ｓｗｉｔｃｈ分全体を差分として検出する。
【００５０】
差分リスト１０３は、機能モジュール３０１、ソースファイル名３０２、開始位置３０３、及び終了位置３０４を含む。
【００５１】
機能モジュール３０１には、プログラムに追加された機能モジュールの一意な識別子が登録される。ソースファイル名３０２には、機能モジュール３０１に登録された一意な識別子によって識別される機能モジュールの追加によって差分が生じた基本ソースファイルの一意な識別子が登録される。
【００５２】
開始位置３０３には、当該レコードのソースファイル名３０２に登録された識別子によって識別される基本ソースファイルの差分の開始位置である行番号が登録される。終了位置３０４には、当該レコードのソースファイル名３０２に登録された識別子によって識別される基本ソースファイルの差分の終了位置である行番号が登録される。
【００５３】
図４Ａ、図４Ｂ、図５Ａ、及び図５Ｂは、本発明の第１実施形態の基本関数リスト１０８の説明図である。
【００５４】
図４Ａは、本発明の第１実施形態の基本関数リスト比較部１１０によって集約関数が作成される前の基本関数リスト１０８の説明図である。図４Ｂは、本発明の第１実施形態の基本関数リスト比較部１１０によって集約関数が作成された後の基本関数リスト１０８の説明図である。
【００５５】
基本関数リスト１０８は、機能モジュールで定義される機能関数によって呼び出される基本関数及び集約関数を管理する。
【００５６】
基本関数＿集約関数４０１には、機能モジュールで定義される機能関数によって呼び出される基本関数及び集約関数の識別子が登録される。図４Ａでは、基本関数＿集約関数４０１には、基本関数であるｆ＿ｘ、及びｆ＿ｙが登録される。また、図４Ｂでは、基本関数＿集約関数４０１には、基本関数の他、集約関数であるｆ＿ｆが登録される。
【００５７】
集約関数４０２には、基本関数又は集約関数の呼び出し元となる集約関数の識別子が登録される。
【００５８】
機能モジュール４０３Ａ〜４０３Ｂには、プログラムに追加されている機能モジュールの識別子が登録される。
【００５９】
機能関数４０４には、各機能モジュールで定義され、基本関数又は集約関数の呼び出し元となる機能関数の識別子が登録される。
【００６０】
基本関数リスト１０８では、基本関数又は集約関数が呼び出される場合、当該基本関数又は集約関数のレコードで呼び出し元となる機能関数又は集約関数のセルにフラグが設定される。図４Ａ、図４Ｂ、図５Ａ、及び図５Ｂでは、フラグが設定された状態を「○」と示す。
【００６１】
例えば、図４Ａでは、基本関数ｆ＿ｘは、機能関数ｆ１＿１、及びｆ２＿１に呼び出される。
【００６２】
したがって、基本関数リスト比較部１１０は、基本関数リスト１０８の各レコードを参照することによって、各基本関数が異なる機能モジュールで定義される機能関数によって共通して呼び出されるか否かを判定できる。そして、基本関数リスト比較部１１０は、異なる機能モジュールで定義される機能関数によって共通して呼び出されるレコードが複数存在する場合、当該レコードの基本関数＿集約関数４０１に登録された識別子によって識別される基本関数を集約した集約関数を作成する。
【００６３】
基本関数リスト比較部１１０の集約関数の作成処理について説明する。
【００６４】
機能モジュール２がプログラムに追加される前の状態では、機能モジュール１がプログラムに追加された状態であり、機能モジュールが一つしかないので、複数の機能モジュールで定義される機能関数によって共通して呼び出される基本関数は存在せず、集約関数が生成されていないものとする。
【００６５】
機能モジュール２がプログラムに追加された場合、基本関数リスト比較部１１０は、基本関数ｆ＿ｘ、ｆ＿ｙ、及びｆ＿ｚが機能関数ｆ１＿１及びｆ２＿１に共通して呼び出され、機能関数ｆ１＿１及びｆ２＿１を定義する機能モジュールが異なることを検出する。
【００６６】
次に、基本関数リスト比較部１１０は、検出した基本関数ｆ＿ｘ、ｆ＿ｙ、及びｆ＿ｚを集約した集約関数ｆ＿ｆを作成する。そして、基本関数リスト比較部１１０は、集約関数ｆ＿ｆ、集約関数ｆ＿ｆの元になった基本関数ｆ＿ｘ、ｆ＿ｙ、及びｆ＿ｚ、並びに、基本関数ｆ＿ｘ、ｆ＿ｙ、及びｆ＿ｚの呼び出し元となる機能関数ｆ１＿１及びｆ２＿１をユーザに提示する。
【００６７】
次に、基本関数リスト作成部１０９は、ユーザから集約関数の作成確認指示を受け付けた場合、図４Ｂに示すように、作成した集約関数ｆ＿ｆの識別子を基本関数＿集約関数４０１及び集約関数４０２に登録する。
【００６８】
集約関数ｆ＿ｆは基本関数ｆ＿ｘ、ｆ＿ｙ、及びｆ＿ｚを呼び出すので、基本関数リスト作成部１０９は、集約関数４０２の「ｆ＿ｆ」のカラムの基本関数ｆ＿ｘ、ｆ＿ｙ、及びｆ＿ｚのセルにフラグを設定する。
【００６９】
そして、機能関数ｆ１＿１及びｆ１＿２は、基本関数ｆ＿ｘ、ｆ＿ｙ、及びｆ＿ｚを呼び出す代わりに、集約関数ｆ＿ｆを呼び出すので、基本関数リスト作成部１０９は、機能関数ｆ１＿１及びｆ１＿２のカラムの基本関数ｆ＿ｘ、ｆ＿ｙ、及びｆ＿ｚのセルのフラグの設定を解除し、集約関数ｆ＿ｆのセルにフラグを設定する。
【００７０】
なお、基本関数リスト比較部１１０は、ユーザから集約関数の作成確認指示を受け付けない場合、作成した集約関数ｆ＿ｆを破棄し、基本関数リスト作成部１０９は、基本関数リスト１０８を変更しない。
【００７１】
このように、異なる機能モジュールで定義された機能関数に共通して呼び出される基本関数を集約した集約関数が作成されるので、集約関数作成後、ユーザは、集約関数を示すコードを記載すればよい。このため、重複コードが削減され、プログラムがスリム化でき、プログラムの保守及び管理が容易になる。
【００７２】
なお、類似コードを検出する技術としては、コピー＆ペーストによって作成されたコードであるクローンコードを検出する技術であるＣＣＦｉｎｄｅｒが知られている（特開２００３−２９９７８号公報）。ＣＣＦｉｎｄｅｒは、クローンコードを検出し、ペースト後に識別子及びコードの変更にも対応しており、完全一致でない類似コードも検出できる。また、ＣＣＦｉｎｄｅｒを用いて検出されたクローンコードに変わる共通関数を自動的に作成する方法も知られている（特開２００９−１７６０６４号公報）。
【００７３】
しかしながら、ＣＣＦｉｎｄｅｒでは、コードを比較するだけであって、新たな機能を追加するための二つソースコードの両方に、既存のソースコード内に用意された複数の関数が他のコードを挟んで記載されている場合には、当該関数を示すコードを検出できないものであった。
【００７４】
集約関数作成処理では、関数の呼び出し関係を示す基本関数リストを作成するので、上述のようなソースコードであっても、関数を検出することが可能となる。
【００７５】
次に、機能モジュール３をプログラムに追加した場合の基本関数リスト比較部１１０による集約関数の作成処理について図５Ａ及び図５Ｂを用いて説明する。
【００７６】
図５Ａは、本発明の第１実施形態の機能モジュール３がプログラムに追加され、集約関数が作成される前の基本関数リスト１０８の説明図である。図５Ｂは、本発明の第１実施形態の機能モジュール３がプログラムに追加され、集約関数が作成された後の基本関数リスト１０８の説明図である。
【００７７】
機能モジュール３がプログラムに追加された場合、基本関数リスト比較部１１０は、追加された機能モジュール３で定義された機能関数ｆ３＿１が集約関数ｆ＿ｆの元になった基本関数ｆ＿ｘ、ｆ＿ｙ、及びｆ＿ｚのうちｆ＿ｘ及びｆ＿ｙを呼び出すこと、つまり、新たな機能関数が集約関数の元になった基本関数群の一部の基本関数を呼び出すことを検出する。
【００７８】
次に、基本関数リスト比較部１１０は、集約関数ｆ＿ｆの元になった基本関数ｆ＿ｘ、ｆ＿ｙ、及びｆ＿ｚのうち機能関数ｆ３＿１によって呼び出されるｆ＿ｘ及びｆ＿ｙを集約するように、集約関数ｆ＿ｆを変更する。
【００７９】
なお、基本関数リスト比較部１１０は、これらの基本関数ｆ＿ｘ及びｆ＿ｙを集約した集約関数ｆ＿ｈ（不図示）を新たに作成してもよい。ここで、既存の集約関数ｆ＿ｆの集約関係を変更する方式、及び、新たな集約関数ｆ＿ｈを作成する方式を総称して、新たな集約関数を作成するという。
【００８０】
次に、基本関数リスト比較部１１０は、変更前の集約関数の基になった基本関数ｆ＿ｘ、ｆ＿ｙ、及びｆ＿ｚのうち新たな機能関数ｆ３＿１に呼び出されないｆ＿ｚと変更後の集約関数ｆ＿ｆとを集約した新たな集約関数ｆ＿ｇを作成する。
【００８１】
以上より、変更後の集約関数ｆ＿ｆは、基本関数ｆ＿ｘ及びｆ＿ｙから構成されるので、機能関数ｆ３＿１から呼び出される。また、集約関数ｆ＿ｇは、集約関数ｆ＿ｆ及び基本関数ｆ＿ｚ、つまり、基本関数ｆ＿ｘ、ｆ＿ｙ、及びｆ＿ｚから構成されるので、機能関数ｆ１＿１及びｆ１＿２から呼び出される。集約関数を構成する基本関数又は集約関数、及び当該集約関数を呼び出す機能関数の関係を集約関数の集約関係という。
【００８２】
基本関数リスト比較部１１０は、変更後の集約関数ｆ＿ｆの集約関係、及び新たに作成した集約関数ｆ＿ｇの集約関係をユーザに提示する。
【００８３】
次に、基本関数リスト作成部１０９は、ユーザから集約関数の作成確認指示を受け付けた場合、図５Ｂに示すように、上述した変更後の集約関数ｆ＿ｆ及びｆ＿ｇの集約関係を基本関数リスト１０８に登録する。
【００８４】
以上によって、基本関数リスト比較部１１０は、新たに追加された機能モジュールで定義された機能関数によって呼び出される基本関数が既存の集約関数を構成する基本関数のうちの一部の基本関数である場合、当該一部の基本関数を集約する集約関数、及び、既存の集約関数を構成する基本関数のうち追加された機能関数によって呼び出されない基本関数と当該一部の基本関数を集約する集約関数とを集約した集約関数を作成する。これによって、既存の集約関数の一部の基本関数を呼び出す機能関数が追加されても、既存の集約関数と矛盾が生じない集約関数を新たに作成することができる。
【００８５】
図６は、本発明の第１実施形態の機能モジュール追加時処理のフローチャートである。
【００８６】
当該処理は、新たな機能モジュールＮがプログラムに追加された場合に、図示しないＣＰＵによって実行される。
【００８７】
ＣＰＵは、当該機能モジュールの追加前後の基本ソースファイルの差分を検出し、所定の場合に当該差分をユーザに提示する基本モジュール差分処理を実行する（５０１）。基本モジュール差分処理は、基本モジュール差分検出部１０４、差分比較部１０５、修正案作成部１０６、及びプログラム修正処理部１０７による処理である。なお、基本モジュール差分処理は図７で詳細を説明する。
【００８８】
次に、ＣＰＵは、追加された機能モジュールで定義される機能関数が呼び出す基本関数に基づいて集約関数を生成する重複関数集約処理を実行し（５０２）、機能モジュール追加時処理を終了する。重複関数集約処理は、基本関数リスト作成部１０９及び基本関数リスト比較部１１０による処理である。なお、重複関数集約処理は図９で詳細を説明する。
【００８９】
図７は、本発明の第１実施形態の基本モジュール差分処理のフローチャートである。
【００９０】
まず、ＣＰＵは、機能モジュールＮの追加前後の基本ソースファイルの差分を検出し、検出した差分と機能モジュールＮと対応付けて差分リスト１０３に格納する（６０１）。
【００９１】
次に、ＣＰＵは、機能モジュールＮの追加による差分がステップ６０１の処理で検出されたか否かを判定する（６０２）。
【００９２】
なお、ステップ６０１及び６０２の処理は、ＣＰＵが基本モジュール差分検出部１０４のプログラムを実行することによって実現される。
【００９３】
ステップ６０２の処理で、機能モジュールＮの追加によって差分が検出されないと判定された場合、基本モジュール差分処理を終了し、図９に示す重複関数集約処理に移行する。
【００９４】
一方機能モジュールＮの追加によって差分が検出されたと判定された場合、ＣＰＵは、差分リスト１０３を参照し、機能モジュールＮによる差分と既存の機能モジュール１〜Ｎ−１による差分とを比較する（６０３）。
【００９５】
ＣＰＵは、ステップ６０３の処理の比較結果を参照し、機能モジュールＮによる差分が既存の機能モジュール１〜Ｎ−１による差分と重複するか否かを判定する（６０４）。
【００９６】
具体的には、ＣＰＵは、差分リスト１０３を参照し、機能モジュールＮの開始位置３０３に登録された行番号及び終了位置３０４に登録された行番号によって特定される差分を、機能モジュール１〜Ｎ−１の差分に含むものがあるか否かを判定する。つまり、ＣＰＵ機能モジュールＮの開始位置３０３に登録された行番号以下の行番号が開始位置３０３に登録され、かつ終了位置３０４に登録された行番号以上の行番号が終了位置３０４に登録されたレコードが存在するか否かを判定する。
【００９７】
ステップ６０４の処理で機能モジュールＮによる差分が既存の機能モジュール１〜Ｎ−１による差分と重複しないと判定された場合、基本モジュール差分処理を終了し、図９に示す重複関数集約処理に移行する。
【００９８】
一方、ステップ６０４の処理で機能モジュールＮによる差分が既存の機能モジュール１〜Ｎ−１による差分と重複すると判定された場合、ＣＰＵは、機能モジュールＮによる差分、及び、機能モジュールＮによる差分と重複する機能モジュールの差分をユーザに提示する（６０５）。
【００９９】
これによって、ユーザは、追加する機能モジュールによる基本ソースファイルの差分が、過去の機能モジュールによる基本ソースファイルの差分と重複する場合、追加する機能モジュールによる差分の変更を再度確認できるので、基本ソースファイルの変更箇所の誤りを防止でき、作業効率を向上させ、必要な変更がなされないことを防止できる。
【０１００】
また、過去の機能モジュールの追加による基本ソースファイルの差分もユーザに提示されれば、追加する機能モジュールによる差分が、過去の機能モジュールによる差分に対応しているかを確認でき、基本ソースファイルの変更の誤りを防止できる。
【０１０１】
ステップ６０５の処理では、機能モジュールＮによる差分及び機能モジュールＮによる差分と重複する機能モジュールの差分の少なくとも一方がユーザに提示されればよい。
【０１０２】
なお、差分のユーザへの提示は、差分をディスプレイに表示してもよいし、差分をプリンタ等から印刷してもよい。
【０１０３】
また、ステップ６０３〜６０５の処理は、ＣＰＵが差分比較部１０５のプログラムを実行することによって実現される。
【０１０４】
次に、ＣＰＵは、基本ソースファイルのソースコードのうち機能モジュールＮの追加によって変更されたソースコード（変更ソースコード）が、図示しないメモリに格納された図示しない修正パターンデータに登録された予め指定されたソースコードと一致するか否かを判定する（６０６）。
【０１０５】
ステップ６０６の処理で、変更ソースコードが修正パターンデータに登録されたソースコードと一致すると判定された場合、ＣＰＵは、修正パターンデータを参照し、当該ソースコードに対応する修正ソースファイルを抽出し、抽出した修正ソースファイルをユーザに提示する（６０７）。
【０１０６】
なお、ステップ６０６及び６０７の処理は、ＣＰＵが修正案作成部１０６のプログラムを実行することによって実現される。
【０１０７】
次に、ＣＰＵは、ユーザに提示した修正ソースファイルに対して修正の必要がある旨のデータが入出力インタフェース部１１１から入力されたか否かを判定する（６０８）。
【０１０８】
ステップ６０８の処理で、ユーザに提示した修正ソースファイルに対して修正の必要がある旨のデータが入出力インタフェース部１１１から入力されたと判定された場合、又は、ステップ６０６の処理で、変更ソースコードが修正パターンデータに登録されたソースコードと一致しないと判定された場合、ＣＰＵは、基本ソースファイル及び機能モジュール１〜Ｎの機能ソースファイル（以下、ソースファイル）に対するユーザによる修正の入力を受け付け（６０９）、ステップ６１０の処理に移行する。
【０１０９】
一方、ステップ６０８の処理で、ユーザに提示した修正ソースファイルに対して修正の必要がある旨のデータが入出力インタフェース部１１１から入力されていないと判定された場合、ＣＰＵは、ステップ６０９の処理を実行せずに、ステップ６１０の処理に移行する。
【０１１０】
そして、ＣＰＵは、入力された内容でソースファイルを修正する許可を示すデータが入出力インタフェース部１１１を介して入力されたか否かを判定する（６１０）。
【０１１１】
ステップ６１０の処理で、入力された内容でソースファイルを修正する許可を示すデータが入力されたと判定された場合、ＣＰＵは、入力された内容でソースファイルを修正し（６１１）、ソースファイルの修正内容に基づいて、機能モジュール１〜Ｎの差分リスト１０３を修正し（６１２）、基本モジュール差分処理を終了し、図９に示す重複関数集約処理に移行する。
【０１１２】
一方、ステップ６１０の処理で、入力された内容でソースファイルを修正する許可を示すデータが入力されていないと判定された場合、基本モジュール差分処理を終了し、図９に示す重複関数集約処理に移行する。
【０１１３】
なお、ステップ６０８〜６１２の処理は、ＣＰＵがプログラム修正処理部１０７のプログラムを実行することによって実現される。
【０１１４】
図８は、本発明の第１実施形態のユーザに提示する修正ソースファイルの説明図である。
【０１１５】
図８（Ａ）は、機能モジュールが追加されない場合の基本ソースファイル７０１Ａ、機能モジュール１が追加された場合の基本ソースファイル７０１Ｂ、及び機能モジュール２が追加された場合の基本ソースファイル７０１Ｃの説明図である。
【０１１６】
基本ソースファイル７０１Ｂでは、基本ソースファイル７０１Ａの関数base_func７０２に、機能モジュール１で定義された関数mod_1.func７０３Ａが追加される。また、基本ソースファイル７０１Ｃでは、基本ソースファイル７０１Ｂの関数base_func７０２に、機能モジュール１で定義された関数mod_2.func７０３Ｂが追加される。
【０１１７】
このように、機能モジュールが追加されるごとに、基本ソースファイル７０１の関数base_func７０２に、追加された機能モジュールで定義された関数が追加されていく。
【０１１８】
このように、機能モジュールの追加ごとに関数が追加されるタイプの基本ソースファイルの差分は、図３で説明した構造のまとまりとして検出できない。
【０１１９】
このため、基本モジュール差分検出部１０４は、差分の開始位置よりも所定行上に位置する行番号を開始位置３０３に登録し、差分の終了位置よりも所定行下に位置する行番号を終了位置３０４に登録することによって、本来の差分の範囲より拡大した範囲を差分として検出する。
【０１２０】
機能モジュール２が追加された場合には、図８（Ａ）の基本ソースファイル７０１Ｃでは、mod_2.funcA７０３Ｂが本来の差分となるが、mod_2.funcA７０３Ｂよりも所定行上の行からmod_2.funcA７０３Ｂよりも所定行下の行までが差分として検出される。したがって、ステップ６０１の処理で検出される差分は、mod_1.funcA７０３Ａ及びmod_2.funcA７０３Ｂを含む。
【０１２１】
ステップ６０３の処理では、ステップ６０１の処理で検出された差分（mod_1.funcA７０３Ａ及びmod_2.funcA７０３Ｂ）は、機能モジュール１が追加された場合の差分（mod_1.funcA７０３Ａ）と重複するので、ステップ６０５の処理で当該差分がユーザに提示される。
【０１２２】
次に、ステップ６０７の処理について説明する。
【０１２３】
ここで、図示しない修正データベースには、追加された機能モジュールで定義された関数の追加を示す差分が登録されているものとする。
【０１２４】
ステップ６０７の処理では、ＣＰＵは、ステップ６０１の処理で検出された差分、及び機能モジュール１が追加された場合の差分に基づいて、追加された機能モジュールで定義された関数が追加されることを把握し、当該差分が上述した修正データベースに登録された差分と一致すると判定する。
【０１２５】
ステップ６０８の処理で、修正データベースに登録された差分のうちステップ６０１の処理で検出された差分と一致する差分に対応する修正ソースファイルがユーザに提示される。
【０１２６】
追加された機能モジュールで定義された関数の追加を示す差分に対応する修正ソースファイルを、図８（Ｂ）を用いて説明する。
【０１２７】
この修正ソースファイルは、機能モジュールが追加された場合、追加された機能モジュールで定義される関数を基本ソースファイルの関数に追加するように基本ソースファイルを修正するものである。
【０１２８】
図８（Ｂ）に示す修正ソースファイルでは、基本モジュールに追加されたすべての機能モジュールに対して、各機能モジュールで定義された関数mod_x.funcA関数をbase_func関数に追加している（７０４）。
【０１２９】
これによって、機能モジュールを追加する場合の基本ソースファイルへの変更が一般化できるため、機能モジュールを追加又は削除しても、基本ソースファイルを変更する必要がなくなる。
【０１３０】
なお、図８のソースコードは説明の簡単のために用いたものであり、実際には使用するプログラミング言語のソースコードを用いる。
【０１３１】
また、図８に示す修正ソースファイルは、オブジェクト指向型プログラミングのクラス及びメソッド等を利用することによっても実現できる。
【０１３２】
リファクタリングを必要とする様々な修正ソースファイルのパターンが知られている（Martin Fowler著  「Refactoring:Improving the Design of Existing Code」 Addison-Wesley Professional 1999年 参照）。この文献に記載されたパターンを修正ソースファイルの作成に利用できる。
【０１３３】
以上のように、修正ソースファイルは、機能モジュールの追加による基本ソースファイルの差分に対して、機能モジュールを追加しても基本ソースファイルを変更する必要がなくなるように、差分を一般化したコードを基本ソースファイルに埋め込むように基本ソースファイルを修正する。これによって、機能モジュールを追加又は削除する場合の基本モジュールへの変更作業が削減され、機能モジュールを追加又は削除する場合の開発効率が向上する。
【０１３４】
図９は、本発明の第１実施形態の重複関数集約処理のフローチャートである。
【０１３５】
重複関数集約処理は、機能モジュール１〜Ｎ−１で定義される機能関数１〜ｎ−１が呼び出す基本関数リスト１０８は作成され、機能関数１〜ｎ−１で重複して呼び出される複数の基本関数を集約した集約関数が既に作成されている状態で、機能モジュールＮが追加されることによって実行されるものとする。
【０１３６】
まず、ＣＰＵは、追加した機能モジュールＮのソースファイルを解析し、追加した機能モジュールＮで定義される機能関数ｎが呼び出す基本関数及び集約関数を特定し、特定した基本関数及び集約関数を抽出することによって、基本関数リスト１０８を作成する（８０１）。
【０１３７】
なお、ステップ８０１の処理では、機能関数が呼び出す基本関数のうち予め指定された基本関数のみが抽出されるようにしてもよい。これによって、重複関数集約処理の対象となるユーザの所望の基本関数のみに限定でき、重複関数集約関数処理によるＣＰＵの負荷が軽減できる。
【０１３８】
次に、ＣＰＵは、機能モジュール１〜Ｎ−１及び集約関数の基本関数リスト１０８と、機能モジュールＮの基本関数リスト１０８と、を比較する（８０２）。
【０１３９】
ステップ８０２の処理を図５（Ａ）を用いて具体的に説明する。ここでは、追加された機能モジュールＮは機能モジュール３であるとする。
【０１４０】
ＣＰＵは、基本関数リスト１０８の機能モジュール１〜２の識別子が登録された機能モジュール４０３Ａ及び４０３Ｂのカラムのうち、機能関数ｆ１＿１〜ｆ１＿３及びｆ２＿１〜ｆ２＿３が登録されたカラムでフラグが設定されている基本関数を取得する。
【０１４１】
また、ＣＰＵは、基本関数リスト１０８の集約関数４０２の集約関数ｆ＿ｆが登録されたカラムでフラグが設定されている基本関数を取得する。
【０１４２】
さらに、ＣＰＵは、基本関数リスト１０８の機能モジュール３の識別子が登録された機能モジュール４０３Ｃの機能関数ｆ３＿１〜ｆ３＿４のカラムでフラグが設定されている基本関数を取得する。
【０１４３】
そして、ＣＰＵは、これらの取得した基本関数が重複するか否かを比較する。
【０１４４】
次に、ＣＰＵは、ステップ８０２の処理の比較結果を参照し、機能モジュールＮで定義された機能関数ｎによって呼び出される基本関数が、機能モジュール１〜Ｎ−１で定義される機能関数１〜ｎ−１によって呼び出される基本関数、又は集約関数によって呼び出される基本関数と重複するか否かを判定する（８０３）。
【０１４５】
ステップ８０３の処理の判定方法について説明する。
【０１４６】
機能関数ｎによって呼び出される基本関数のうち、機能関数１〜ｎ−１、又は集約関数によって呼び出される基本関数と重複する基本関数が複数存在する場合、機能関数ｎによって呼び出される基本関数が機能関数１〜ｎ−１、又は集約関数によって呼び出される基本関数と重複すると判定される。
【０１４７】
ステップ８０３の処理で、機能関数ｎによって呼び出される基本関数が、機能関数１〜ｎ−１、又は集約関数によって呼び出される基本関数及び集約関数によって呼び出される基本関数と重複しない場合、重複した基本関数に基づき集約関数を作成する必要がないので、重複関数集約処理を終了する。
【０１４８】
一方、ステップ８０３の処理で、機能関数ｎによって呼び出される基本関数が、機能関数１〜ｎ−１によって呼び出される基本関数、及び集約関数によって呼び出される基本関数の少なくとも一方と重複すると判定された場合、ＣＰＵは、重複する基本関数を集約する集約関数を作成し、作成した集約関数及び当該集約関数の集約関係をユーザに提示する（８０４）。また、作成した集約関数をソースコードに反映した修正案を提示する（８０４）。
【０１４９】
ステップ８０４の処理を具体的に説明する。
【０１５０】
ステップ８０３の処理で機能関数ｎによって呼び出される基本関数が機能関数１〜ｎ−１によって呼び出される基本関数と重複すると判定された場合、ＣＰＵは、複数の機能関数１〜ｎに重複して呼び出される複数の基本関数を集約した集約関数を作成する。例えば、図４Ａに示す場合、機能モジュール２が追加されたとすると、基本関数ｆ＿ｘ、ｆ＿ｙ、及びｆ＿ｚは異なる機能モジュールのｆ１＿１及びｆ２＿１によって呼び出されるので、これらの基本関数を集約した集約関数ｆ＿ｆが作成される。
【０１５１】
ステップ８０３の処理で機能関数ｎによって呼び出される基本関数が集約関数によって呼び出される基本関数の一部と重複すると判定された場合、ＣＰＵは、集約関数によって呼び出される基本関数のうち、機能関数ｎによって呼び出される基本関数と重複する基本関数を集約した新たな集約関数を作成する。また、ＣＰＵは、当該集約関数のうち、機能関数によって呼び出されない基本関数と新たに作成された集約関数とを集約した集約関数を作成する。
【０１５２】
例えば、図５Ａに示す場合、機能モジュール３が追加されたとすると、集約関数ｆ＿ｆによって呼び出される基本関数ｆ＿ｘ、ｆ＿ｙ、及びｆ＿ｚのうち、機能関数ｆ３＿１によって呼び出されるｆ＿ｘ及びｆ＿ｙを集約した新たな集約関数ｆ＿ｆを作成する。そして、ＣＰＵは、元の集約関数ｆ＿ｆによって呼び出される基本関数ｆ＿ｘ、ｆ＿ｙ、及びｆ＿ｚのうち、機能関数ｆ３＿１によって呼び出されないｆ＿ｚと、新たに作成された集約関数ｆ＿ｆとを集約した集約関数ｆ＿ｇを作成する。
【０１５３】
ステップ８０３の処理で集約関数によって呼び出される基本関数の全部の基本関数が機能関数ｎによって呼び出される基本関数と重複する場合、新たな集約関数を作成する必要がないため、機能モジュール３のソースコードに集約関数を適用した修正案を提示する。
【０１５４】
ユーザ（プログラマ）は、ステップ８０４の処理で、提示された集約関数及び当該集約関数の集約関係に基づき、修正案として提示された基本ソースファイル及び機能ソースファイルに修正の必要があるか否かを判定し、修正の必要がある場合、その旨を入出力インタフェース部１１１を介してプログラム開発支援システム１０１に入力する。
【０１５５】
ＣＰＵは、これらのソースファイルに修正の必要がある旨が入出力インタフェース部１１１を介して入力されたか否かを判定する（８０５）。
【０１５６】
ここで、ユーザは、これらのソースファイルのソースコードに修正の必要があると判定した場合、ソースファイルのソースコードを修正するための修正用ソースコードを入出力インタフェース部１１１を介してプログラム開発支援システム１０１に入力する。
【０１５７】
このため、ステップ８０５の処理で、これらのソースファイルに修正の必要がある旨が入出力インタフェース部１１１を介して入力されたと判定されたと場合、ＣＰＵは、入出力インタフェース部１１１を介して修正用コードの入力を受け付け（８０６）、ステップ８０７の処理に移行する。
【０１５８】
一方、ステップ８０５の処理で、これらのソースファイルに修正の必要がある旨が入出力インタフェース部１１１を介して入力さていないと判定された場合、修正用コードが入力されないので、ステップ８０７の処理に移行する。
【０１５９】
ＣＰＵは、これらの修正用のソースファイルを適用して現在のソースコードを修正する必要があるか否かを判定する（８０７）。
【０１６０】
ステップ８０７の処理で、現在のソースコードを修正する必要がないと判定された場合、ＣＰＵは重複関数集約処理を終了する。
【０１６１】
一方、ステップ８０７の処理で、現在のソースコードを修正する必要があると判定された場合、ＣＰＵは、基本モジュール及び機能モジュール１〜Ｎのソースコードを修正し、基本関数リスト１０８を修正する（８０８）。
【０１６２】
次に、ＣＰＵは、ステップ８０４の処理で作成された集約関数の集約関係を基本関数リスト１０８に登録し（８０９）、重複関数集約処理を終了する。
【０１６３】
以上によって、複数の機能モジュールから呼び出される基本関数が複数存在する場合、これらの基本関数を集約した集約関数が作成される。これによって、ユーザは、新たに機能モジュールを作成する場合、これらの基本関数を一つの集約関数として扱うことができるので、関数の呼び忘れ及び関数の引き渡しのミスを防止でき、バグ発生率を低減させることができ、プログラムの開発効率を向上させることができる。また、重複する関数を示すコードを削減できるので、プログラムのソースコードを低減させることができ、保守管理が容易になる。
【０１６４】
さらに、集約関数によって呼び出される基本関数の一部の基本関数が、追加された機能関数によって呼び出される基本関数と重複する場合、当該重複する基本関数を集約した新たな集約関数が作成されるとともに、集約関数によって呼び出される基本関数のうち追加された機能関数によって呼び出されない基本関数と新たに作成された集約関数とを集約した集約関数が新たに作成される。これによって、既存の集約関数の一部の基本関数を呼び出す機能関数が追加されても、既存の集約関数と矛盾が生じない集約関数を新たに作成することができる。
【０１６５】
図１０Ａ〜図１０Ｂを用いて、図９に示す重複関数集約処理で集約関数を新たに作成した場合の基本モジュールのソースコード（基本ソースコード）９０２ａ〜９０２ｃ、機能モジュール１〜３のソースコード（機能ソースコード）９０３１ａ、９０３１ｂ、９０３２ａ、９０３２ｂ、９０３３ａ、及び９０３３ｂ（以下、総称して９０３）を説明する。
【０１６６】
図１０Ａは、本発明の第１実施形態の集約関数作成前のプログラムのソースコード９０１ａの説明図である。
【０１６７】
プログラムのソースコード９０１ａは、基本ソースコード９０２ａ、及び機能ソースコード９０３１ａ〜９０３３ａを含む。
【０１６８】
図５Ａ及び図５Ｂでは、機能モジュール２が追加され集約関数が既に作成された状態で、機能モジュール３が新たに追加される場合について説明したが、図１０Ａ〜図１０Ｃでは、集約関数が何も作成されていない状態、つまり機能モジュールが追加されていない状態で、新たに機能モジュール１〜３が追加される場合について説明する。
【０１６９】
基本ソースコード９０２ａでは、基本関数ｆ＿ｘ、ｆ＿ｙ、及びｆ＿ｚが定義される。
【０１７０】
機能ソースコード９０３１ａでは機能関数ｆ１＿１が定義され、当該機能関数ｆ１＿１は基本関数ｆ＿ｘ、ｆ＿ｙ、及びｆ＿ｚを呼び出す。
【０１７１】
機能ソースコード９０３２ａでは機能関数ｆ２＿１が定義され、当該機能関数ｆ１＿１は基本関数ｆ＿ｘ、ｆ＿ｙ、及びｆ＿ｚを呼び出す。
【０１７２】
機能ソースコード９０３３ａでは機能関数ｆ３＿１が定義され、当該機能関数ｆ１＿１は基本関数ｆ＿ｘ、及びｆ＿ｙを呼び出す。
【０１７３】
図１０Ｂは、本発明の第１実施形態の集約関数作成後のプログラムのソースコード９０１ｂの説明図である。
【０１７４】
図１０Ｂに示すプログラムのソースコード９０１ｂは、図９に示す重複関数集約処理によって集約関数が作成された場合、作成された集約関数に対応するために、図１０Ａに示すプログラムのソースコード９０１ａを修正したものである。
【０１７５】
基本関数ｆ＿ｘ及びｆ＿ｙは、機能関数ｆ１＿１、ｆ２＿１、及びｆ３＿１で共通して呼び出されるので、基本関数ｆ＿ｘ及びｆ＿ｙを集約した集約関数ｆ＿ｆが作成される。また、基本関数ｆ＿ｘ、ｆ＿ｙ、及びｆ＿ｚは、機能関数ｆ１＿１及びｆ２＿１で共通して呼び出されるので、基本関数ｆ＿ｘ及びｆ＿ｙを集約した集約関数ｆ＿ｆと基本関数ｆ＿ｚを集約した集約関数ｆ＿ｇが作成される。
【０１７６】
このため、基本ソースコード９０２ｂでは、集約関数ｆ＿ｆが基本関数ｆ＿ｘ及びｆ＿ｙを呼び出す旨の定義、及び集約関数ｆ＿ｇが集約関数ｆ＿ｆ及び基本関数ｆ＿ｚを呼び出す旨の定義が追加される。
【０１７７】
また、機能ソースコード９０３１ｂでは、機能関数ｆ１＿１が集約関数ｆ＿ｇを呼び出すように修正される。機能ソースコード９０３２ｂでは、機能関数ｆ２＿１が集約関数ｆ＿ｇを呼び出すように修正される。機能ソースコード９０３３ｂでは、機能関数ｆ３＿１が集約関数ｆ＿ｆを呼び出すように修正される。
【０１７８】
これによって、機能モジュール１〜３によって呼び出される関数の数が削減できる。
【０１７９】
図１０Ｃは、所定条件が成立した場合、基本モジュールで集約関数ｆ＿ｆ及びｆ＿ｇを呼び出すように修正された基本ソースコード９０３ｃの説明図である。
【０１８０】
基本ソースコード９０３ｃでは、所定条件が成立するか否かによって、集約関数ｆ＿ｆ及びｆ＿ｇのうちいずれかが呼び出される。具体的には、基本ソースコード９０３ｃでは、所定条件が成立する場合、集約関数ｆ＿ｆが呼び出され、所定条件が成立しない場合、集約関数ｆ＿ｇが呼び出される。
【０１８１】
例えば、集約関数ｆ＿ｆを呼び出す機能モジュールが所定数以上である場合、基本ソースコード９０３ｃで集約関数ｆ＿ｆを呼び出すようにしてもよいし、集約関数ｆ＿ｇを呼び出す機能モジュールが所定数以上である場合、基本ソースコード９０３ｃで集約関数ｆ＿ｇを呼び出すようにしてもよい。
【０１８２】
基本ソースコード９０３ｃで集約関数が呼び出されれば、機能ソースコードで集約関数を呼び出す必要がなくなる。
【０１８３】
なお、図１０Ａ〜図１０Ｃに示すソースコードは説明の簡単のために用いたものであり、実際には使用するプログラミング言語のソースコードを用いる。
【０１８４】
次に、ある機能関数が他の機能関数を呼び出し、当該他の機能関数が基本関数を呼び出す場合の基本関数リスト１０８の作成方法、及び基本関数リスト１０８の比較方法について、図１１〜図１４を用いて説明する。なお、このような関数の構造を入れ子構造という。
【０１８５】
図１１は、本発明の第１実施形態の入れ子構造の関数のソースコードの説明図である。
【０１８６】
図１１は、ある機能モジュール（例えば、機能モジュール１とする）のソースコードを示す。当該機能モジュールでは、機能関数ｆ１＿１、ｆ１＿２、及びｆ１＿３が定義されている。機能関数ｆ１＿１は、基本関数ｆ＿ｗ及びｆ＿ｘを呼び出し、機能関数ｆ１＿２を呼び出す。機能関数ｆ１＿２は、基本関数ｆ＿ｙ、及び機能関数ｆ１＿３を呼び出す。機能関数ｆ１＿３は、基本関数ｆ＿ｚを呼び出す。
【０１８７】
図１２は、本発明の第１実施形態の入れ子構造の関数を定義する機能関数の基本関数リスト１０８を作成するための補助リスト１１０１の説明図である。
【０１８８】
補助リスト１１０１は、基本関数リスト作成部１０９によって作成され、基本関数リスト１０８の一部に記憶される。
【０１８９】
補助リスト１１０１の構成は、図４に示す基本関数リスト作成部１０９の構成と同じであるので、説明を省略する。
【０１９０】
基本関数リスト作成部１０９は、図１１で説明したように、機能関数ｆ１＿１が基本関数ｆ＿ｗ及びｆ＿ｘの他に機能関数ｆ１＿２を呼び出すため、基本関数＿集約関数４０１に基本関数ｆ＿ｗ及びｆ＿ｘの他に機能関数ｆ１＿２を登録する。そして、基本関数リスト作成部１０９は、基本関数＿集約関数４０１がｆ＿ｗ、ｆ＿ｘ及びｆ１＿２が機能関数ｆ１＿１によって呼び出されることを登録する。
【０１９１】
同様に、基本関数リスト作成部１０９は、機能モジュールｆ１＿２が、基本関数ｆ＿ｙの他に機能関数ｆ１＿３を呼び出すため、基本関数＿集約関数４０１に基本関数ｆ＿ｙの他に機能関数ｆ１＿３を登録する。そして、基本関数リスト作成部１０９は、基本関数＿集約関数４０１がｆ＿ｙ及びｆ１＿３が機能関数ｆ１＿２によって呼び出されることを登録する。
【０１９２】
さらに、基本関数リスト作成部１０９は、機能モジュールｆ１＿３が、基本関数ｆ＿ｚを呼び出すため、基本関数＿集約関数４０１に基本関数ｆ＿ｚを登録する。そして、基本関数リスト作成部１０９は、基本関数＿集約関数４０１がｆ＿ｚが機能関数ｆ１＿３によって呼び出されることを登録する。
【０１９３】
以上によって、補助リスト１１０１が作成される。
【０１９４】
図１３は、本発明の第１実施形態の補助リスト１１０１に基づいて作成された基本関数リスト１０８の説明図である。
【０１９５】
基本関数リスト作成部１０９は、補助リスト１１０１作成後、補助リスト１１０１に基づいて基本関数リスト１０８を作成する。
【０１９６】
基本関数リスト作成部１０９は、ある機能モジュールの機能関数が他の機能関数を呼び出す場合、当該他の機能関数が呼び出す関数を特定する処理を、ある機能モジュールの機能関数が呼び出すすべての機能関数の基本関数を特定するまで繰り返し実行する。
【０１９７】
具体的には、基本関数リスト作成部１０９は、図１２に示す補助リスト１１０１を参照し、機能関数ｆ１＿１が呼び出す関数が基本関数ｆ＿ｗ及びｆ＿ｘ並びに機能関数ｆ１＿２であることを特定する。
【０１９８】
機能関数ｆ１＿１が呼び出す関数に機能関数ｆ１＿２が含まれるので、基本関数リスト作成部１０９は、補助リスト１１０１を参照し、機能関数ｆ１＿２が呼び出す関数を特定する。機能関数ｆ１＿２は基本関数ｆ＿ｙ及び機能関数ｆ１＿３を呼び出すため、基本関数リスト作成部１０９は、補助リスト１１０１を参照し、機能関数ｆ１＿３が呼び出す関数を特定する。機能関数ｆ１＿３は基本関数ｆ＿ｚを呼び出すため、機能関数ｆ＿１が呼び出す機能関数の基本関数を特定したので、特定処理を終了する。
【０１９９】
上述の処理で、基本関数リスト作成部１０９は、機能関数ｆ１＿１は基本関数ｆ＿ｗ及びｆ＿ｘ並びに機能関数ｆ１＿２を呼び出し、機能関数ｆ１＿２は基本関数ｆ＿ｙ及び機能関数ｆ１＿３を呼び出し、機能関数ｆ１＿３は基本関数ｆ＿ｚを呼び出すことを特定する。つまり、基本関数リスト作成部１０９は、機能関数ｆ１＿１は基本関数ｆ＿ｗ、ｆ＿ｘ、ｆ＿ｙ、及びｆ＿ｚを呼び出し、機能関数ｆ１＿２は基本関数ｆ＿ｙ及びｆ＿ｚを呼び出し、機能関数ｆ１＿３は基本関数ｆ＿ｚを呼び出すことを特定する。
【０２００】
したがって、基本関数リスト作成部１０９は、基本関数リスト１０８の機能関数ｆ１＿１のカラムに基本関数ｆ＿ｗ、ｆ＿ｘ、ｆ＿ｙ、及びｆ＿ｚを呼び出すことを登録し、機能関数ｆ１＿２のカラムに基本関数ｆ＿ｙ及びｆ＿ｚを呼び出すことを登録し、機能関数ｆ１＿３のカラムに基本関数ｆ＿ｚを呼び出すことを登録する。
【０２０１】
なお、機能関数が直接呼び出さない基本関数、つまり、他の機能関数を介して呼び出される基本関数（基本関数ｆ＿ｙ及びｆ＿ｚ）には、当該基本関数を直接呼び出す機能関数、及び当該基本関数を直接呼び出す機能関数を直接呼び出す機能関数が登録される。
【０２０２】
具体的には、図１３に示す基本関数リスト１０８の基本関数＿集約関数４０１にｆ＿ｙが登録されたレコードのｆ１＿１のセルには、当該基本関数ｆ＿ｙが機能関数ｆ１＿２によって直接呼び出されることが登録される。
【０２０３】
また、図１３に示す基本関数リスト１０８の基本関数＿集約関数４０１にｆ＿ｚが登録されたレコードのｆ１＿２のセルには、当該基本関数ｆ＿ｚが機能関数ｆ１＿３によって直接呼び出され、機能関数ｆ１＿３が機能関数ｆ１＿２によって直接呼び出されることが登録される。
【０２０４】
ここで、基本関数リスト比較部１１０は、図１３に示す基本関数リスト１０８を参照し、基本関数ｆ＿ｗ、ｆ＿ｘ、ｆ＿ｙ、及びｆ＿ｚが異なる機能モジュールの機能関数（ｆ１＿１及びｆ２＿１）によって重複して呼び出されることを検出する。この場合、基本関数リスト比較部１１０は、ユーザが重複して呼び出される関数の入れ子構造を把握可能な形式で検出画面１３０１（図１４参照）をユーザに提示する。
【０２０５】
図１４は、本発明の第１実施形態の入れ子構造を把握可能な形式の検出画面１３０１の説明図である。
【０２０６】
基本関数リスト比較部１１０は、図１３に示す基本関数リスト１０８を参照し、ある機能関数から他の機能関数を介して間接的に呼び出される基本関数（間接呼出基本関数）の入れ子構造をユーザに提示する。
【０２０７】
例えば図１４に示す検出画面１３０１では、機能関数ｆ＿ｙが「ｆ＿ｙ：＜ｆ１＿２」と表示され、機能関数ｆ＿ｚが「ｆ＿ｚ：＜ｆ１＿３＜ｆ１＿２」と表示されることによって、これらの基本関数の入れ子構造がユーザに提示される。
【０２０８】
なお、図１４に示す検出画面１３０１は、一例であり、他の提示方法を用いて、基本関数の入れ子構造をユーザに提示してもよい。
【０２０９】
さらに、基本関数リスト比較部１１０は、異なる機能モジュールの機能関数（ｆ１＿１及びｆ２＿１）によって重複して呼び出される複数の基本関数があり、これら複数の基本関数の一部の基本関数が機能関数を介して間接的に呼び出される間接呼出基本関数である場合、間接呼出基本関数を集約した集約関数及び間接呼出基本関数でない基本関数を集約した集約関数を作成するとともに、これら複数の基本関数を集約した集約関数を作成し、作成した集約関数をユーザに提示する。
【０２１０】
以上によって、ユーザは入れ子構造を把握できる。また、入れ子構造の基本関数から構成される集約関数と入れ子構造でない基本関数から構成される集約関数とが作成され、重複するすべての基本関数を集約した集約関数が作成されるので、ユーザは、どちらの集約関数を用いるかを選択できる。
【０２１１】
次に、図１５及び図１６を用いて本実施形態の効果について説明する。
【０２１２】
図１５は、本発明の第１実施形態の機能モジュールが追加された場合の基本モジュール及び機能モジュールに対する修正の説明図である。
【０２１３】
基本モジュール差分検出部１０４は、機能モジュール１が追加された場合、機能モジュール１の追加前後の基本モジュールの差分（ｄｉｆｆ１）を検出する。
【０２１４】
また、基本モジュール差分検出部１０４は、機能モジュール２が追加された場合、機能モジュール２の追加前後の基本モジュールの差分（ｄｉｆｆ２）を検出する。
【０２１５】
そして、差分比較部１０５は、機能モジュール１追加時の差分（ｄｉｆｆ１）及び機能モジュール２追加時の差分（ｄｉｆｆ２）を比較し、重複修正箇所を検出し（１８０２Ａ）、当該個所をユーザに提示する。ユーザ又は修正案作成部は、重複修正箇所に基づいて、基本モジュール並びに機能モジュール１及び２を修正する（１８０４）。
【０２１６】
また、基本関数リスト比較部１１０は、機能モジュール１の機能関数（機能関数１）及び機能モジュール２の機能関数（機能関数２）によって重複した呼び出される複数の関数を集約した集約関数を作成する（１８０３）。新たな集約関数が作成された場合、基本モジュール並びに機能モジュール１及び２が、新たな集約関数に対応するように、修正される（１８０５）。
【０２１７】
ユーザは、ステップ１８０２の処理で検出された重複修正箇所、及びステップ１８０３の処理で作成された集約関数の結果を活用し、新たな機能モジュール３を開発する（１８０６及び１８０７）。これによって、ユーザは、修正箇所を予め把握でき、複数の基本関数を集約した集約関数のコードを用いることができるので、プログラムの開発効率が向上する。
【０２１８】
図１６は、本発明の第１実施形態の機能モジュールの開発作業時間の説明図である。
【０２１９】
機能モジュールの開発作業時間は、機能モジュール独自の機能（新機能固有の処理）の開発にかかる時間と、機能モジュールを基本モジュールに追加するための基本モジュールの修正等（固定的な処理）にかかる時間と、を含む。
【０２２０】
図１５に示すように、機能モジュールが追加されるごとに、重複修正箇所がユーザに提示されることによって重複修正箇所が修正しなくてもよいように修正されるため、固定的な処理にかかる時間を削減でき、機能モジュールの開発作業時間が徐々に削減されることになる。
【０２２１】
（第２実施形態）
以下、本発明の第２実施形態を図１７〜図１９を用いて説明する。
【０２２２】
第２実施形態では、機能モジュール追加前後の基本モジュールの差分と当該機能モジュールが実現する機能のジャンルを示すキーワードとを対応付けて差分リスト１０３に記憶され、ある機能モジュールを追加した場合、追加した機能モジュールのキーワードと一致する機能モジュールの差分がユーザに提示される。これによって、同じジャンルの機能を実現する機能モジュールの基本モジュールに対する修正は同じ個所にされる場合が多いことため、当該修正箇所をユーザに提示できる。
【０２２３】
図１７は、本発明の第２実施形態の差分リスト１０３の説明図である。
【０２２４】
本実施形態の差分リスト１０３のうち、図３に示す第１実施形態の差分リスト１０３と同じ構成は同じ符号を付与し、説明を省略する。
【０２２５】
本実施形態の差分リスト１０３は、機能モジュール３０１、ソースファイル名３０２、開始位置３０３、終了位置３０４、及びキーワード１４０１を含む。
【０２２６】
キーワード１４０１には、機能モジュールが実現する機能（機能のジャンル）を示すキーワードが登録される。当該キーワードは、機能モジュールが追加される場合にユーザにより入出力インタフェース部１１１を介してプログラム開発支援システム１０１に入力される。
【０２２７】
これによって、機能モジュールの追加前後の基本モジュールの差分とキーワードとが対応付けられる。
【０２２８】
図１８は、本発明の第２実施形態の差分リスト検索テーブル１５０１の説明図である。
【０２２９】
差分リスト検索テーブル１５０１は、キーワードと機能モジュールの識別子とを対応付けるテーブルであり、図示しないメモリに記憶される。
【０２３０】
差分リスト検索テーブル１５０１は、キーワード１５０２及び機能モジュール１５０３を含む。
【０２３１】
キーワード１５０２にはキーワードが登録され、機能モジュール１５０３にはキーワードに対応する機能モジュールの一意な識別子が登録される。なお、機能モジュール１５０３には、キーワードに対応する機能モジュールが複数存在する場合もあるので、複数の機能モジュールの一意な識別子が登録される場合もある。
【０２３２】
図１９は、本発明の第２実施形態のユーザ提示処理のフローチャートである。
【０２３３】
ユーザ提示処理は、ＣＰＵが差分比較部１０５のプログラムを実行することによって、実現される。
【０２３４】
ユーザ提示処理は、機能モジュールが追加された場合に入力されるキーワード（key_x）がプログラム開発支援システムに入力された場合に実行される。
【０２３５】
まず、ＣＰＵは、入力されたキーワードに対応する差分を検索する（１６０１）。
【０２３６】
具体的には、ＣＰＵは、図１８に示す差分リスト検索テーブル１５０１を参照し、キーワード１５０２に登録されたキーワードが入力されたキーワードと一致するレコードを検索する。
【０２３７】
次に、ＣＰＵは、ステップ１６０１の処理の検索結果に基づいて、入力されたキーワードに対応する差分が存在するか否かを判定する（１６０２）。
【０２３８】
ステップ１６０２の処理で、入力されたキーワードに対応する差分が存在すると判定された場合、ＣＰＵは、図１７に示す差分リスト１０３を参照し、入力されたキーワードに対応する差分を取得し、取得した差分をユーザに提示し（１６０３）、ユーザ提示処理を終了する。
【０２３９】
具体的には、ＣＰＵは、図１７に示す差分リスト１０３のキーワード１４０１に登録されたキーワードが入力されたキーワードと一致するレコードを取得する。そして、ＣＰＵは、取得したレコードのソースファイル名３０２に登録されたソースファイルの一意な識別子、開始位置３０３に登録された差分の開始位置、及び終了位置３０４に登録された差分の終了位置によって特定される差分をユーザに提示する。
【０２４０】
一方、ステップ１６０２の処理で、入力されたキーワードに対応する差分が存在しないと判定された場合、ユーザ提示処理を終了する。
【０２４１】
本実施形態では、機能モジュールが追加された場合の基本モジュールへの修正は、機能モジュールが実現する機能(機能のジャンル)が一致する場合、同じ個所に集中する可能性が高いので、追加された機能モジュールと同じ機能(機能のジャンル)を実現する機能モジュールの追加前後の基本モジュールの差分をユーザに提示する。ユーザは、必要に応じて提示された差分に基づいて基本モジュールを修正する。これによって、プログラムの修正漏れを防止でき、バグの発生率が削減されるので、プログラムの開発作業の効率が向上する。
【０２４２】
（第３実施形態）
第３実施形態を図２０〜図２７を用いて説明する。
【０２４３】
第３実施形態では、基本モジュール及び機能モジュールは複数の状態を提供するものであって、ある状態で所定条件が成立すると他の状態に遷移する場合、機能モジュールの追加又は削除（以下、機能モジュールの追加又は削除を総称して機能モジュールの変更という）前後の状態の差分が記憶され、機能モジュールの変更前に追加又は削除される状態をユーザに提示する。
【０２４４】
これによって、機能モジュールの変更に伴う状態の追加又は削除を確実に行うことができる。
【０２４５】
図２０は、本発明の第３実施形態の基本モジュール及び機能モジュールによって提供される状態の説明図である。
【０２４６】
図２０に示す図は状態遷移図であり、入出力インタフェース部１１１を介して図示しない表示装置に表示される。
【０２４７】
図２０では、基本モジュールに機能モジュール１、２及び３が順に追加されているものとする。
【０２４８】
基本モジュールは状態Ｂａｓｅ＿１〜Ｂａｓｅ＿５を提供し、機能モジュール１は状態Ｍｏｄ１＿１〜Ｍｏｄ１＿３を提供し、機能モジュール２は状態Ｍｏｄ２＿１を提供し、機能モジュール３は状態Ｍｏｄ３＿１を提供する。
【０２４９】
ＣＰＵは、状態Ｂａｓｅ＿１〜Ｂａｓｅ＿５の順に状態を遷移させるが、状態Ｂａｓｅ＿２で第１条件（ｃｏｎｄｉｔｉｏｎ１）が成立すると、状態Ｍｏｄ１＿１に状態を遷移させる。
【０２５０】
ＣＰＵは、状態Ｍｏｄ１＿１に状態を遷移させた後、状態Ｍｏｄ１＿２に状態を遷移させ、状態Ｍｏｄ１＿２で第４条件（ｃｏｎｄｉｔｉｏｎ４）が成立すると、状態Ｍｏｄ２＿１に遷移させ、状態Ｂａｓｅ＿４に遷移させる。また、ＣＰＵは、状態Ｍｏｄ１＿２で第５条件（ｃｏｎｄｉｔｉｏｎ５）が成立すると、状態Ｍｏｄ３＿１に状態を遷移させ、状態Ｂａｓｅ＿４に状態を遷移させる。
【０２５１】
また、ＣＰＵは、状態Ｂａｓｅ＿３で第３条件（ｃｏｎｄｉｔｉｏｎ３）が成立すると、状態Ｍｏｄ２＿１に遷移させ、状態Ｂａｓｅ＿４に遷移させる。
【０２５２】
また、ＣＰＵは、状態Ｂａｓｅ＿４で第２条件（ｃｏｎｄｉｔｉｏｎ２）が成立すると、状態Ｍｏｄ１＿３に遷移させ、状態Ｂａｓｅ＿５に遷移させる。
【０２５３】
図２１は、本発明の第３実施形態の機能モジュールが追加される前の状態遷移図を表示させるためのファイルであるｓｔｄ＿ｃｏｎｆ１８０１の説明図である。
【０２５４】
ｓｔｄ＿ｃｏｎｆ１８０１は、図示しないメモリに記憶され、機能モジュールが変更されるごとに変更される。
【０２５５】
“ｅｌｌｉｐｓｅ”は各状態を示す円であり、“ａｒｒｏｗ”はある状態の遷移先の状態を示す矢印である。
【０２５６】
実際に、状態遷移図を表示するためには、各状態を示す円及び遷移先を示す矢印の位置もｓｔｄ＿ｃｏｎｆ１８０１に記憶されなければならないが、本実施形態では省略する。
【０２５７】
図２２は、本発明の第３実施形態の機能モジュール１〜３が追加された後のｓｔｄ＿ｃｏｎｆ１８０１の説明図である。
【０２５８】
“ｅｌｌｉｐｓｅ”には、機能モジュール１が提供する状態Ｍｏｄ１＿１〜１＿３、機能モジュール２が提供する状態Ｍｏｄ２＿１、及び機能モジュール３が提供する状態Ｍｏｄ３＿１が追加される。
【０２５９】
“ａｒｒｏｗ”には、追加された状態Ｍｏｄ１＿１〜１＿３、Ｍｏｄ２＿１、及びＭｏｄ３＿１の遷移元及び遷移先を示す矢印が追加される。
【０２６０】
なお、ｓｔｄ＿ｃｏｎｆ１８０１の“ａｒｒｏｗ”よりも前に状態が定義されていれば、“ｅｌｌｉｐｓｅ”で定義される状態の順番が異なっていてもよい。
【０２６１】
なお、図示しない状態差分検出部が、機能モジュール追加前後のｓｔｄ＿ｃｏｎｆ１８０１の差分を検出する。また、ｓｔｄ＿ｃｏｎｆ１８０１は、状態遷移図を表示するためのファイルであるので、図７に示す第１実施形態の修正ソースファイル及び図１０Ａ〜図１０Ｃに示す第１実施形態のプログラムのソースコードの形式と異なるものである。
【０２６２】
図２３は、本発明の第３実施形態の状態差分リスト２００１の説明図である。
【０２６３】
状態差分リスト２００１は、図示しないメモリに記憶されるもので、図示しない状態差分検出部によって検出されたｓｔｄ＿ｃｏｎｆ１８０１の状態の差分が記憶される。
【０２６４】
状態差分リスト２００１は、バージョン２００２、モジュール名２００３、追加削除２００４、ソースファイル名２００５、コード２００６、追加削除２００７、及びキーワード２００８を含む。
【０２６５】
バージョン２００２にはプログラムのバージョンが登録される。モジュール名２００３には、追加又は削除された機能モジュールの一意な識別子が登録される。追加削除２００４には、機能モジュールが追加されたか削除されたかを示す情報が登録される。
【０２６６】
コード２００６には、追加又は削除されたｓｔｄ＿ｃｏｎｆ１８０１のコードが登録される。追加削除２００７には、ｓｔｄ＿ｃｏｎｆ１８０１のコードが追加されたか削除されたかを示す情報が登録される。キーワード２００８には、追加又は削除された機能モジュールが実現する機能のキーワードが登録される。
【０２６７】
状態差分リスト２００１のレコード２００９Ａは、機能モジュール１が基本モジュールに追加された場合のｓｔｄ＿ｃｏｎｆ１８０１の差分を示す。コード２００６には、状態Ｍｏｄ１＿１〜Ｍｏｄ１＿３が追加され、これらの状態Ｍｏｄ１＿１〜Ｍｏｄ１＿３の遷移元及び遷移先が追加される。
【０２６８】
状態差分リスト２００１のレコード２００９Ｂ及び２００９Ｃは、それぞれ機能モジュール２及び３が追加された場合のｓｔｄ＿ｃｏｎｆ１８０１の差分を示す。
【０２６９】
状態差分リスト２００１のレコード２００９Ｄは、機能モジュール１が削除された場合のｓｔｄ＿ｃｏｎｆ１８０１の差分を示す。
【０２７０】
機能モジュール１が削除される場合、機能モジュール１が提供する状態が削除されるが、機能モジュール１が提供する状態のみが遷移元となる状態（図２０に示す状態Ｍｏｄ３＿１）も削除される必要がある。
【０２７１】
ここで、機能モジュールの削除によるｓｔｄ＿ｃｏｎｆ１８０１のコードを削除するコード削除処理について説明する。
【０２７２】
まず、ユーザは、削除する機能モジュール１のキーワードをプログラム開発支援システムに入力する。ＣＰＵは、キーワードの入力を受け付けた場合、状態差分リスト２００１のキーワード２００８に登録されたキーワードが入力されたキーワードと一致するレコードのコード２００６に登録された差分（追加されたコード）を取得し、取得した差分に基づいて削除する状態を状態遷移図上に表示する（図２４参照）。
【０２７３】
図２４は、本発明の第３実施形態の削除する状態を表示した状態遷移図の説明図である。
【０２７４】
図２４に示す状態遷移図は、図２０に示す状態遷移図から機能モジュール１を削除する場合に表示される。
【０２７５】
具体的には、機能モジュール１が削除される場合に削除される状態が点線で囲まれて表示される。機能モジュール１が提供する状態である状態Ｍｏｄ１＿１及びＭｏｄ１＿２が点線２１０１で囲まれて表示され、状態Ｍｏｄ１＿３が点線２１０２で囲まれて表示される。
【０２７６】
これによって、ユーザは、機能モジュール１の削除に伴って削除される状態を把握しやすくなる。
【０２７７】
ＣＰＵは、図２４に示す状態遷移図を表示した後、ｓｔｄ＿ｃｏｎｆ１８０１の“ａｒｒｏｗ”に登録されたコードのうち、削除する状態を含むコードを削除する。これは、削除対象の機能モジュールが追加された後に、他の機能モジュールが追加され、削除対象の機能モジュールが提供する状態が他の機能モジュールが提供する状態の遷移元及び遷移先となっている場合があり、この遷移元及び遷移先を示す矢印を削除するためのものである。
【０２７８】
図２２に示すｓｔｄ＿ｃｏｎｆ１８０１では、“ａｒｒｏｗ  Ｂａｓｅ＿２  ｔｏ  Ｍｏｄ１＿１  ｗｉｔｈ  ｃｏｎｄｉｔｉｏｎ１”、“ａｒｒｏｗ  Ｍｏｄ１＿１  ｔｏ  Ｍｏｄ１＿２”、“ａｒｒｏｗ  Ｂａｓｅ＿４  ｔｏ  Ｍｏｄ１＿３  ｗｉｔｈ  ｃｏｎｄｉｔｉｏｎ２”、“ａｒｒｏｗ  Ｍｏｄ１＿３  ｔｏ  Ｂａｓｅ＿５”、“ａｒｒｏｗ  Ｍｏｄ１＿２  ｔｏ  Ｍｏｄ２＿１  ｗｉｔｈ  ｃｏｎｄｉｔｉｏｎ４”、及び、“ａｒｒｏｗ  Ｍｏｄ１＿２  ｔｏ  Ｍｏｄ３＿１  ｗｉｔｈ  ｃｏｎｄｉｔｉｏｎ５”が削除される。
【０２７９】
次に、ＣＰＵは、ｓｔｄ＿ｃｏｎｆ１８０１の“ａｒｒｏｗ”に登録されたコードのうち削除されていないコードを参照して、遷移元の状態及び遷移先の状態を取得する。そして、ＣＰＵは、取得した遷移元の状態のうち遷移先の状態にないものを特定し、特定した遷移元の状態を含むコード及び特定した状態を削除する。但し、状態遷移の開始位置である状態（本例においてはBase_1）は除外する。これは、削除対象となる状態が遷移元となり、遷移し得ない状態を削除するためのものである。
【０２８０】
図２２に示すｓｔｄ＿ｃｏｎｆ１８０１では、“ａｒｒｏｗ  Ｍｏｄ３＿１  ｔｏ  Ｂａｓｅ４”、及び“Ｍｏｄ３＿１”が削除される。
【０２８１】
このように、コード削除処理によって、削除対象となる機能モジュールが提供する状態、及び当該状態のみが遷移元となる状態が削除され、これらの状態の矢印も削除される。
【０２８２】
以上のコード削除処理によって更新されたｓｔｄ＿ｃｏｎｆ１８０１を図２５に示す。
【０２８３】
次に、ＣＰＵは、ｓｔｄ＿ｃｏｎｆ１８０１から削除したコードを図２３に示す状態差分リスト２００１に登録するため状態差分リスト２００１に新たなレコード２００９Ｄを追加する。そして、ＣＰＵは、更新されたｓｔｄ＿ｃｏｎｆ１８０１に基づいて図２６に示す状態遷移図を表示する。
【０２８４】
図２５は、本発明の第３実施形態の機能モジュール１削除後のｓｔｄ＿ｃｏｎｆ１８０１の説明図である。
【０２８５】
上述したコード削除処理によって、図２２に示すｓｔｄ＿ｃｏｎｆ１８０１から、機能モジュール１が提供する状態Ｍｏｄ１＿１〜Ｍｏｄ１＿３、及び、機能モジュール１が提供する状態Ｍｏｄ１＿２のみが遷移元となる状態Ｍｏｄ３＿１が削除される。また、これらの状態の遷移元及び遷移先を示す矢印も削除される。
【０２８６】
図２６は、本発明の第３実施形態の機能モジュール１削除後の状態遷移図の説明図である。
【０２８７】
図２６に示す状態遷移図では、図２０及び図２４に示す状態遷移図から状態Ｍｏｄ１＿１〜Ｍｏｄ１＿３、及びＭｏｄ３＿１が削除され、削除された状態に向かう矢印及び削除された状態から出る矢印も削除される。
【０２８８】
次に、機能モジュール１が基本モジュールから削除された後、機能モジュール１が基本モジュールに再度追加された場合について図２７を用いて説明する。
【０２８９】
この場合、ユーザは、追加する機能モジュールが実現する機能のキーワードをプログラム開発支援システムに入力する。
【０２９０】
ＣＰＵは、追加する機能モジュールのキーワードの入力を受け付けた場合、図２３に示す状態差分リスト２００１のレコードのうちキーワード２００８が、入力されたキーワードと一致するレコードを特定する。そして、ＣＰＵは、特定したレコードのうち、追加削除２００４に機能モジュールが削除されたことを示す情報が登録されたレコードであって、かつ、最も新しいバージョンがバージョン２００２に登録されたレコード（最新削除レコード）を特定する。
【０２９１】
そして、ＣＰＵは、特定した最新削除レコードのコード２００６に登録された差分に基づいて、現在の状態遷移図に当該差分を反映した図２７に示す状態遷移図を表示する。
【０２９２】
図２７は、本発明の第３実施形態の機能モジュール１が再度追加された場合の状態遷移図の説明図である。
【０２９３】
図２７では、ＣＰＵが、最新削除レコードに基づいて、機能モジュール１が追加された場合に追加が必要となる状態及び矢印を点線で表示する。
【０２９４】
なお、第３実施形態は、第２実施形態のプログラム開発支援システム１０１に適用することを前提にして説明したが、第１実施形態のプログラム開発支援システム１０１に適用することも可能である。
【０２９５】
この場合、図２３に示す状態差分リスト２００１のキーワード２００８は削除される。また、追加又は削除される機能モジュールを特定するためユーザは当該機能モジュールのキーワードを入力したが、当該機能モジュールの一意な識別子を入力することになる。
【０２９６】
以上のように、第３実施形態では、機能モジュールが追加又は削除される場合、当該機能モジュールの追加前後又は削除前後の状態の差分を記憶するので、機能モジュールが追加又は削除される場合、以前の差分に基づいて、機能モジュールの追加又は削除により削除される状態を事前に把握できる。
【０２９７】
また、機能モジュールが追加される場合、当該機能モジュールが以前に削除された機能モジュールであれば、当該削除時の差分に基づいて、機能モジュールが追加された場合に追加される状態を事前に把握できる。これは、例えば、機能モジュールにバグがあり当該機能モジュールを削除し、当該機能モジュールのバグを修正してから追加する場合に有用である。
【０２９８】
以上、本発明の各実施形態について説明したが、上記実施形態は本発明の適用例を示したものであり、本発明の技術的範囲を上記各実施形態の具体的構成に限定する趣旨ではない。本発明の要旨を逸脱しない範囲において種々変更可能である。
【符号の説明】
【０２９９】
１０１    プログラム開発支援システム
１０２    ソースファイル格納部
１０３    差分リスト
１０４    基本モジュール差分検出部
１０５    差分比較部
１０６    修正案作成部
１０７    プログラム修正処理部
１０８    基本関数リスト
１０９    基本関数リスト作成部
１１０    基本関数リスト比較部
１１１    入出力インタフェース部
【図１】
2012220979.tif 000003
【図２】
2012220979.tif 000004
【図３】
2012220979.tif 000005
【図４Ａ】
2012220979.tif 000006
【図４Ｂ】
2012220979.tif 000007
【図５Ａ】
2012220979.tif 000008
【図５Ｂ】
2012220979.tif 000009
【図６】
2012220979.tif 000010
【図７】
2012220979.tif 000011
【図８】
2012220979.tif 000012
【図９】
2012220979.tif 000013
【図１０Ａ】
2012220979.tif 000014
【図１０Ｂ】
2012220979.tif 000015
【図１０Ｃ】
2012220979.tif 000016
【図１１】
2012220979.tif 000017
【図１２】
2012220979.tif 000018
【図１３】
2012220979.tif 000019
【図１４】
2012220979.tif 000020
【図１５】
2012220979.tif 000021
【図１６】
2012220979.tif 000022
【図１７】
2012220979.tif 000023
【図１８】
2012220979.tif 000024
【図１９】
2012220979.tif 000025
【図２０】
2012220979.tif 000026
【図２１】
2012220979.tif 000027
【図２２】
2012220979.tif 000028
【図２３】
2012220979.tif 000029
【図２４】
2012220979.tif 000030
【図２５】
2012220979.tif 000031
【図２６】
2012220979.tif 000032
【図２７】
2012220979.tif 000033