(57)【要約】【課題】フローダイアグラムを用いたモデル開発環境におけるデザインパターンの発見を支援する。【解決手段】デザインパターン発見支援装置は、編集中のフローに関して第１ノードが選定された場合に、第２ノードの１以上の候補である１以上の第２ノード候補を提示する。第１ノードは、入力ノードと出力ノードのうちの一方の種類のノードに該当するいずれかのノードである。第２ノードは、入力ノードと出力ノードのうちの他方の種類のノードと入力ノードと出力ノードのいずれにもなれる種類のノードである入力／出力ノードとのうちのいずれかの種類に該当するノードのうちの、第１ノードに対応するノードである。当該支援装置は、１以上の第２ノード候補からいずれかの第２ノード候補が第２ノードとして選定された場合に、第１ノードと第２ノード間の部分フローの１以上の候補である１以上の部分フロー候補を提示する。【選択図】  図１
2019148859.tif 000002
【特許請求の範囲】
【請求項１】
（Ａ）フローダイアグラムを用いたモデル開発環境における編集中のフローに関して第１ノードが選定された場合に、第２ノードの１以上の候補である１以上の第２ノード候補を提示し、
前記第１ノードは、入力ノードと出力ノードのうちの一方の種類のノードに該当するいずれかのノードであり、
前記第２ノードは、入力ノードと出力ノードのうちの他方の種類のノードと入力ノードと出力ノードのいずれにもなれる種類のノードである入力／出力ノードとのうちのいずれかの種類に該当するノードのうちの、前記第１ノードに対応するノードであり、
（Ｂ）前記１以上の第２ノード候補からいずれかの第２ノード候補が第２ノードとして選定された場合に、前記第１ノードと前記第２ノード間の部分フローの１以上の候補である１以上の部分フロー候補を提示する、
ことをコンピューター装置に実行させるコンピュータープログラム。
【請求項２】
前記選定された前記第２ノードが、入力／出力ノードに該当している場合、当該第２ノードを別の第１ノードとして（Ａ）を実行する、
ことを前記コンピューター装置に実行させる請求項１に記載のコンピュータープログラム。
【請求項３】
前記１以上の第２ノード候補は、入力／出力候補スコアの降順で並び、
前記１以上の第２ノード候補の各々について、当該第２ノード候補の入力／出力候補スコアは、前記第１ノードと当該第２ノード候補とで構成されたペアのスコアであって、既存の全ての全体フローに基づくスコアであり、
前記１以上の部分フロー候補は、部分フロー候補スコアの降順で並び、
前記１以上の部分フロー候補の各々について、当該部分フロー候補の部分フロー候補スコアは、当該部分フロー候補のスコアであって、前記全ての全体フローにおいて前記第１ノードと前記第２ノードとのペアに存在する全ての部分フローのうち当該部分フロー候補に該当する部分フローに基づくスコアである、
請求項１に記載のコンピュータープログラム。
【請求項４】
前記１以上の第２ノード候補の各々について、当該第２ノード候補の入力／出力候補スコアは、前記第１ノードと当該第２ノード候補とのペアに存在する部分フローが多い程、高く、前記第１ノードと当該第２ノード候補とのペアに存在する各部分フローにおけるエッジが多い程、低い傾向にある、
請求項３に記載のコンピュータープログラム。
【請求項５】
前記１以上の部分フロー候補の各々について、当該部分フロー候補の部分フロー候補スコアは、前記第１ノードと当該第２ノード候補とのペアに存在する部分フローのうち当該部分フロー候補と類似する部分フローである類似部分フローが多い程、高く、各類似部分フローの類似度が高い程、高い傾向にある、
請求項３に記載のコンピュータープログラム。
【請求項６】
前記１以上の第２ノード候補の各々について、当該第２ノード候補の入力／出力候補スコアは、前記第１ノードと当該第２ノード候補とのペアを含んだ全体フローに関連付けられている全体フロータグのうち、前記編集中のフローの処理の種類を示すタグと一致する全体フロータグが多い程、高い傾向にあり、
各全体フローについて、当該全体フローに関連付けられている全体フロータグは、当該全体フローの処理の種類を示す、
請求項３に記載のコンピュータープログラム。
【請求項７】
前記１以上の部分フロー候補の各々について、当該部分フロー候補の部分フロー候補スコアは、前記第１ノードと前記第２ノードとのペアにおける当該部分ブロー候補を含んだ全体フローに関連付けられている全体フロータグのうち、前記編集中のフローの処理の種類を示すタグと一致する全体フロータグが多い程、高い傾向にあり、
各全体フローについて、当該全体フローに関連付けられている全体フロータグは、当該全体フローの処理の種類を示す、
請求項３に記載のコンピュータープログラム。
【請求項８】
（Ａ）では、前記１以上の第２ノード候補のうちのタグ一致第２ノード候補が強調表示され、
前記タグ一致第２ノード候補は、前記編集中のフローの処理の種類を示すタグと一致する全体フロータグが関連付けられている全体フローに含まれているペアを構成する第２ノード候補であって、前記第１ノードとのペアを構成する第２ノード候補であり、
各全体フローについて、当該全体フローに関連付けられている全体フロータグは、当該全体フローの処理の種類を示す、
請求項１に記載のコンピュータープログラム。
【請求項９】
（Ｂ）では、前記１以上の部分フロー候補のうちのタグ一致部分フロー候補が強調表示され、
前記タグ一致部分フロー候補は、前記編集中のフローの処理の種類を示すタグと一致する全体フロータグが関連付けられている全体フローに含まれている部分フローであり、
各全体フローについて、当該全体フローに関連付けられている全体フロータグは、当該全体フローの処理の種類を示す、
請求項１に記載のコンピュータープログラム。
【請求項１０】
前記全ての全体フローを読み込み、
前記全ての全体フローの各々について、
入力ノードと出力ノードのペアを探索し、
探索された各ペアについて、
当該ペアに存在する部分フローを検出し、
検出された各部分フローについて、
当該ペアにおける全別の部分フローから、各別の部分フローとの類似度を基に、類似部分フローを検出し、
各類似部分フローの類似度を基に、部分フロースコアを算出し、
当該ペアにおける各部分フローを基に、当該ペアの入力／出力スコアを算出する、
を前記コンピューター装置に実行させ、
前記１以上の第２ノード候補の各々について、当該第２ノード候補の入力／出力候補スコアは、前記第１ノードと当該第２ノード候補とで構成されたペアの入力／出力スコアに従うスコアであり、
前記１以上の部分フロー候補の各々について、当該部分フロー候補の部分フロー候補スコアは、当該部分フロー候補の部分フロースコアに従うスコアである、
請求項３に記載のコンピュータープログラム。
【請求項１１】
インターフェース部と、
前記インターフェース部に接続されたプロセッサ部と
を有し、
前記プロセッサ部は、
（Ａ）フローダイアグラムを用いたモデル開発環境における編集中のフローに関して第１ノードが前記インターフェース部を介して選定された場合に、第２ノードの１以上の候補である１以上の第２ノード候補を前記インターフェース部を介して提示し、
前記第１ノードは、入力ノードと出力ノードのうちの一方の種類のノードに該当するいずれかのノードであり、
前記第２ノードは、入力ノードと出力ノードのうちの他方の種類のノードと入力ノードと出力ノードのいずれにもなれる種類のノードである入力／出力ノードとのうちのいずれかの種類に該当するノードのうちの、前記第１ノードに対応するノードであり、
（Ｂ）前記１以上の第２ノード候補からいずれかの第２ノード候補が第２ノードとして前記インターフェース部を介して選定された場合に、前記第１ノードと前記第２ノード間の部分フローの１以上の候補である１以上の部分フロー候補を前記インターフェース部を介して提示する、
デザインパターン発見支援装置。
【請求項１２】
（Ａ）フローダイアグラムを用いたモデル開発環境における編集中のフローに関して第１ノードが選定された場合に、第２ノードの１以上の候補である１以上の第２ノード候補を提示し、
前記第１ノードは、入力ノードと出力ノードのうちの一方の種類のノードに該当するいずれかのノードであり、
前記第２ノードは、入力ノードと出力ノードのうちの他方の種類のノードと入力ノードと出力ノードのいずれにもなれる種類のノードである入力／出力ノードとのうちのいずれかの種類に該当するノードのうちの、前記第１ノードに対応するノードであり、
（Ｂ）前記１以上の第２ノード候補からいずれかの第２ノード候補が第２ノードとして選定された場合に、前記第１ノードと前記第２ノード間の部分フローの１以上の候補である１以上の部分フロー候補を提示する、
デザインパターン発見支援方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、概して、フローダイアグラムを用いたモデル開発環境におけるソフトウェア開発を支援する技術に関する。
【背景技術】
【０００２】
ソフトウェアの開発において、ソースコードを記述することなく、モデル図を記述することにより動作するソフトウェアを開発できるモデル開発環境が存在する。例えば、HTTP通信やデータベースとの接続などをフローダイアグラムによって記述して実行できるNode-RED（https://nodered.org/）、信号処理や制御ロジックをブロックダイアグラムとして記述し、実行可能なソースコードを生成することのできるMathWorks社のSimuLink（商標）、といったモデル開発環境が存在する。このようなモデル開発環境では、ソフトウェアの構成要素や処理単位がノードであり、ノード同士がエッジで接続される。
【０００３】
ノードとエッジは有向グラフにおける用語であり、Node-REDにおけるフローダイアグラムもSimuLinkにおけるブロックダイアグラムも有向グラフとして捉えることができる。本明細書において、フローダイアグラムとブロックダイアグラムと有向グラフは同義とし、フローダイアグラムは単に「フロー」と呼ぶことができ、「フロー」と「グラフ」は同義とする。あるグラフの一部を「部分グラフ」と呼ぶが、同様に、あるフローの一部を「部分フロー」と呼ぶ。そして、部分フローに対して、フローの一部分ではなく全体を表す用語として、「全体フロー」という用語を用いる。
【０００４】
また、ソースコードの記述方法においては、「デザインパターン」と呼ばれる定石が存在する。デザインパターンに沿ったソースコードは、そうでないソースコード（例えば、デザインパターンとしての価値の無い単なる部分フロー（または全体フロー）のソースコード）よりも保守性が高いため、ソフトウェアの品質と開発の生産性に寄与する。モデル開発環境におけるフローダイアグラムの記述においても、同様にデザインパターンが存在する。例えば、Node-REDにおいて、HTTPリクエストをHTTP-inノードで受け付けた後、HTTPリクエストに含まれるボディとクエリーを抽出する処理をfunctionノードで実装し、抽出したデータを他のノードに送り、最終的にHTTP-outノードでHTTPリクエストの応答を返すといった一連の処理は汎用的であり、デザインパターンに該当する。開発者は、デザインパターンに沿って開発することにより、開発するソフトウェアの品質や開発効率が向上することが期待できる。
【０００５】
有向グラフにおける技術として、変更前後のブロックダイアグラム同士の差分を容易に確認することのできる技術（特許文献１）と、同一の部分グラフまたは類似した部分グラフを、部分グラフ同士の類似度を算出しながら効率的に検出することのできる技術（特許文献２）が存在する。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２０１６−１７７６６７号公報
【特許文献２】特開２０１７−０９７６９８号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
フローダイアグラムは有向グラフであるため、フローダイアグラムにおけるデザインパターンを発見するために、特許文献１または特許文献２における技術を利用することが考えられる。デザインパターンを発見することができれば、ソフトウェア開発に関し開発者の負担を低減することが期待できる。
【０００８】
しかし、フローダイアグラムを用いたモデル開発環境におけるノードには、複数の種類がある。具体的には、例えば、フローダイアグラムで記述されたシステムの外部からの入力を受け付けるノード（入力ノード）、そのフローダイアグラムで記述されたシステムの外部に出力するノード（出力ノード）、どちらも行うノード（入力ノードにも出力ノードにもなれるノードである入力／出力ノード）がある。入力ノード、出力ノードおよび入力／出力ノード以外の種類のノードとして、例えば、さらに、条件分岐を行うノード、処理を遅らせるノード、１つのデータを複数のノードに出力するノードなどの制御用のノード、数値演算を行うノードが存在する。
【０００９】
よって、特許文献１および２における技術でデザインパターンを発見しようとすると、入力ノードが含まれた部分フロー、出力ノードが含まれた部分フロー、入力と出力の両方を行うノードが含まれた部分フロー、条件分岐を行うノードが含まれた部分フロー、数値演算を行うノードが含まれた部分フローなどが雑多に含まれる結果となり得る。この結果の中には、デザインパターンとして相応しい有用な部分フローも含まれ得るが、そうではないものも多く含まれてしまう可能性が高い。例えば、条件分岐を行うノードと処理を遅らせるノードを組み合わせた部分フローが複数見つかった場合、それがどのような入力ノードや出力ノードに対して実行されるフローなのかがわからなければ、開発者はその部分フローを活用しづらい。また、既存のフローダイアグラム群から部分フローの出現頻度を調べるだけでは、開発者が開発しようとしている処理の種類が考慮されていないため、参考するに相応しい部分フローを探すのに時間がかかってしまう。処理の種類とは、例えば、HTTPリクエストの受付、データベースの利用、モーターの制御、音声信号処理などが該当する。開発者が開発しようとしている処理の種類に合致しない部分フローが提示されたとき、開発者はそれらの部分フローを活用しづらい。
【００１０】
本発明は、このような問題に鑑みてなされたもので、フローダイアグラムを用いたモデル開発環境における有用なデザインパターンの発見を支援することを目的とする。
【課題を解決するための手段】
【００１１】
デザインパターン発見支援装置は、フローダイアグラムを用いたモデル開発環境における編集中のフローに関して第１ノードが選定された場合に、第２ノードの１以上の候補である１以上の第２ノード候補を提示する。第１ノードは、入力ノードと出力ノードのうちの一方の種類のノードに該当するいずれかのノードである。第２ノードは、入力ノードと出力ノードのうちの他方の種類のノードと入力ノードと出力ノードのいずれにもなれる種類のノードである入力／出力ノードとのうちのいずれかの種類に該当するノードのうちの、第１ノードに対応するノードである。当該支援装置は、１以上の第２ノード候補からいずれかの第２ノード候補が第２ノードとして選定された場合に、第１ノードと第２ノード間の部分フローの１以上の候補である１以上の部分フロー候補を提示する。
【発明の効果】
【００１２】
本発明により、第１ノードが選定された場合に、１以上の第２ノード候補が提示され、いずれかの第２ノード候補が選定された場合に、２ノード間の１以上の部分フロー候補が提示される。このため、フローダイアグラムを用いたモデル開発環境において、デザインパターンと呼ぶに相応しい有用なものを効率的に発見することができ、以って、開発効率が向上する。
【図面の簡単な説明】
【００１３】
【図１】本発明の一実施例に係るデザインパターン発見支援装置（以下、支援装置）を含むシステム全体の構成を示す図である。
【図２】支援装置が行う一連の処理を示す図である。
【図３】部分フロースコアテーブルの一例を示す図である。
【図４】入力／出力スコアテーブルの一例を示す図である。
【図５】全体フローの一例を示す図である。
【図６】探索ノードテーブルの一例を示す図である。
【図７】探索開始／終了ペアテーブルの一例を示す図である。
【図８】処理Aの一例を示す図である。
【図９】ペア（A->B）用の部分フロースコアテーブル（処理Bの前）の一例を示す図である。
【図１０】ペア（A->C）用の部分フロースコアテーブル（処理Bの前）の一例を示す図である。
【図１１】ペア（B, B, C->X）用の部分フロースコアテーブル（処理Bの前）の一例を示す図である。
【図１２】ペア（A, A, A->X）用の部分フロースコアテーブル（処理Bの前）の一例を示す図である。
【図１３】ペア（B, B, C->X, Y）用の部分フロースコアテーブル（処理Bの前）の一例を示す図である。
【図１４】ペア（A, A, A->X, Y）用の部分フロースコアテーブル（処理Bの前）の一例を示す図である。
【図１５】処理Bの一例を示す図である。
【図１６】処理Cの一例を示す図である。
【図１７】エッジ係数テーブルの一例を示す図である。
【図１８】ペア（A->B）用の部分フロースコアテーブル（処理Bの後）の一例を示す図である。
【図１９】ペア（A->C）用の部分フロースコアテーブル（処理Bの後）の一例を示す図である。
【図２０】ペア（B, B, C->X）用の部分フロースコアテーブル（処理Bの後）の一例を示す図である。
【図２１】ペア（A, A, A->X）用の部分フロースコアテーブル（処理Bの後）の一例を示す図である。
【図２２】ペア（B, B, C->X, Y）用の部分フロースコアテーブル（処理Bの後）の一例を示す図である。
【図２３】ペア（A, A, A->X, Y）用の部分フロースコアテーブル（処理Bの後）の一例を示す図である。
【図２４】候補提示の遷移の典型例を説明する図である。
【図２５】図２４の候補提示の遷移に対応したシーケンス図である。
【図２６】タグ係数テーブルの一例を示す図である。
【発明を実施するための形態】
【００１４】
以下の説明では、「インターフェース部」は、１以上のインターフェースでよい。当該１以上のインターフェースは、ユーザインターフェース部と、通信インターフェース部とのうちの少なくとも通信インターフェース部を含んでよい。ユーザインターフェース部は、１以上のＩ／Ｏデバイス（例えば入力デバイス（例えばキーボード及びポインティングデバイス）と出力デバイス（例えば表示デバイス））と表示用計算機とのうちの少なくとも１つのＩ／Ｏデバイスでもよいし、それに代えて又は加えて、当該少なくとも１つのＩ／Ｏデバイスに対するインターフェースデバイスでもよい。通信インターフェース部は、１以上の通信インターフェースデバイスでよい。１以上の通信インターフェースデバイスは、１以上の同種の通信インターフェースデバイス（例えば１以上のＮＩＣ（Network Interface Card））であってもよいし２以上の異種の通信インターフェースデバイス（例えばＮＩＣとＨＢＡ（Host Bus Adapter））であってもよい。
【００１５】
また、以下の説明では、「メモリ部」は、１以上のメモリであり、典型的には主記憶デバイスでよい。メモリ部における少なくとも１つのメモリは、揮発性メモリであってもよいし不揮発性メモリであってもよい。
【００１６】
また、以下の説明では、「ＰＤＥＶ部」は、１以上のＰＤＥＶであり、典型的には補助記憶デバイスでよい。「ＰＤＥＶ」は、物理的な記憶デバイス（Physical storage DEVice）を意味し、典型的には、不揮発性の記憶デバイス、例えばＨＤＤ（Hard Disk Drive）またはＳＳＤ（Solid State Drive）である。
【００１７】
また、以下の説明では、「記憶部」は、メモリ部およびＰＤＥＶ部のうちの少なくとも１つ（典型的には少なくともメモリ部）である。
【００１８】
また、以下の説明では、「プロセッサ部」は、１以上のプロセッサである。少なくとも１つのプロセッサは、典型的には、ＣＰＵ（Central Processing Unit）のようなマイクロプロセッサであるが、ＧＰＵ（Graphics Processing Unit）のような他種のプロセッサでもよい。少なくとも１つのプロセッサは、シングルコアでもよいしマルチコアでもよい。少なくとも１つのプロセッサは、処理の一部または全部を行うハードウェア回路（例えばＦＰＧＡ（Field-Programmable Gate Array）またはＡＳＩＣ（Application Specific Integrated Circuit））といった広義のプロセッサでもよい。
【００１９】
また、以下の説明では、「ｋｋｋ部」（インターフェース部、記憶部およびプロセッサ部を除く）の表現にて機能を説明することがあるが、機能は、１以上のコンピュータープログラムがプロセッサ部によって実行されることで実現されてもよいし、１以上のハードウェア回路によって実現されてもよい。プログラムがプロセッサ部によって実行されることで機能が実現される場合、定められた処理が、適宜に記憶部および／または通信インターフェース部等を用いながら行われるため、機能はプロセッサ部の少なくとも一部とされてもよい。機能を主語として説明された処理は、プロセッサ部あるいはそのプロセッサ部を有する装置が行う処理としてもよい。プログラムは、プログラムソースからインストールされてもよい。プログラムソースは、例えば、プログラム配布計算機または計算機が読み取り可能な記録媒体（例えば非一時的な記録媒体）であってもよい。各機能の説明は一例であり、複数の機能が１つの機能にまとめられたり、１つの機能が複数の機能に分割されたりしてもよい。
【００２０】
また、以下の説明では、「ｘｘｘテーブル」といった表現にて、入力に対して出力が得られる構造体を説明することがあるが、構造体は、どのような構造のデータでもよいし、入力に対する出力を発生するニューラルネットワークのような学習モデルでもよい。従って、「ｘｘｘテーブル」を「ｘｘｘ構造体」と言うことができる。また、以下の説明において、各テーブルの構成は一例であり、１つのテーブルは、２以上のテーブルに分割されてもよいし、２以上のテーブルの全部または一部が１つのテーブルであってもよい。
【００２１】
また、以下の説明では、同種の要素を区別しないで説明する場合には、参照符号を使用し、同種の要素を区別して説明する場合は、要素のＩＤを使用することがある。例えば、ノードを特に区別しないで説明する場合には、「ノード５０１」と記載し、個々のノードを区別して説明する場合には、「ノードA」、「ノードB」のように記載することがある。
【００２２】
また、以下の説明では、「データセット」とは、アプリケーションプログラムのようなプログラムから見た１つの論理的な電子データの塊であり、例えば、レコード、ファイル、キーバリューペアおよびタプルのうちのいずれでもよい。
【００２３】
本発明の一実施例を説明する。
【００２４】
まず、図１は、本発明の一実施例に係るデザインパターン発見支援装置（以下、支援装置）１００を含むシステム全体の構成図である。
【００２５】
支援装置１００は、フローダイアグラムを用いたモデル開発環境におけるデザインパターンの発見を支援する装置である。支援装置１００を含むシステム全体において、開発環境サーバー装置２００およびリポジトリサーバー装置３００が存在する。装置１００、２００および３００の各々は、１以上のコンピューターであるコンピューター装置である。開発者は、開発環境サーバー装置２００上で実行されるソフトウェアであるフローダイアグラムを用いたモデル開発環境２０１を用いて開発を行う。開発したフローは、ファイル（データセットの一例）として扱われ、リポジトリサーバー装置３００内に存在するソフトウェアであるフロー保存用リポジトリ３０１に保存される。
【００２６】
支援装置１００は、フロー保存用リポジトリ３０１に保存されている複数のフローのファイルを読み込む。本実施例では、フロー保存用リポジトリ３０１に保存されているフロー、およびフロー保存用リポジトリ３０１から読み込んだフローのことを「全体フロー」と呼び、部分フローと明確に区別する。
【００２７】
図１のように、支援装置１００、開発環境サーバー装置２００およびリポジトリサーバー装置３００は、例えばインターネットのような通信ネットワークを介して互いに通信する。装置１００、２００および３００は、別々の装置であってもよいし、装置１００、２００および３００のうちの２以上の装置が、１つのコンピューター装置として、その中に、後述の機能１０１、１０２、１０３、１０４、１０５、２０１および３０１のうちの少なくとも一部の機能を内包する構成としてもよい。機能１０１、１０２、１０３、１０４、１０５、２０１および３０１は、例えば、１以上のコンピュータープログラムがプロセッサ部によって実行されることで実現されてよい。
【００２８】
本実施例の実装として、支援装置１００は、インターフェース部１１１、記憶部１１２およびそれらに接続されたプロセッサ部１１３を有し、プロセッサ部１１３が、記憶部１１２に格納されているコンピュータープログラム（例えばデザインパターン発見支援プログラム）を実行することで、機能１５０（機能１０１、１０２、１０３、１０４および１０５）が、Webアプリケーションとされ、フローダイアグラムを用いたモデル開発環境２０１が、モデル開発環境を提供する既存のシステム（例えばNode-RED）であって、フロー保存用リポジトリ３０１が、既存のシステム（例えば、Git（登録商標）のようなバージョン管理システム）とすることが挙げられる。
【００２９】
支援装置１００は、機能として、デザインパターンの発見を支援するデザインパターン発見支援部（以下、支援部）１５０を有する。支援部１５０は、入力／出力スコアを算出する入力／出力スコア算出部１０１、部分フロースコアを算出する部分フロースコア算出部１０２、部分フローを検出する部分フロー検出部１０３、部分フロー類似度（以下、類似度）を算出する部分フロー類似度算出部１０４、および、ノードや部分フローの候補を提供する候補提供部１０５を有する。
【００３０】
支援装置１００は、後述する探索ノードテーブル、タグ係数テーブル、エッジ係数テーブルに記録する情報および類似度の閾値を任意のコンピューター装置４００から受け取り、登録する。
【００３１】
支援装置１００は、フロー保存用リポジトリ３０１に保存されている複数の全体フローを読み込み、処理を行うことにより、フローダイアグラムを用いたモデル開発環境における有用なデザインパターンの発見を支援する。
【００３２】
図２は、支援装置１００が行う一連の処理を示す。
【００３３】
当該一連の処理において、部分フロースコアテーブル３２０（例えば図３参照）および入力／出力スコアテーブル４２０（例えば図４参照）といったテーブルが作成される。
【００３４】
部分フロースコアテーブル３２０は、ある起点となるノードと終点となるノードとの間にある部分フローに関する情報を格納するテーブルであり、起点となるノードと終点となるノードとのペアである起点／終点ペアごとに存在する。例えば、図３は、起点となるノードAと終点となるノードBとの起点／終点ペアに対する部分フロースコアテーブルである。当該テーブルによれば、当該ペアについて、４つの部分フローが存在する。部分フロースコアテーブル３２０は、部分フローIDカラム３１１、部分フロー情報カラム３１２、全体フローIDカラム３１３、全体フロータグカラム３１４、類似部分フローIDカラム３１５、エッジ数カラム３１６および部分フロースコアカラム３１７を有する。部分フローIDカラム３１１とは、部分フローのIDが記録されるカラムである。部分フロー情報カラム３１２とは、部分フローそのものの情報が記録されるカラムである。全体フローIDカラム３１３とは、その部分フローを抽出する情報源である全体フローのIDが記録されるカラムである。全体フロータグカラム３１４とは、その全体フローのタグ（以下、全体フロータグ）を示す情報を扱うカラムである。「全体フロータグ」とは、具体的には、先述したHTTPリクエストの受付、データベースの利用、モーターの制御、音声信号処理などのような処理の種類である。類似部分フローIDカラム３１５とは、部分フローと類似する部分フローのIDが記録されるカラムである。エッジ数カラム３１６とは、その部分フローのエッジ数を記録するカラムである。部分フロースコアカラム３１７とは、その部分フロースコアテーブル３２０における起点となるノードと終点となるノードとの間の部分フローのうち、どれをデザインパターンとして優先的に提示するかを決めるためのスコア（部分フロースコア）を記録するカラムである。部分フロースコアテーブル３２０は、記憶部１１２に格納される。
【００３５】
入力／出力スコアテーブル４２０とは、起点となるノードと終点となるノードとの起点／終点ペアに関する情報を格納するテーブルである。例えば、図４に例示の入力／出力スコアテーブル４２０には、６つの起点／終点ペアに関する情報が記録されている。入力／出力スコアテーブル４２０は、ペアIDカラム４１１、ペアカラム４１２および入力／出力スコアカラム４１３を有する。ノードのペアにはIDが存在し、起点／終点ペアのIDが、ペアIDカラム４１１に記録される。ペアカラム４１２には、起点ノードのIDと終点ノードのIDが記録される。起点／終点ペアを構成する起点ノードおよび終点ノードのいずれも、１つとは限らない。例えば、ペアID“５”の起点／終点ペアでは、２つのノードBおよびノードCが起点ノードであり、２つのノードXおよびノードYが終点ノードである。入力／出力スコアカラム４１３は、ノードペアごとに算出されるスコア（入力／出力スコア）を記録するものである。入力／出力スコアテーブル４２０は、記憶部１１２に格納される。
【００３６】
以下、図２に示す処理の詳細を説明する。
【００３７】
部分フロー検出部１０３は、ステップＳ１０１にて、フロー保存用リポジトリ３０１から全体フロー群（例えば、フロー保存用リポジトリ３０１に格納されている全ファイル）を取得する。ステップＳ１０２にて、部分フロー検出部１０３は、１つでも全体フローを取得できたか（取得できたファイルが１つでもあるか）を判定する。ステップＳ１０２の判定結果がtrueであれば、部分フロー検出部１０３は、ステップＳ１０３にて、図２の一連の処理において未選択の全体フローのうちのいずれか１つの全体フローを選択し、処理がステップＳ１０４に進む。ステップＳ１０２の判定結果がfalseであれば、部分フロー検出部１０３は、当該一連の処理を終了する。
【００３８】
以下、図５に示す２つの全体フロー１および２が取得できた場合を例に取り、図２の処理を説明する。なお、全体フローｎとは、全体フローIDが“ｎ”の全体フローである。全体フローは、複数のノード５０１と１以上のエッジ５０２を含む。
【００３９】
ステップＳ１０４では、部分フロー検出部１０３は、選択全体フロー（ステップＳ１０３にて選択した全体フロー）の中に、探索開始／終了ペアが存在するかを判定する。「探索開始／終了ペア」とは、全体フローを探索する際の探索を開始するノードと探索を終了するノードとのペアのことである。探索開始／終了ペアは、探索ノードテーブル６２０（図６参照）に基づいて決定される。探索ノードテーブル６２０は、探索開始ノード（探索を開始するノード）のIDが記録されるカラム（開始のみカラム）６１１、探索終了ノード（探索を終了するノード）のIDが記録されるカラム（終了のみカラム）６１２、探索開始／終了ノード（探索開始ノードと探索終了ノードの両方に該当するノード）のIDが記録されるカラム（開始／終了両方カラム）６１３、および、探索開始ノードおよび探索終了ノードのどれにも該当しないノードのIDが記録される（除外カラム）６１４を有する。探索ノードテーブル６２０における各情報は、図１における任意のコンピューター装置４００からあらかじめ登録された情報である。なお、カラム６１１から６１３に記録されたID以外のIDを有するノードは、探索開始ノードおよび探索終了ノードのどれにも該当しないノードとみなすことができるため、除外カラム６１４は無くてもよい。また、探索開始ノードは、入力ノードに相当し、探索終了ノードは、出力ノードに相当し、探索開始／終了ノードは、入力／出力ノードに相当する。
【００４０】
図５の全体フローと図６の探索ノードテーブル６２０から、探索開始ノード群は{A, B, C}（ノードA、BおよびC）であり、探索終了ノード群は{X, Y, B, C}であり、除外ノードは{a, b, c, d, e}であることがわかる。選択全体フローが図５の全体フロー１であれば、図５の全体フロー１は、探索開始ノード群のノードと探索終了ノード群のノードの両方を含むので（すなわち、全体フロー１のいずれの先頭ノードも、探索開始ノードAであり、全体フロー１の末尾ノードが、探索終了ノードXであるので）、ステップＳ１０４の判定結果がtrueであり、処理がステップＳ１０５へ進む。もし、選択全体フローについて、ステップＳ１０４の判定条件に合致しない場合は、処理がステップＳ１１０へ進む。
【００４１】
ステップＳ１０５では、部分フロー検出部１０３は、選択全体フローについて、探索開始ノード群にあるノードから探索終了ノード群にあるノードへの経路を探索する。図５の全体フロー１に対して図６の探索ノードテーブル６２０をもとに探索すると、ノードAからノードBに至る経路が３つ、ノードAからノードCに至る経路が１つ、ノードBからノードXに至る経路が２つ、ノードCからノードXに至る経路が１つ、ノードAからノードXに至る経路が３つ発見される。ノードAからノードBに至る経路については、部分フロー検出部１０３は、入力／出力スコアテーブル４２０をもとに、入力ノードをノードA、出力ノードをノードBとした起点／終点ペアがあると判定できる。そして、ステップＳ１０６では、部分フロー検出部１０３は、探索開始／終了ペアテーブル７２０（図７参照）に、全体フローに対してどのような探索開始／終了ペアが存在するかを登録する。探索開始／終了ペアテーブル７２０は、全体フローIDが記録されるカラム（全体フローIDカラム）７１１、および、探索開始／終了ペアの情報が記録されるカラム（探索開始／終了ペアカラム）７１２を有する。例えば、部分フロー検出部１０３は、全体フロー１について、ノードAからノードBに至る経路が存在するので“（A->B）”を探索開始／終了ペアカラム７１２に登録し、更に、ノードAからノードCに至る経路が存在するので“（A->C）”を探索開始／終了ペアカラム７１２に登録する。
【００４２】
ただし、ノードBからノードXに至る経路、ノードCからノードXに至る経路、ノードAからノードXに至る経路については、部分フロー検出部１０３は、“（B->X）”、“（C->X）”および“（A->X）”を探索開始／終了ペアカラム７１２に登録するわけではない。例えば、ノードBからノードXへの経路上のノードeには、着目している探索ノードBに接続されている入力エッジ（着目入力エッジ）以外からの入力エッジが存在する。ノードXには、１つのノードBから出力されたデータだけが流れるわけではなく、２つのノードBと１つのノードCである３つのノードから出力されたデータが流れる。この場合、部分フロー検出部１０３は、ノードBからノードXに至る経路に対する探索開始／終了ペアは、“（B, B, C->X）とする。このように、着目している探索開始ノードと着目している探索終了ノードの間にある部分フロー中のノードに、着目している探索ノードに接続されている着目入力エッジ以外からの入力エッジが存在する場合、部分フロー検出部１０３は、その着目入力エッジ以外の各入力エッジから、探索ノードテーブル６２０をもとに、探索開始ノードまたは探索開始／終了両方ノードに該当するノードに辿りつくまで遡り、見つかったノードを、着目している探索開始ノードに加える（つまり、着目している探索開始ノードのIDと見つかったノードのIDとを探索開始ノードのIDとしてカラム７１２に登録する）。
【００４３】
そして、ステップＳ１０７では、部分フロー検出部１０３は、全体フロー１について探索開始／終了ペアテーブル７２０から未探索の探索開始／終了ペアのうちのいずれか１つの探索開始／終了ペア（例えば（A->B））を選択し、処理が、処理A（図８のステップＳ２０１）に進む。処理Aを図８が示す。ステップＳ２０１では、部分フロースコア算出部１０２は、既に選択ペア（ステップＳ１０７で選択された探索開始／終了ペア）の部分フロースコアテーブル３２０が存在するかを判定する。ステップＳ２０１の判定結果がfalseの場合は、ステップＳ２０２にて、部分フロースコア算出部１０２は、選択ペア（A->B）用の部分フロースコアテーブル３２０を新規に作成し、ステップＳ２０４における記録対象をそのテーブル３２０とする。ステップＳ２０１の判定結果がtrueの場合は、ステップＳ２０３にて、部分フロースコア算出部１０２は、ステップＳ２０４における記録対象を既に存在する“（A->B）”用の部分フロースコアテーブル３２０とする。
【００４４】
ステップＳ２０４では、部分フロースコア算出部１０２は、選択ペアを構成するノード間の部分フローを探索し、記録対象の部分フロースコアテーブル３２０の部分フロー情報カラム３１２、全体フローIDカラム３１３、全体フロータグカラム３１４およびエッジ数カラム３１６に情報を追加する。部分フローの探索方法は、特許文献２に記載の方法など、既存の方法でよい。例えば、図５の全体フロー１から、選択ペア（A->B）を構成するノードAおよびB間の部分フローを探索すると、部分フロースコア算出部１０２は、図９中の部分フローIDカラム３１１における“A_B_1”および“A_B_2”の各々について、部分フロー情報カラム３１２、全体フローIDカラム３１３、全体フロータグカラム３１４およびエッジ数カラム３１６に追加されるべき情報を得られる。
【００４５】
処理Aが終了すると、図２のステップＳ１０８に処理が進む。ステップＳ１０８では、部分フロー検出部１０３は、探索開始／終了ペアテーブル７２０に未探索の探索開始／終了ペアが存在するかを判定する。図７において、全体フロー１について、探索開始／終了ペア（A->B）の探索が終了している場合、探索開始／終了ペア（A->C）が未探索であるため、ステップＳ１０８の判定結果がtrueであり、ステップＳ１０９にて、部分フロー検出部１０３は、探索開始／終了ペア（A->C）を選択する。当該ペア（A->C）について、処理Aが実行される。このようにして、ある全体フローにおける各探索開始／終了ペアについて処理Aが実行され、当該各探索開始／終了ペアについて、部分フロースコアテーブル３２０が作成される（既にその探索開始／終了ペアについて部分スコアテーブル３２０があれば更新される）。全ての探索開始／終了ペアについて処理Aが実行された場合、ステップＳ１０８の判定結果がfalseであり、処理がステップＳ１１０へ進む。
【００４６】
ステップＳ１１０では、部分フロー検出部１０３は、ステップＳ１０４からステップＳ１０８に至る探索を行っていない全体フローが存在するかを判定する。ステップＳ１１０の判定結果がtrueの場合は、処理がステップＳ１１１に進む。図５のように全体フロー１の次に全体フロー２が存在する場合は、ステップＳ１１１にて、部分フロー検出部１０３は、全体フロー２を選択する。
【００４７】
このようにして、全体フロー１および全体フロー２のそれぞれについてステップＳ１０３かあらステップＳ１１１が行われ、結果として、図９から図１４に示す部分フロースコアテーブル３２０が作成（または更新）される。この時点では、図９から図１４に示す通り、まだ、類似部分フローIDカラム３１５と部分フロースコアカラム３１７に登録される情報は得られていない。
【００４８】
ステップＳ１１０の判定結果がfalseの後、処理B（図１５のステップＳ３０１）が実行される。処理Bを図１５が示す。ステップＳ３０１では、部分フロースコア算出部１０２は、作成（または更新）された部分フロースコアテーブル３２０（例えば、図９から図１４に示す部分フロースコアテーブル３２０）の未選択の部分フロースコアテーブル３２０のうちのいずれか１つの部分フロースコアテーブル３２０を選択する。ここでは最初にペア（A->B）用の部分フロースコアテーブル３２０（図９参照）が選択されたとする。そして、ステップＳ３０２では、部分フロー類似度算出部１０４は、選択部分フロースコアテーブル３２０（ステップＳ３０１にて選択した部分フロースコアテーブル３２０）に存在する部分フロー同士で類似する部分フローを検出し、類似部分フローIDカラム３１７に、類似する部分フローのIDを記録する。具体的には、例えば、部分フロー類似度算出部１０４は、選択部分フロースコアテーブル３２０に存在する各部分フローについて、選択部分フロースコアテーブル３２０に存在する別の部分フロー毎に、当該別の部分フローの類似度を算出し、当該類似度が閾値未満か否かに応じて、当該別の部分フローを類似部分フローとするか否かを決定する。図９に示すペア（A->B）用の部分フロースコアテーブル３２０によれば、部分フローA_B_1と部分フローA_B_3は一致しているため、それらの部分フローは互いに類似していると判定できる。また、部分フローA_B_2は部分フローA_B_1にノードcを１つ加えたものであるため、それらの部分フローも互いに類似していると判定できる。いずれの部分フローといずれの部分フローが類似しているかを判定する方法は、既存の方法（例えば、特許文献２の方法、または特許文献１と２の方法を組み合わせた方法）でよい。ただし、類似度（部分フローの類似度）は、完全一致する場合を“１”とし、０以上１以下の値をとるものとする。また、ある部分フロー同士が類似しているか否かを決定する類似度の閾値は（つまり、本実施例では、ある部分フローとの類似度が閾値以上の部分フローが当該ある部分フローについての類似部分フローである）、あらかじめ図１における任意のコンピューター装置４００から設定されている。類似度の閾値（例えば０．３）未満の類似度は切り捨てて０とみなされ、結果として、類似度が閾値未満の部分フローは、類似部分フローとは判定されない。
【００４９】
ステップＳ３０３では、部分フロースコア算出部１０２は、選択部分フロースコアテーブル３２０中の各部分フローについて、部分フロースコアを算出し、算出した部分フロースコアを部分フロースコアカラム３１７に記録する。各部分フローについて、当該部分フローの部分フロースコアの算出式は、当該部分フローの類似部分フローの類似度の和に“１”を加えた値とする。例えば、部分フローA_B_1の部分フロースコアは、（部分フローA_B_1と部分フローA_B_2の類似度）＋（部分フローA_B_1と部分フローA_B_3の類似度）＋（部分フローA_B_1と部分フローA_B_4の類似度）＋１である。また、２つの部分フロー同士の類似度Ｋを、片方の部分フローにノードまたはエッジを１つ加えるまたは減らす操作を行ってもう片方の部分フローと同一の部分フローとなるまでの操作数をｘとしたときに、Ｋ＝１−０．１ｘ（ただし１−０．１ｘが負となる場合にＫ＝０とする）と定義した場合、ペア（A->B）用の部分フロースコアテーブル３２０における部分フロースコアは、図１８のようになる。このように、本実施例では、各部分フローについて、部分フロースコアは、類似部分フローが多い程高く、各類似部分フローの類似度が高い程高い傾向にある。類似部分フローが多い程部分フロースコアが高い理由は、類似部分フローが多い程、デザインパターンの構成要素となる確率が高いと考えられ、結果として、デザインパターンの発見の確率が高いと考えられるからである。各類似部分フローの類似度が高い程部分フロースコアが高い理由は、汎用性の高い部分フローである可能性が高く、結果として、デザインパターンの発見の確率が高いと考えられるからである。
【００５０】
ステップＳ３０４では、部分フロースコア算出部１０２は、部分フロースコアの算出を行っていない部分フロースコアテーブル３２０（つまり、ステップＳ３０１にて未選択の部分フロースコアテーブル３２０）が存在するかを判定する。ステップＳ３０４の判定結果がtrueの場合、部分フロースコア算出部１０２は、ステップＳ３０５にて、次の部分フロースコアテーブル３２０を選択し、当該選択した部分フロースコアテーブル３２０について、Ｓ３０２およびＳ３０３にて部分フロースコアを算出する。ステップＳ３０４の判定結果がfalseの場合、図１８から図２３のように、全ての部分フロースコアテーブル３２０の類似部分フローIDカラムと部分フロースコアカラムに情報が書き込まれている。ステップＳ３０４の判定結果がfalseの場合、処理が処理C（図１６のステップＳ４０１）に進む。処理Cを図１６が示す。
【００５１】
ステップＳ４０１では、入力／出力スコア算出部１０１が、探索開始／終了ペアテーブル７２０上の全探索開始／終了ペアに対応する部分フロースコアテーブル３２０の中から、未選択の部分フロースコアテーブル３２０のうちのいずれか１つの部分フロースコアテーブル３２０を選択する。図１６の説明において、ここで選択された部分フロースコアテーブル３２０を「選択部分フロースコアテーブル３２０」と呼び、選択部分フロースコアテーブル３２０に対応した探索開始／終了ペアを「選択ペア」と呼ぶ。
【００５２】
ステップＳ４０２では、入力／出力スコア算出部１０１は、選択部分フロースコアテーブル３２０のエッジ数カラム３１６に記録されている全てのエッジ数を用いて、選択ペアの入力／出力スコアを算出し、入力／出力スコアテーブル４２０の入力／出力スコアカラム４１３における該当フィールド（選択ペアに対応したフィールド）に、算出した入力／出力スコアを記録する。入力／出力ペアスコアの算出式は、各部分フローを図１７に示すエッジ係数テーブル（エッジ数が記録されるカラム１７１１とエッジ数に対応した係数（エッジ係数）が記録されるカラム１７１２とを有するテーブル）１７２０におけるエッジ数に対する係数で除算したものの和である。例えば、図９のペア（A->B）用部分フロースコアテーブル３２０の場合、選択ペア（A->B）の入力／出力スコアは、１／３＋１／５＋１／３＋１／５と算出できる。エッジ係数テーブル１７２０は、図１における任意のコンピューター装置４００からあらかじめ登録されている。エッジ係数を設定することにより、後述する図２４における候補提示の順序を調整することができる。このように、本実施例では、選択ペアについて、入力／出力スコアは、部分フローが多い程高く、各部分フローにおけるエッジが多い程低い傾向にある。部分フローが多い程入力／出力スコアが高い理由は、部分フローが多い程、入力ノードと出力ノード間の部分フローの候補が多く、結果として、デザインパターンの発見の確率が高いと考えられるからである。各部分フローにおけるエッジが多い程入力／出力スコアが低い理由は、エッジが多い程部分フローの構成は複雑である傾向にあり、結果として、デザインパターンの発見の確率が低いと考えられるからである。
【００５３】
ステップＳ４０３では、入力／出力スコア算出部１０１は、まだ入力／出力スコアを算出していない入力／出力ペア（探索開始／終了ペア）が存在するか（つまり、未選択の部分フロースコアテーブル３２０が存在するか）を判定する。ステップＳ４０３の判定結果がtrueの場合、入力／出力スコア算出部１０１は、ステップＳ４０４にて、スコア未算出の入力／出力ペアを選択し（つまり、未選択の部分フロースコアテーブル３２０のうちのいずれか１つの部分フロースコアテーブル３２０を選択し）、ステップＳ４０２にてスコア算出処理を行う。全ての入力／出力ペアについてスコアを算出すると、ステップＳ４０３の判定結果がfalseであり、図２の処理が終了する。
【００５４】
図１に示すように、開発環境サーバー装置２００は候補情報を要求し、支援装置１００は候補情報を返す。この候補情報は、図２の処理で得られた情報をもとに算出される。この典型例を図２４に示す。また、図２４の状況における処理をシーケンス図として図２５に示す。なお、以下の説明において、モデル開発環境２０１にノードを置くとは、モデル開発環境２０１が提供するフロー編集画面（例えばＧＵＩ（Graphical User Interface））のようなモデル開発環境（例えばＵＩ（User Interface））上にノードを選定（ノードを表すオブジェクトを選定）することを意味する。選定（ノードおよび部分フローの選定）および候補提示は、インターフェース部１１１経由で行われる。
【００５５】
図２５のステップＳ５００およびステップＳ５０１に示すように、開発環境サーバー装置２００から支援装置１００へ、探索開始ノード、探索終了ノード、タグ係数、エッジ係数、類似度の閾値、編集中のフローのタグが登録されているとする。
【００５６】
そして、開発環境サーバー装置２００の利用者（以下、開発者）が、フローダイアグラムを用いたモデル開発環境２０１（フロー開発環境）に入力ノードAを置いたとする。このとき、モデル開発環境２０１は、入力ノードAに続く出力ノードの候補を支援装置１００に要求する。この要求は図２５のＳ５０２に相当する。すると、支援装置１００の候補提供部１０５は、入力／出力スコアテーブル４２０を参照し、ノードAを入力ノードとする入力／出力ペアを検索する。例えば、（A->B）、（A->C）、（A->D）という３つの入力／出力ペアが存在し、入力／出力スコアの高さもこの降順である場合、候補提供部１０５は、開発環境サーバー装置２００に、それらの出力ノードB、CおよびDと順位を応答する。この応答は図２５のＳ５０３に相当する。そして、モデル開発環境２０１はその応答に基づいて、図２４のように、ノードAに続く出力ノード候補B、CおよびDを提示する。入力／出力スコアは、高い順に、（A->B）、（A->C）、（A->D）であるため、出力ノード候補は、入力／出力スコアの高い順に（ノードB、ノードCおよびノードDの順に）並ぶ（図２４参照）。
【００５７】
次に、開発者が、提示された候補の中からノードBを選ぶと、編集中のフローにノードBが置かれる。このとき、モデル開発環境２０１は、支援装置１００に、「対象ペア（A->B）間の部分フローの候補」を要求する。対象ペアが（A->B）である理由は、入力ノードAに対してノードBが出力ノードとして選択されたためである。この要求は図２５のＳ５０４に相当する。すると、支援装置１００の候補提供部１０５は、対象ペア（A->B）用の部分フロースコアテーブル３２０を参照する。候補提供部１０５は、編集中フローのタグ（モデル開発環境２０１に対して入力されたタグ）と一致する全体フロータグが、全体フロータグカラム３１４に存在する場合、当該一致する全体フロータグに対応した全体フローに属する各部分フローについて、図２６に示すタグ係数テーブル（全体フロータグが記録されるカラム２６１１と係数（タグ係数）が記録されるカラム２６１２とを有するテーブル）２６２０に記されたタグ係数（当該一致する全体フロータグに対応したタグ係数）を、部分フロースコアに乗算する。タグ係数テーブル２６２０とは、全体フロータグごとに定められる係数（タグ係数）を記録するテーブルであり、図１に示すように任意のコンピューター装置４００から登録されるもの（例えば記憶部１１２に格納されるもの）である。タグ係数を設定することにより、どのような種類のフローを優先的に提示するかを定めることができる。
【００５８】
例えば、編集中フローのタグがTagAおよびTagBであり、部分フロースコアテーブル３２０上のある部分フローの全体フロータグがTagAであり、タグ係数テーブル２６２０にてTagAの係数が１．１とされていた場合、候補提供部１０５は、部分フロースコアに１．１を乗算することにより得られた値（以下、部分フロー候補スコア）を取得する。部分フローの部分フロー候補スコアは、当該部分フローが属する全体フローの１以上の全体フロータグが編集中フローのタグと一致した場合、当該１以上の全体フロータグにそれぞれ対応した１以上のタグ係数が反映された部分フロースコアに相当する（例えば、編集中フローのタグがTagAおよびTagBであり、全体フロータグがTagAだけでなくTagBもあれば、TagAのタグ係数に加えてTagBのタグ係数も部分フロースコアに乗算される）。一方、部分フローの部分フロー候補スコアは、当該部分フローが属する全体フローのいずれの全体フロータグも編集中フローのタグと一致しない場合、部分フロースコアそれ自体に相当する。このように、同一の部分フローについて、部分フロー候補スコアは、一致する全体フロータグが少なくとも１つ存在する場合、一致する全体フロータグが１つも存在しない場合に比して、相対的に高くなる。こうして、候補提供部１０５は、ある部分フローテーブルにおける全ての部分フローについて、一致する全体フロータグが存在するか否かを基に、部分フロー候補スコアを算出する。なお、上述したように、部分フローの部分フロースコアは、当該部分フローの全類似部分フローの類似度の和に“１”を加えたものであるが、部分フロースコアを“１”以上に維持する理由は、少なくとも１つの全体フロータグが一致する部分フローの部分フロー候補スコアを、部分フロースコアにタグ係数が乗算されることでより小さくなってしまうことを避けるためである。
【００５９】
図２５のＳ５０５に示すように、候補提供部１０５は、対象ペア（A->B）用の部分フロースコアテーブル３２０から特定される全部分フローの部分フロー候補スコアと当該全部分フローの部分フロー情報とを含んだ応答を、開発環境サーバー装置２００に送信する。モデル開発環境２０１は、この応答を受けて、図２４に示すように、入力ノードAと出力ノードB間の部分フローの候補を提示する。部分フローは、部分フロー候補スコアの高い順（降順）に並ぶ。
【００６０】
そして、モデル開発環境２０１は、開発者から、その提示された部分フロー候補の中から１つの部分フローが選択されると、入力ノードAと出力ノードB間にその選択された部分フローを置く。この場合、モデル開発環境２０１において、選択された部分フローの入力エッジが入力ノードAと接続されて、選択された部分フローの出力エッジが出力ノードBと接続される。
【００６１】
さらに、出力ノードBが、入力／出力の両方を行うノードの場合（例えば、モデル開発環境２０１が、ノードBが入力／出力の両方を行うノードであることを探索ノードテーブル６２０を基に特定した場合）、図２５のＳ５０６に示すように、モデル開発環境２０１が、「ノードBに対する出力ノードの候補」を支援装置１００に要求し、その応答がＳ５０７に示すように返る。当該応答は、ノードBを入力ノードとして入力／出力スコアテーブル４２０を参照することで得られた情報（ノードBを入力ノードとした各ペアについて、出力ノードと入力／出力スコアとを含んだ情報）を含む。そして、モデル開発環境２０１は、ノードBに続く出力ノードの候補を提示する。この候補も、入力／出力スコアの高い順（降順）に並ぶ。
【００６２】
このようにして、入力ノードの選定、出力ノードの候補提示および選定、それらの間の部分フローの候補提示および選定を繰り返すことにより、開発者がデザインパターンを発見することができる。発見されたデザインパターンに基づいた効率的な開発を実現できる。
【００６３】
以上、一実施例を説明したが、これは本発明の説明のための例示であって、本発明の範囲をこの実施例にのみ限定する趣旨ではない。本発明は、他の種々の形態でも実行することが可能である。
【００６４】
例えば、入力ノードが置かれた後に出力ノードの候補が提示されることに代えて、出力ノードが置かれた後に入力ノードの候補が提示されてもよい。入力ノードの候補の提示に関する処理は、出力ノードの候補の提示に関する処理（例えば、ステップＳ５０２からステップＳ５０３）の上述の説明において、入力ノードと出力ノードを読み替えることで、理解できる。
【００６５】
また、例えば、部分フローの候補の提示に関する処理に代えてまたは加えて、出力ノード（または入力ノード）の候補の提示に関する処理において、置かれた入力ノード（または出力ノード）を含んだペア毎に、入力／出力スコアに、編集中フローのタグと一致する全体フロータグの有無に応じて、タグ係数が反映されてもよい。すなわち、出力ノード（または入力ノード）の候補の並びは、入力／出力候補スコア（入力／出力スコアそれ自体、または、一致する全体フロータグがあればタグ係数が反映されたスコア）の降順でもよい。この場合、入力／出力スコアは、部分フロースコア同様“１”以上に維持されてもよい。置かれた入力ノード（または出力ノード）を含んだ各ペアについて、入力／出力候補スコアは、編集中のフローのタグと一致する全体フロータグを持つ全体フローの数が多い程（一致する全体フロータグが多い程）、高い傾向にあってよい。
【００６６】
また、例えば、一致する全体フロータグがある候補（出力ノード（または入力ノード）、あるいは、部分フロー）を示すオブジェクトは、一致する全体フロータグの有無に応じて、または、一致する全体フロータグの数に応じて、強調表示されてもよい。これにより、開発者は、編集中のフローのタグと一致する全体フロータグが少なくとも１つある全体フローに基づく候補がすぐにわかる。この場合、候補提供部１０５が、開発環境サーバー装置２００に送信する応答に、各候補について、一致する全体フロータグの数を示す情報を含めてよい。表示の強調度合は、一致する全体フロータグの数に応じて異なってよい。
【００６７】
また、例えば、出力ノード（または入力ノード）、あるいは、部分フローの候補として、表示可能な数の上限（例えば上位Ｍ個（Ｍは自然数））があってもよいし、スクロール等により候補一覧が見られるようになっていてもよい。
【符号の説明】
【００６８】
１００：デザインパターン発見支援装置
１０１：入力／出力スコア算出部
１０２：部分フロースコア算出部
１０３：部分フロー検出部
１０４：部分フロー類似度算出部
１０５    候補提供部
１１１：インターフェース部
１１２：記憶部
１１３：プロセッサ部
１５０：デザインパターン発見支援部
２００：開発環境サーバー装置
２０１：フローダイアグラムを用いたモデル開発環境
３００：リポジトリサーバー装置
３０１：フロー保存用リポジトリ
４００：任意のコンピューター装置
【図１】
2019148859.tif 000003
【図２】
2019148859.tif 000004
【図３】
2019148859.tif 000005
【図４】
2019148859.tif 000006
【図５】
2019148859.tif 000007
【図６】
2019148859.tif 000008
【図７】
2019148859.tif 000009
【図８】
2019148859.tif 000010
【図９】
2019148859.tif 000011
【図１０】
2019148859.tif 000012
【図１１】
2019148859.tif 000013
【図１２】
2019148859.tif 000014
【図１３】
2019148859.tif 000015
【図１４】
2019148859.tif 000016
【図１５】
2019148859.tif 000017
【図１６】
2019148859.tif 000018
【図１７】
2019148859.tif 000019
【図１８】
2019148859.tif 000020
【図１９】
2019148859.tif 000021
【図２０】
2019148859.tif 000022
【図２１】
2019148859.tif 000023
【図２２】
2019148859.tif 000024
【図２３】
2019148859.tif 000025
【図２４】
2019148859.tif 000026
【図２５】
2019148859.tif 000027
【図２６】
2019148859.tif 000028