(57)【要約】【課題】ソースコードに含まれる分割すべきプログラム要素を提示する。【解決手段】プロセッサ１１は、ソースコード１３Ｂに基づいてコードメトリクスを計算し、コードメトリクスに基づいてＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅを計算し、コードメトリクスに基づいて保守性指標を計算し、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅに基づいて分割すべきプログラム要素を特定し、サブアンチパターン定義情報に基づいて、分割すべきプログラム要素をサブアンチパターンに分類し、改善カタログ情報に基づいてソースコードの改善箇所を提示する。【選択図】図１
2019219848.tif 000002
【特許請求の範囲】
【請求項１】
コードメトリクス取得部が、複数のプログラム要素を有するソースコードを解析してプログラム要素の長さ及び複雑度にかかるコードメトリクスを生成し、
コミット情報取得部が、前記プログラム要素の変更履歴にかかるコミット情報を取得し、
スコア計算部が、前記コードメトリクスと、前記コミット情報と、に基づいて、前記プログラム要素のスコアを算出し、
保守性指標算出部が、前記コードメトリクスに基づき、前記プログラム要素の保守性指標を算出し、
リスト生成部が、前記スコアと、前記保守性指標と、に基づいて、複数に分割する候補となる前記プログラム要素のリストを生成するソースコード解析方法。
【請求項２】
請求項１において、
前記スコアは、Ｌｏｎｇ  ｍｅｔｈｏｄ  Ｓｃｏｒｅであるソースコード解析方法。
【請求項３】
請求項１において、
前記リスト生成部は、スコア閾値または／及び保守性指標閾値を用いて、前記リストを作成するソースコード解析方法。
【請求項４】
請求項３において、
条件設定部は、前記スコアまたは保守指標性の軸と、前記スコアまたは保守指標性に該当するプログラム要素数の軸を有するグラフを出力し、ユーザから前記スコア閾値または／及び保守性指標閾値の設定を受け付けるソースコード解析方法。
【請求項５】
請求項４において、
前記グラフは、前記スコア及び前記保守指標性の両方が視認できるグラフであるソースコード解析方法。
【請求項６】
請求項１において、
前記スコア計算部は、さらに各プログラム要素のバグ発生にかかるバグ履歴情報を用いて、前記プログラム要素のスコアを算出するソースコード解析方法。
【請求項７】
請求項６において、
前記バグ履歴情報には、バグの原因が含まれており、
前記バグ原因に含まれうる特定のワードを規定した可読性低下ワード条件をさらに用いて、前記スコア計算部は、前記プログラム要素のスコアを算出するソースコード解析方法。
【請求項８】
請求項１において、
サブアンチパターンを定義したサブアンチパターン定義情報を有し、
サブアンチパターン分類部は、前記スコア、前記ソースコード、前記コードメトリクスに基づいて、前記スコアに記載されたプログラム要素をサブアンチパターンに分類したサブアンチパターンリストを生成するソースコード解析方法。
【請求項９】
請求項８において、
改善箇所マッピング部が、前記アンチパターンリストと、改善カタログとに基づいて、改善個所を示したソースコードを生成するソースコード解析方法。
【請求項１０】
複数のプログラム要素を有するソースコードを解析してプログラム要素の長さ及び複雑度にかかるコードメトリクスを生成するコードメトリクス取得部と、
前記プログラム要素の変更履歴にかかるコミット情報を取得するコミット情報取得部と、
前記コードメトリクスと、前記コミット情報と、に基づいて、前記プログラム要素のスコアを算出するスコア計算部と、
前記コードメトリクスに基づき、前記プログラム要素の保守性指標を算出する保守性指標算出部と、
前記スコアと、前記保守性指標と、に基づいて、複数に分割する候補となる前記プログラム要素のリストを生成するリスト生成部とを備えるソースコード解析装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ソースコード解析方法およびソースコード解析装置に関する。
【背景技術】
【０００２】
近年のソフトウェア開発では、開発済みの母体ソフトウェアを拡張または変更することによって新しいソフトウェアを開発する派生開発が主流である。ソフトウェアの派生開発においては、長年に渡る機能の拡張または変更の繰り返しにより、ソフトウェアが複雑化し、ソースコードの可読性が低下しやすい。このような状況を解決するため、ソフトウェアのリファクタリングが一般的に行われている。リファクタリングとは、ソフトウェアの振る舞いを変えず、その内部構造を変更することである。保守性が低いメソッド、クラス、ファイルなどのプログラム構成要素（以下、プログラム要素と称す）を適切にリファクタリングすれば、ソフトウェアが拡張または変更しやすくなる。
【０００３】
リファクタリングを支える技術にアンチパターンがある。アンチパターンとは、保守性が低いプログラム要素が持つ特徴（以下、問題特徴と称す）と、当該問題特徴を持つプログラム要素のリファクタリング方法のパターンをまとめたものである。リファクタリング対象ソフトウェアにおいて、アンチパターンが示すような問題特徴を持つプログラム要素を特定できれば、アンチパターンを適用することでリファクタリングすることができる。
【０００４】
特許文献１には、ソースコード、構成管理システムまたは稼動ログからメトリクスを計測し、ソースコードのアンチパターン該当可否を評価する手法が記載されている。これにより、リファクタリングが必要ない複雑なソースコードを抽出せず、真にリファクタリングが必要なソースコードを特定することができる。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２０１６−１４３１０７号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
しかしながら、特許文献１の手法では、ソースコードをプログラム解析して得られるプログラム要素の特徴量（以下、コードメトリクスと称す）を用いて当該プログラム要素がアンチパターンに該当するかどうかを判定し、該当する場合は当該プログラム要素をリファクタリング手順および優先度と共に提示する。しかし、提示されるリファクタリング手順は、アンチパターンごとに予め設定されたプログラム要素全体の修正方針である。このため、リファクタリング作業者はプログラム要素中のどの箇所をどのように修正すべきかについては自ら判断する必要があり、リファクタリング作業者に高いスキルが必要だった。
【０００７】
以下、Ｌｏｎｇ  Ｍｅｔｈｏｄというアンチパターンを例に説明する。
Ｌｏｎｇ  Ｍｅｔｈｏｄとは、プログラム要素が大きすぎるメソッドであるためにプログラム要素の可読性が低いという問題特徴を持つプログラム要素をリファクタリングするためのパターンである。プログラムの可読性が低いと、プログラム要素の修正者は、プログラム要素の修正の際に、修正対象のプログラム要素の理解に時間がかかるだけでなく、修正対象のプログラム要素の挙動を誤って理解し間違った修正をする可能性がある。
【０００８】
一般的に、Ｌｏｎｇ  Ｍｅｔｈｏｄに該当するプログラム要素に対してはメソッド分割というリファクタリング手順が存在する。これは、大きすぎるメソッドを複数の小さなメソッドに分割することで、Ｌｏｎｇ  Ｍｅｔｈｏｄへの該当を解消するというものである。
【０００９】
特許文献１の手法では、Ｌｏｎｇ  Ｍｅｔｈｏｄに該当するプログラム要素を発見し、リファクタリング手順および優先度と共に画面に提示することが可能である。しかし、Ｌｏｎｇ  Ｍｅｔｈｏｄに対するリファクタリング手順について、メソッド分割と提示されるのみにとどまり、メソッド内のどの箇所でメソッド分割を行えばよいのかについては提示されない。そのため、リファクタリング作業者はメソッドの分割箇所について自ら判断する必要があり、高いスキルが必要だった。
【００１０】
本発明は、上記事情に鑑みなされたものであり、その目的は、ソースコードに含まれる分割すべきプログラム要素を提示することが可能なソースコード解析方法およびソースコード解析装置を提供することにある。
【課題を解決するための手段】
【００１１】
上記目的を達成するため、第１の観点に係るソースコード解析方法は、コードメトリクス取得部が、複数のプログラム要素を有するソースコードを解析してプログラム要素の長さ及び複雑度にかかるコードメトリクスを生成し、コミット情報取得部が、前記プログラム要素の変更履歴にかかるコミット情報を取得し、スコア計算部が、前記コードメトリクスと、前記コミット情報と、に基づいて、前記プログラム要素のスコアを算出し、保守性指標算出部が、前記コードメトリクスに基づき、前記プログラム要素の保守性指標を算出し、リスト生成部が、前記スコアと、前記保守性指標と、に基づいて、複数に分割する候補となる前記プログラム要素のリストを生成する。
【発明の効果】
【００１２】
本発明によれば、ソースコードに含まれる分割すべきプログラム要素を提示することができる。
【図面の簡単な説明】
【００１３】
【図１】図１は、第１実施形態に係るソースコード解析装置のハードウェア構成を示すブロック図である。
【図２】図２は、図１のソースコード解析装置の機能的な構成を示すブロック図である。
【図３】図３は、図２のソースコード解析装置で取得されるコードメトリクスの一例を示す図である。
【図４】図４は、図２のソースコード解析装置に入力されるプログラム要素変更履歴の一例を示す図である。
【図５】図５は、図２のソースコード解析装置で計算されるＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅの一例を示す図である。
【図６】図６は、図２のソースコード解析装置で計算される保守性指標の一例を示す図である。
【図７】図７は、図２のソースコード解析装置で生成されるＬｏｎｇ  Ｍｅｔｈｏｄリストの一例を示す図である。
【図８】図８は、図２のコードメトリクス取得部の処理を示すフローチャートである。
【図９】図９は、図２のＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ計算部の処理を示すフローチャートである。
【図１０】図１０は、保守性指標計算部の処理を示すフローチャートである。
【図１１】図１１は、図２のＬｏｎｇ  Ｍｅｔｈｏｄ条件設定部の処理を示すフローチャートである。
【図１２】図１２は、図２のＬｏｎｇ  Ｍｅｔｈｏｄリスト生成部の処理を示すフローチャートである。
【図１３】図１３は、図２のＬｏｎｇ  Ｍｅｔｈｏｄ条件設定部で表示される保守性指標を横軸、プログラム要素数を縦軸としたヒストグラムの一例を示す図である。
【図１４】図１４は、図２のＬｏｎｇ  Ｍｅｔｈｏｄ条件設定部で表示されるＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅを横軸、プログラム要素数を縦軸としたヒストグラムの一例を示す図である。
【図１５】図１５は、第２実施形態に係るソースコード解析装置の機能的な構成を示すブロック図である。
【図１６】図１６は、図１５のソースコード解析装置に入力されるバグ履歴情報の一例を示す図である。
【図１７】図１７は、図１５のＬｏｎｇ  Ｍｅｔｈｏｄ条件設定部の処理を示すフローチャートである。
【図１８】図１８は、図１５のＬｏｎｇ  Ｍｅｔｈｏｄリスト生成部の処理を示すフローチャートである。
【図１９】図１９は、図１５のＬｏｎｇ  Ｍｅｔｈｏｄ条件設定部で表示される保守性指標を横軸、プログラム要素数を縦軸としたヒストグラムの一例を示す図である。
【図２０】図２０は、図１５のＬｏｎｇ  Ｍｅｔｈｏｄ条件設定部で表示されるＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅを横軸、プログラム要素数を縦軸としたヒストグラムの一例を示す図である。
【図２１】図２１は、第３実施形態に係るソースコード解析装置で生成されるＬｏｎｇ  Ｍｅｔｈｏｄリストの一例を示す図である。
【図２２】図２２は、第４実施形態に係るソースコード解析装置の機能的な構成を示すブロック図である。
【図２３】図２３は、図２２のソースコード解析装置に入力されるサブアンチパターン定義情報の一例を示す図である。
【図２４】図２４は、図２２のソースコード解析装置で生成されるサブアンチパターンリストの一例を示す図である。
【図２５】図２５は、図２２のソースコード解析装置に入力される改善カタログ情報の一例を示す図である。
【図２６】図２６は、図２２のサブアンチパターン分類部の処理を示すフローチャートである。
【図２７】図２７は、図２２の改善箇所マッピング部の処理を示すフローチャートである。
【図２８】図２８は、第６実施形態に係るソースコード解析装置から出力される改善箇所を示したソースコードの一例を示す図である。
【図２９】図２９は、第８実施形態に係るソースコード解析装置の画面遷移の一例を示す図である。
【図３０】図３０は、図２２のソースコード解析装置の解析対象選択画面の一例を示す図である。
【図３１】図３１は、図２２のソースコード解析装置のＬｏｎｇ  Ｍｅｔｈｏｄ条件設定画面の一例を示す図である。
【図３２】図３２は、図２２のソースコード解析装置のＬｏｎｇ  Ｍｅｔｈｏｄ一覧画面の一例を示す図である。
【図３３】図３３は、図２２のソースコード解析装置の改善箇所表示画面の一例を示す図である。
【発明を実施するための形態】
【００１４】
実施形態について、図面を参照して説明する。なお、以下に説明する実施形態は特許請求の範囲に係る発明を限定するものではなく、また実施形態の中で説明されている諸要素及びその組み合わせの全てが発明の解決手段に必須であるとは限らない。
【００１５】
（第１実施形態）
図１は、第１実施形態に係るソースコード解析装置のハードウェア構成を示すブロック図である。
図１において、ソースコード解析装置１０Ａは、プロセッサ１１、主記憶装置１２、補助記憶装置１３、入力装置１４、出力装置１５および通信装置１６を備える。プロセッサ１１、主記憶装置１２、補助記憶装置１３、入力装置１４、出力装置１５および通信装置１６は、バス１７等の通信手段を介して互いに通信可能に接続されている。
【００１６】
プロセッサ１１は、例えば、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）またはＭＰＵ（Ｍｉｃｒｏ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）を用いて構成されている。プロセッサ１１が、主記憶装置１２に格納されているプログラムを読み出して実行することにより、ソースコード解析装置１０Ａの様々な機能が実現される。主記憶装置１２は、プログラムやデータを記憶する装置であり、例えば、ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）、不揮発性半導体メモリ（ＮＶＲＡＭ（Ｎｏｎ  Ｖｏｌａｔｉｌｅ  ＲＡＭ））等である。
【００１７】
補助記憶装置１３は、例えば、ハードディスクドライブ、ＳＳＤ（Ｓｏｌｉｄ  Ｓｔａｔｅ  Ｄｒｉｖｅ）、光学式記憶装置（ＣＤ（Ｃｏｍｐａｃｔ  Ｄｉｓｃ）、ＤＶＤ（Ｄｉｇｉｔａｌ  Ｖｅｒｓａｔｉｌｅ  Ｄｉｓｃ）等）、ストレージシステム、ＩＣカード、ＳＤメモリカードや光学式記録媒体等の記録媒体の読取／書込装置、クラウドサーバの記憶領域等である。補助記憶装置１３に格納されているプログラムやデータは主記憶装置１２に随時ロードされる。
【００１８】
入力装置１４は、例えば、キーボード、マウス、タッチパネル、カードリーダ、音声入力装置等である。出力装置１５は、ユーザに処理経過や処理結果等の各種情報を提供するユーザインターフェースである。出力装置１５は、例えば、画面表示装置（液晶モニタ、有機ＥＬディスプレイ、グラフィックカード等）、音声出力装置（スピーカ等）、印字装置等である。なお、例えば、ソースコード解析装置１０Ａが通信装置１６を介して他の装置との間で情報の入力や出力を行う構成としてもよい。
【００１９】
通信装置１６は、ＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）やインターネット等の通信手段を介した他の装置との間の通信を実現する有線方式又は無線方式の通信インタフェースである。通信装置１６は、例えば、ＮＩＣ（Ｎｅｔｗｏｒｋ  Ｉｎｔｅｒｆａｃｅ  Ｃａｒｄ）、無線通信モジュール、ＵＳＢ（Ｕｎｉｖｅｒｓａｌ  Ｓｅｒｉａｌ  Ｉｎｔｅｒｆａｃｅ）モジュール、シリアル通信モジュール等である。
【００２０】
ここで、補助記憶装置１３には、ソースコード解析プログラム１３Ａおよびソースコード１３Ｂを格納することができる。そして、プロセッサ１１が、ソースコード解析プログラム１３Ａおよびソースコード１３Ｂを主記憶装置１２にロードし、ソースコード解析プログラム１３Ａを実行することにより、ソースコード１３Ｂを解析することができる。
【００２１】
この時、プロセッサ１１は、複数のプログラム要素を有するソースコード１３Ｂを解析してプログラム要素の長さ及び複雑度にかかるコードメトリクスを生成し、プログラム要素の変更履歴にかかるコミット情報を取得し、コードメトリクスとコミット情報とに基づいて、プログラム要素のスコアを算出し、コードメトリクスに基づき、プログラム要素の保守性指標を算出し、スコアと保守性指標とに基づいて、複数に分割する候補となるプログラム要素のリストを生成することができる。スコアは、Ｌｏｎｇ  ｍｅｔｈｏｄ  Ｓｃｏｒｅであってもよい。
【００２２】
さらに、プロセッサ１１は、サブアンチパターン定義情報に基づいて、分割すべきプログラム要素をサブアンチパターンに分類し、改善カタログ情報に基づいてソースコードの改善箇所を提示することができる。
【００２３】
コードメトリクスは、ソースコードの一連の基準に従ってソースコード１３Ｂを数値化した値である。例えば、コードメトリクスとして、ソースコード１３Ｂを解析して生成されたプログラム要素の長さ及び複雑度にかかる数値を用いることができる。プログラム要素は、プログラムの構成要素である。例えば、プログラム要素は、モジュール、クラス、ファイル、メソッド、フィールド、関数、変数などである。Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅは、プログラム要素が大きすぎるメソッドであるためにプログラム要素の可読性が低いという特徴を数値で示したものである。保守性指標は、ソフトウェアの変更にかかる手間に影響する特性を数値で示したものである。サブアンチパターンは、Ｌｏｎｇ  Ｍｅｔｈｏｄの種類ごとにアンチパターンを分類したものである。サブアンチパターン定義情報は、サブアンチパターンを定義した情報である。改善カタログ情報は、サブアンチパターンに対するプログラム改善方法を示す情報である。
【００２４】
なお、ソースコード解析プログラム１３Ａの実行は、複数のプロセッサやコンピュータに分担させてもよい。あるいは、プロセッサ１１は、通信装置１６を介してクラウドコンピュータなどにソースコード解析プログラム１３Ａの全部または一部の実行を指示し、その実行結果を受け取るようにしてもよい。
【００２５】
図２は、図１のソースコード解析装置の機能的な構成を示すブロック図である。
図２において、ソースコード解析装置１０Ａは、コミット情報取得部１００と、コードメトリクス取得部１０１と、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ計算部１０２と、保守性指標計算部１０３と、Ｌｏｎｇ  Ｍｅｔｈｏｄ条件設定部１０４Ａと、Ｌｏｎｇ  Ｍｅｔｈｏｄリスト生成部１０５Ａと、情報記憶部２００を備える。
【００２６】
これらの機能は、例えば、プロセッサ１１が、主記憶装置１２や補助記憶装置１３に格納されているプログラムを読み出して実行することにより実現することができる。あるいは、これらの機能は、例えば、ソースコード解析装置１０Ａが備えるハードウェア（ＡＳＩＣ（Ａｐｐｌｉｃａｔｉｏｎ  Ｓｐｅｃｉｆｉｃ  Ｉｎｔｅｇｒａｔｅｄ  Ｃｉｒｃｕｉｔ）等）によって実現することができる。
【００２７】
ソースコード解析にあたって、ソースコード解析装置１０Ａには、ソースコード１０９、ソースコード１０９のプログラム要素変更履歴１１０、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ閾値１１２および保守性指標閾値１１３が入力される。コードメトリクス取得部１０１は、解析対象となるソースコード１０９を受け付けて、コードメトリクス１１７を生成し、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ計算部１０２および保守性指標計算部１０３に出力する。コミット情報取得部１００は、解析対象となるソースコード１０９のプログラム要素変更履歴１１０を受け付けて、コミット情報１０８を生成し、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ計算部１０２に出力する。
【００２８】
Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ計算部１０２は、コードメトリクス１０１およびコミット情報１０８を受け付けて、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ１１８を生成し、Ｌｏｎｇ  Ｍｅｔｈｏｄ条件設定部１０４ＡおよびＬｏｎｇ  Ｍｅｔｈｏｄリスト生成部１０５Ａに出力する。保守性指標計算部１０３は、コードメトリクス１１７を受け付けて、保守性指標１１９を生成し、Ｌｏｎｇ  Ｍｅｔｈｏｄ条件設定部１０４ＡおよびＬｏｎｇ  Ｍｅｔｈｏｄリスト生成部１０５Ａに出力する。
【００２９】
Ｌｏｎｇ  Ｍｅｔｈｏｄ条件設定部１０４Ａは、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ１１８と保守性指標１１９を受け付けて、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ閾値１１２および保守性指標閾値１１３を設定可能にする。この時、Ｌｏｎｇ  Ｍｅｔｈｏｄ条件設定部１０４Ａは、プログラム要素数と保守性指標１１９との関係およびプログラム要素数とＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ１１８との関係を表示させることができる。そして、閾値設定者は、これらの関係を参照しながら、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ閾値１１２および保守性指標閾値１１３を設定することができる。
【００３０】
Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ閾値１１２および保守性指標閾値１１３は、Ｌｏｎｇ  Ｍｅｔｈｏｄリスト生成部１０５Ａに入力される。Ｌｏｎｇ  Ｍｅｔｈｏｄリスト生成部１０５Ａは、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ１１８と、保守性指標１１９と、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ閾値１１２と、保守性指標閾値１１３を受け付けて、Ｌｏｎｇ  Ｍｅｔｈｏｄリスト１２０Ａを生成する。Ｌｏｎｇ  Ｍｅｔｈｏｄリスト１２０Ａは、Ｌｏｎｇ  Ｍｅｔｈｏｄに該当するプログラム要素を、分割すべきプログラム要素として記録したものである。
【００３１】
ここで、Ｌｏｎｇ  Ｍｅｔｈｏｄリスト生成部１０５Ａは、Ｌｏｎｇ  Ｍｅｔｈｏｄ  ＳｃｏｒｅがＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ閾値１１２以上かつ保守性指標が保守性指標閾値１１３以下のプログラム要素をＬｏｎｇ  Ｍｅｔｈｏｄと判断することができる。あるいは、Ｌｏｎｇ  Ｍｅｔｈｏｄリスト生成部１０５Ａは、Ｌｏｎｇ  Ｍｅｔｈｏｄ  ＳｃｏｒｅがＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ閾値１１２以上のプログラム要素をＬｏｎｇ  Ｍｅｔｈｏｄと判断するようにしてもよい。
【００３２】
情報記憶部２００は、コードメトリクス１１７と、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ１１８と、保守性指標１１９を記憶する。情報記憶部２００は、図１の補助記憶装置１３を用いることができる。情報記憶部２００は、これらの情報以外にも、コードメトリクス取得部１０１や、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ計算部１０２や、保守性指標計算部１０３や、Ｌｏｎｇ  Ｍｅｔｈｏｄ条件設定部１０４Ａや、Ｌｏｎｇ  Ｍｅｔｈｏｄリスト生成部１０５Ａが適宜参照もしくは生成する情報等を記憶する。情報記憶部２００は、補助記憶装置１３に記憶する情報を、例えば、ファイルシステムやＤＢＭＳ（ＤａｔａＢａｓｅ  Ｍａｎａｇｅｍｅｎｔ  Ｓｙｓｔｅｍ）によって管理することができる。
【００３３】
ここで、ソースコード解析装置１０Ａは、コードメトリクス１１７およびコミット情報１０８に基づいてＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ１１８を生成し、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ１１８に基づいてプログラム要素がＬｏｎｇ  Ｍｅｔｈｏｄかどうかを判定することにより、ソースコード１０９に含まれる分割すべきプログラム要素を提示することが可能となる。このため、リファクタリング作業者は、メソッドの分割箇所について自ら判断することなく、メソッド内のどの箇所でメソッド分割を行えばよいのかについて認識することができ、機能の拡張または変更が繰り返されたソフトウェアの可読性を向上させることができる。
【００３４】
図３は、図２のソースコード解析装置で取得されるコードメトリクスの一例を示す図である。
図３において、コードメトリクス１１７は、解析対象となるプログラムのソースコード１０９を入力としてコードメトリクス取得部１０１によって計算された様々なメトリクス値をコードメトリクスレコード３０３として記録したものである。コードメトリクスレコード３０３は、当該コードメトリクスレコード３０３の計算対象プログラム要素を記録したプログラム要素名３０１と、当該プログラム要素名３０１の様々なメトリクス値を示したコードメトリクス３０２を備える。例えば、プログラム要素１では、メトリクスＭ１＝７５、メトリクスＭ２＝０．３という値が記録される。
【００３５】
図４は、図２のソースコード解析装置に入力されるプログラム要素変更履歴の一例を示す図である。
図４において、プログラム要素変更履歴１１０は、解析対象となるプログラムに発生した変更の履歴を、変更が発生するたびに変更履歴レコード４０３として記録したものである。変更履歴レコード４０３は、当該変更履歴レコード４０３を識別するために一意に付与されるコミット番号４０１と、当該変更履歴レコード４０３に対応するプログラム変更発生時に同時変更された一つ以上の変更プログラム要素名４０２を備える。例えば、コミット番号４０１がＴ１の変更履歴レコード４０３に対応する変更発生時には、変更プログラム要素名４０２に記載されたプログラム要素１、プログラム要素２およびプログラム要素３が同時変更されている。
【００３６】
図５は、図２のソースコード解析装置で計算されるＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅの一例を示す図である。
図５において、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ１１８は、コードメトリクス１１７とコミット情報１０８を入力としてＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ計算部１０２において計算した値をＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅレコード５０３として記録したものである。Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅレコード５０３は、当該Ｌｏｎｇ  Ｍｅｔｈｏｄレコード５０３の計算対象プログラム要素を記録したプログラム要素名５０１と、当該プログラム要素名５０１のＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ５０２を備える。例えば、プログラム要素１では、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ＝５７という値が記録される。Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ５０２が大きいほど、当該プログラム要素のＬｏｎｇ  Ｍｅｔｈｏｄアンチパターンへの該当性が高いことを表す。
【００３７】
図６は、図２のソースコード解析装置で計算される保守性指標の一例を示す図である。
図６において、保守性指標１１９は、コードメトリクス１１７を入力として保守性指標計算部１０３において計算した値を保守性指標レコード６０３として記録したものである。保守性指標レコード６０３は、当該保守性指標レコード６０３の計算対象プログラム要素を記録したプログラム要素名６０１と、当該プログラム要素名６０１の保守性指標６０２を備える。保守性指標６０２の計算方法として、一般的に用いられる計算式を用いてもよい。保守性指標６０２が大きいほど、当該プログラム要素の保守性が高いことを表す。
【００３８】
図２において、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ閾値１１２は、Ｌｏｎｇ  Ｍｅｔｈｏｄ生成部１０５で各プログラム要素がＬｏｎｇ  Ｍｅｔｈｏｄか否かを判断する時に用いるＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ１１８の閾値を記録したものである。例えば、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ閾値１１２として６０を設定する。保守性指標閾値１１３は、Ｌｏｎｇ  Ｍｅｔｈｏｄ生成部１０５で各プログラム要素がＬｏｎｇ  Ｍｅｔｈｏｄか否かを判断する時に用いる保守性指標１１９の閾値を記録したものである。例えば、保守性指標閾値１１３として３０を設定する。
【００３９】
図７は、図２のソースコード解析装置で生成されるＬｏｎｇ  Ｍｅｔｈｏｄリストの一例を示す図である。
図７において、Ｌｏｎｇ  Ｍｅｔｈｏｄリスト１２０Ａは、Ｌｏｎｇ  Ｍｅｔｈｏｄリスト生成部１０５ＡによってＬｏｎｇ  Ｍｅｔｈｏｄに該当すると判断されたプログラム要素をＬｏｎｇ  Ｍｅｔｈｏｄレコード７０２として記録したものである。Ｌｏｎｇ  Ｍｅｔｈｏｄレコード７０２は、Ｌｏｎｇ  Ｍｅｔｈｏｄに該当するプログラム要素名７０１を備える。例えば、プログラム要素１、２は、Ｌｏｎｇ  Ｍｅｔｈｏｄに該当するものとしてＬｏｎｇ  Ｍｅｔｈｏｄリスト１２０Ａに記録されている。
【００４０】
図８は、図２のコードメトリクス取得部の処理を示すフローチャートである。
図８において、コードメトリクス取得部１０１は、解析対象プログラムのソースコード１０９を読み込む（８０１）。次に、コードメトリクス取得部１０１は、ソースコード１０９をプログラム要素に分割する（８０２）。次に、コードメトリクス取得部１０１は、全てのプログラム要素に対してコードメトリクス１１７を取得したかどうかを判断する（８０３）。全てのプログラム要素に対してコードメトリクス１１７を取得していない場合、コードメトリクス取得部１０１は、そのプログラム要素のコードメトリクス１１７を取得し、８０３に戻る（８０４）。取得するコードメトリクス１１７の種類としては、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ計算部１０２および保守性指標計算部１０３で用いるものを選択する。全てのプログラム要素に対してコードメトリクス１１７を取得すると、処理を終了する。
【００４１】
図９は、図２のＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ計算部の処理を示すフローチャートである。
図９において、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ計算部１０２は、全てのプログラム要素に対してＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ１１８を計算したかどうかを判断する（９０１）。全てのプログラム要素に対してＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ１１８を計算していない場合、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ計算部１０２は、そのプログラム要素のコミット情報１０８およびコードメトリクス１１７を読み込む（９０２、９０３）。ただし、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ計算（９０４）においてコミット情報１０８を必要としない場合は、コミット情報１０８の読み込みは省略される。また、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ計算（９０４）においてコードメトリクス１１７を必要としない場合は、コードメトリクス１１７の読み込みは省略される。
【００４２】
この時、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ１１８は、コミット情報１０８とコードメトリクス１１７のいずれか一方または両方から計算される。Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅの計算方法については問わない。コミット情報１０８の読み込み（９０２）とコードメトリクス１１７の読み込み（９０３）の順序については問わない。
【００４３】
次に、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ計算部１０２は、そのプログラム要素のコミット情報１０８およびコードメトリクス１１７に基づいてＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ１１８を計算し、９０１に戻る（９０４）。全てのプログラム要素に対してＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ１１８を計算すると、処理を終了する。
【００４４】
Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ１１８の計算に用いられるコードメトリクス１１７は、例えば、コメント抜き行数、循環的複雑度、コメント行数およびローカル変数宣言数である。Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ１１８の計算に用いられるコミット情報１０８は、例えば、コミット当たりの変更箇所数および重み付きコミット回数である。
【００４５】
図１０は、保守性指標計算部の処理を示すフローチャートである。
図１０において、保守性指標計算部１０３は、全てのプログラム要素に対して保守性指標１１９を計算したかどうかを判断する（１００１）。全てのプログラム要素に対して保守性指標１１９を計算していない場合、保守性指標計算部１０３は、そのプログラム要素のコードメトリクス１１７を読み込む（１００２）。次に、保守性指標計算部１０３は、そのプログラム要素のコードメトリクス１１７に基づいて保守性指標１１９を計算し、１００１に戻る（１００３）。全てのプログラム要素に対して保守性指標１１９を計算すると、処理を終了する。
【００４６】
保守性指標とはソフトウェアの保守のしやすさを示すコードメトリクスである。保守性指標の１つとして、例えば、保守容易性指数がある。保守容易性指数は、例えば、以下の式で計算することができる。
保守容易性指数＝１７１−５．２＊ｌｎ（（Ｎ１＋Ｎ２）＊ｌｏｇ２（ｎ１＋ｎ２））−０．２３＊（Ｇ）−１６．２＊ｌｎ（ＬＯＣ））＊１００／１７１
【００４７】
ただし、Ｎ１＝（オペレータ総数）、Ｎ２＝（オペランド総数）、ｎ１＝（オペレータ種類数）、ｎ２＝（オペランド種類数）、Ｇ＝（サイクロマチック数）、ＬＯＣ＝（コメント抜き行数）である。保守性指標として用いるものは保守容易性指数に限らず、プログラムの保守性に関与する任意の指標でよい。
【００４８】
図１１は、図２のＬｏｎｇ  Ｍｅｔｈｏｄ条件設定部の処理を示すフローチャートである。
図１１において、Ｌｏｎｇ  Ｍｅｔｈｏｄ条件設定部１０４Ａは、全てのプログラム要素に対してＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ１１８および保守性指標１１９を読み込んだかどうかを判断する（１１０１）。全てのプログラム要素に対してＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ１１８および保守性指標１１９を読み込んでいない場合、Ｌｏｎｇ  Ｍｅｔｈｏｄ条件設定部１０４Ａは、そのプログラム要素のＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ１１８および保守性指標１１９を読み込む（１１０２、１１０３）。
【００４９】
Ｌｏｎｇ  Ｍｅｔｈｏｄ条件設定部１０４Ａは、全てのプログラム要素に対してＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ１１８および保守性指標１１９を読み込むと、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ閾値１１２および保守性指標閾値１１３に対して初期値を設定する（１１０４）。ここで、初期値としてどのような値を選んでもよい。
【００５０】
次に、Ｌｏｎｇ  Ｍｅｔｈｏｄ条件設定部１０４Ａは、保守性指標を横軸、プログラム要素数を縦軸としたヒストグラムを表示する（１１０５）。このヒストグラムの表示は、閾値設定者がＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ閾値１１２および保守性指標閾値１１３の設定を行うのを支援する。
【００５１】
次に、Ｌｏｎｇ  Ｍｅｔｈｏｄ条件設定部１０４Ａは、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅを横軸、プログラム要素数を縦軸としたヒストグラムを表示する（１１０６）。このヒストグラムの表示は、閾値設定者がＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ閾値１１２および保守性指標閾値１１３の設定を行うのを支援する。
【００５２】
次に、Ｌｏｎｇ  Ｍｅｔｈｏｄ条件設定部１０４Ａは、閾値設定者による閾値の設定を続けるか否かの判断を受け付ける（１１０７）。閾値設定者が閾値の設定を続けると判断した場合、Ｌｏｎｇ  Ｍｅｔｈｏｄ条件設定部１０４Ａは、閾値設定者によるＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ閾値１１２の数値入力を受け付け、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ閾値１１２として設定する（１１０８）。次に、Ｌｏｎｇ  Ｍｅｔｈｏｄ条件設定部１０４Ａは、閾値設定者による保守性指標閾値１１３の数値入力を受け付け、保守性指標閾値１１３として設定する（１１０９）。
【００５３】
次に、Ｌｏｎｇ  Ｍｅｔｈｏｄ条件設定部１０４Ａは、閾値設定者にて入力された数値をＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ閾値１１２および保守性指標閾値１１３として設定すると、１１０５に戻る。そして、Ｌｏｎｇ  Ｍｅｔｈｏｄ条件設定部１０４Ａは、閾値設定者が閾値の設定を続けないと判断するまで、１１０５〜１１０９の処理を繰り返し、閾値設定者が閾値の設定を続けないと判断すると、処理を終了する。
【００５４】
なお、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ１１８の読み込み（１１０２）および保守性指標１１９の読み込み（１１０３）の順序については問わない。また、保守性指標１１９を横軸、プログラム要素数を縦軸としたヒストグラムの表示（１１０５）およびＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ１１８を横軸、プログラム要素数を縦軸としたヒストグラムの表示（１１０６）の順序については問わない。また、閾値設定者によるＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ閾値１１２の入力（１１０８）および閾値設定者による保守性指標閾値１１３の入力（１１０９）の順序については問わない。
【００５５】
図１２は、図２のＬｏｎｇ  Ｍｅｔｈｏｄリスト生成部の処理を示すフローチャートである。
図１２において、Ｌｏｎｇ  Ｍｅｔｈｏｄリスト生成部１０５Ａは、空のＬｏｎｇ  Ｍｅｔｈｏｄリスト１２０Ａを用意する（１２０１）。次に、Ｌｏｎｇ  Ｍｅｔｈｏｄリスト生成部１０５Ａは、プログラム要素のＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ閾値１１２および保守性指標閾値１１３を読み込む（１２０２、１２０３）。
【００５６】
次に、Ｌｏｎｇ  Ｍｅｔｈｏｄリスト生成部１０５Ａは、全てのプログラム要素に対してＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ１１８および保守性指標１１９をＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ閾値１１２および保守性指標閾値１１３とそれぞれ比較したかどうかを判断する（１２０４）。全てのプログラム要素に対してＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ１１８および保守性指標１１９をＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ閾値１１２および保守性指標閾値１１３とそれぞれ比較していない場合、Ｌｏｎｇ  Ｍｅｔｈｏｄリスト生成部１０５Ａは、そのプログラム要素のＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ１１８および保守性指標１１９を読み込む（１２０５、１２０６）。
【００５７】
次に、Ｌｏｎｇ  Ｍｅｔｈｏｄリスト生成部１０５Ａは、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ１１８がＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ閾値１１２以上、かつ、保守性指標１１９が保守性指標閾値１１３以下であるかを判断する（１２０７）。１２０７の条件を満たす場合、Ｌｏｎｇ  Ｍｅｔｈｏｄリスト生成部１０５Ａは、Ｌｏｎｇ  Ｍｅｔｈｏｄリスト１２０Ａにプログラム要素およびその他の情報を追加し（１２０８）、１２０４に戻る。１２０７の条件を満たさない場合、１２０８をスキップし、１２０４に戻る。全てのプログラム要素に対してＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ１１８および保守性指標１１９をＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ閾値１１２および保守性指標閾値１１３とそれぞれ比較すると、処理を終了する。
【００５８】
なお、空のＬｏｎｇ  Ｍｅｔｈｏｄリスト１２０Ａの用意（１２０１）、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ閾値１１２の読み込み（１２０２）および保守性指標閾値１１３の読み込み（１２０３）の順序については問わない。また、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ１１８の読み込み（１２０５）および保守性指標１１９の読み込み（１２０６）の順序については問わない。
【００５９】
図１３は、図２のＬｏｎｇ  Ｍｅｔｈｏｄ条件設定部で表示される保守性指標を横軸、プログラム要素数を縦軸としたヒストグラムの一例を示す図である。
図１３の例では、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ閾値１１２として６０を、保守性指標閾値１１３として３０を設定した場合を示す。ヒストグラムは、凡例１３０１、保守性指標閾値軸１３０２、縦軸としてプログラム要素数１３０３、横軸として保守性指標１３０４を備える。ヒストグラム本体１３０５は、全プログラム要素のヒストグラム１３０６およびＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅが閾値以上のプログラム要素のヒストグラム１３０７を備える。Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅが閾値以上のプログラム要素のうち、保守性指標閾値軸１３０２よりも左に存在するプログラム要素が、Ｌｏｎｇ  Ｍｅｔｈｏｄリスト生成部１０５ＡにおいてＬｏｎｇ  Ｍｅｔｈｏｄと判定される。閾値設定者は、このヒストグラムを参考にＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ閾値１１２と保守性指標閾値１１３を変更することができる。
【００６０】
図１４は、図２のＬｏｎｇ  Ｍｅｔｈｏｄ条件設定部で表示されるＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅを横軸、プログラム要素数を縦軸としたヒストグラムの一例を示す図である。
図１４の例では、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ閾値１１２として６０を、保守性指標閾値１１３として３０を設定した場合を示す。ヒストグラムは、凡例１４０１、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ閾値軸１４０２、縦軸としてプログラム要素数１４０３、横軸としてＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ１４０４を備える。ヒストグラム本体１４０５は、全プログラム要素のヒストグラム１４０６および保守性指標が閾値以下のプログラム要素のヒストグラム１４０７を備える。保守性指標が閾値以下のプログラム要素のうち、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ閾値軸１４０２よりも右に存在するプログラム要素が、Ｌｏｎｇ  Ｍｅｔｈｏｄリスト生成部１０５ＡにおいてＬｏｎｇ  Ｍｅｔｈｏｄと判定される。閾値設定者は、このヒストグラムを参考にＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ閾値１１２と保守性指標閾値１１３を変更することができる。
【００６１】
このように、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ１１８および保守性指標１１９を用いることで、アンチパターンの１つであるＬｏｎｇ  Ｍｅｔｈｏｄに該当するプログラム要素を見つけ出し、分割すべきプログラム要素としてリスト化することができる。この時、閾値設定者は、図１３または図１４のヒストグラムを参考にＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ閾値１１２と保守性指標閾値１１３を変更することにより、Ｌｏｎｇ  Ｍｅｔｈｏｄとして抽出されるプログラム要素の個数を変化させることができる。
【００６２】
（第２実施形態）
第２実施形態は、第１実施形態で示したＬｏｎｇ  Ｍｅｔｈｏｄ条件設定部１０４ＡおよびＬｏｎｇ  Ｍｅｔｈｏｄリスト生成部１０５Ａにおいて、実施例１で示した入力に加え、バグ履歴情報および可読性低下ワード条件も入力として用いる場合について示したものである。
【００６３】
図１５は、第２実施形態に係るソースコード解析装置の機能的な構成を示すブロック図である。
図１５において、ソースコード解析装置１０Ｂは、図２のソースコード解析装置１０ＡのＬｏｎｇ  Ｍｅｔｈｏｄ条件設定部１０４ＡおよびＬｏｎｇ  Ｍｅｔｈｏｄリスト生成部１０５Ａの代わりにＬｏｎｇ  Ｍｅｔｈｏｄ条件設定部１０４ＢおよびＬｏｎｇ  Ｍｅｔｈｏｄリスト生成部１０５Ｂを備える。
【００６４】
ソースコード解析にあたって、ソースコード解析装置１０Ｂには、ソースコード１０９、ソースコード１０９のプログラム要素変更履歴１１０、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ閾値１１２および保守性指標閾値１１３に加え、バグ履歴情報１１１および可読性低下ワード条件１１４が入力される。バグ履歴情報１１１は、各プログラム要素について過去に発生したバグの内容とその原因を記録したものである。可読性低下ワード条件１１４は、Ｌｏｎｇ  Ｍｅｔｈｏｄ生成部１０５Ｂで各プログラム要素がＬｏｎｇ  Ｍｅｔｈｏｄか否かを判断するときに用いるバグ履歴情報１１１におけるバグ発生原因の判断条件を記録したものである。
【００６５】
Ｌｏｎｇ  Ｍｅｔｈｏｄ条件設定部１０４Ｂは、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ１１８と保守性指標１１９とバグ履歴情報１１１を受け付けて、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ閾値１１２、保守性指標閾値１１３および可読性低下ワード条件１１４を設定可能にする。この時、Ｌｏｎｇ  Ｍｅｔｈｏｄ条件設定部１０４Ｂは、可読性低下ワードの有無別に、プログラム要素数と保守性指標１１９との関係およびプログラム要素数とＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ１１８との関係を表示させることができる。そして、閾値設定者は、これらの関係を参照しながら、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ閾値１１２、保守性指標閾値１１３および可読性低下ワード条件１１４を設定することができる。
【００６６】
Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ閾値１１２、保守性指標閾値１１３、バグ履歴情報１１１および可読性低下ワード条件１１４は、Ｌｏｎｇ  Ｍｅｔｈｏｄリスト生成部１０５Ｂに入力される。Ｌｏｎｇ  Ｍｅｔｈｏｄリスト生成部１０５Ｂは、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ１１８と、保守性指標１１９と、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ閾値１１２と、保守性指標閾値１１３と、バグ履歴情報１１１と、可読性低下ワード条件１１４を受け付けて、Ｌｏｎｇ  Ｍｅｔｈｏｄリスト１２０Ａを生成する。
【００６７】
ここで、Ｌｏｎｇ  Ｍｅｔｈｏｄリスト生成部１０５Ｂは、Ｌｏｎｇ  Ｍｅｔｈｏｄ  ＳｃｏｒｅがＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ閾値１１２以上かつ保守性指標が保守性指標閾値１１３以下、さらにバグ発生要因が可読性低下ワード条件１１４を満たすプログラム要素をＬｏｎｇ  Ｍｅｔｈｏｄと判断することができる。あるいは、Ｌｏｎｇ  Ｍｅｔｈｏｄリスト生成部１０５Ｂは、Ｌｏｎｇ  Ｍｅｔｈｏｄ  ＳｃｏｒｅがＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ閾値１１２以上、さらにバグ発生要因が可読性低下ワード条件１１４を満たすプログラム要素をＬｏｎｇ  Ｍｅｔｈｏｄと判断するようにしてもよい。あるいは、Ｌｏｎｇ  Ｍｅｔｈｏｄリスト生成部１０５Ｂは、保守性指標が保守性指標閾値１１３以下、さらにバグ発生要因が可読性低下ワード条件１１４を満たすプログラム要素をＬｏｎｇ  Ｍｅｔｈｏｄと判断するようにしてもよい。
【００６８】
ここで、ソースコード解析装置１０Ｂは、コードメトリクス１１７およびコミット情報１０８に基づいてＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ１１８を生成し、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ１１８およびバグ発生要因に基づいてプログラム要素がＬｏｎｇ  Ｍｅｔｈｏｄかどうかを判定することにより、ソースコード１０９に含まれる分割すべきプログラム要素を提示することが可能となる。この時、バグ発生要因が可読性低下ワード条件１１４を満たす場合、プログラムの読み間違えを引き起こしやすく、そのプログラム要素がＬｏｎｇ  Ｍｅｔｈｏｄである可能性が高くなる。このため、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ１１８および保守性指標１１９に加え、バグ履歴情報１１１を参照しつつ、ソースコード１０９のプログラム要素がＬｏｎｇ  Ｍｅｔｈｏｄであるかどうかを判断することにより、Ｌｏｎｇ  Ｍｅｔｈｏｄの判定精度を向上させることが可能となる。
【００６９】
図１６は、図１５のソースコード解析装置に入力されるバグ履歴情報の一例を示す図である。
図１６において、バグ履歴情報１１１はプログラム要素ごとに存在する。バグ履歴情報１１１は、バグ履歴情報１１１がどのプログラム要素に対応しているかを示すプログラム要素名１６０１と、当該プログラム要素における過去のバグ情報１６０２を備える。過去のバグ情報１６０２は、当該プログラム要素におけるバグレコード１６０５を備える。バグレコード１６０５は、当該プログラム要素における当該バグのバグ内容１６０３と、バグ発生原因１６０４を備える。例えば、プログラム要素１のバグ履歴情報１１１において、バグ内容１６０３として、バグ内容Ｂ１、Ｂ２、バグ発生原因１６０４として、例外処理見落としおよび条件分岐の検討漏れが記録されている。ただし、バグ内容１６０３については省略することも可能である。
【００７０】
また、可読性低下ワード条件１１４として、例えば、「（理解｜認識｜考慮｜確認｜見直｜検討｜修正）＊（漏れ｜不足｜不十分｜怠｜忘れ｜失念）」を設定する。この例では、可読性低下ワード条件１１４を正規表現の形で示しているが、この方法に限らず自然言語のマッチング条件を表現可能な任意の方法でよい。また、可読性低下ワード条件１１４に用いる単語およびその組合せについても、可読性低下を表すものであれば任意の単語の任意の組合せでよい。
【００７１】
図１７は、図１５のＬｏｎｇ  Ｍｅｔｈｏｄ条件設定部の処理を示すフローチャートである。
図１７において、Ｌｏｎｇ  Ｍｅｔｈｏｄ条件設定部１０４Ｂは、全てのプログラム要素に対してＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ１１８、保守性指標１１９およびバグ履歴情報１１１を読み込んだかどうかを判断する（１７０１）。全てのプログラム要素に対してＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ１１８、保守性指標１１９およびバグ履歴情報１１１を読み込んでいない場合、Ｌｏｎｇ  Ｍｅｔｈｏｄ条件設定部１０４Ｂは、そのプログラム要素のＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ１１８、保守性指標１１９およびバグ履歴情報１１１を読み込む（１７０２、１７０３、１７０４）。
【００７２】
Ｌｏｎｇ  Ｍｅｔｈｏｄ条件設定部１０４Ｂは、全てのプログラム要素に対してＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ１１８、保守性指標１１９およびバグ履歴情報１１１を読み込むと、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ閾値１１２、保守性指標閾値１１３およびバグ履歴情報１１１に対して初期値を設定する（１７０５）。ここで、初期値としてどのような値を選んでもよい。
【００７３】
次に、Ｌｏｎｇ  Ｍｅｔｈｏｄ条件設定部１０４Ｂは、保守性指標を横軸、プログラム要素数を縦軸としたヒストグラムを可読性低下ワードの有無別に表示する（１７０６）。このヒストグラムの表示は、閾値設定者がＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ閾値１１２、保守性指標閾値１１３および可読性低下ワード条件１１４の設定を行うのを支援する。
【００７４】
次に、Ｌｏｎｇ  Ｍｅｔｈｏｄ条件設定部１０４Ｂは、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅを横軸、プログラム要素数を縦軸としたヒストグラムを可読性低下ワードの有無別に表示する（１７０７）。このヒストグラムの表示は、閾値設定者がＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ閾値１１２、保守性指標閾値１１３および可読性低下ワード条件１１４の設定を行うのを支援する。
【００７５】
次に、Ｌｏｎｇ  Ｍｅｔｈｏｄ条件設定部１０４Ｂは、閾値設定者による閾値の設定を続けるか否かの判断を受け付ける（１７０８）。閾値設定者が閾値の設定を続けると判断した場合、Ｌｏｎｇ  Ｍｅｔｈｏｄ条件設定部１０４Ｂは、閾値設定者によるＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ閾値１１２の数値入力を受け付け、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ閾値１１２として設定する（１７０９）。次に、Ｌｏｎｇ  Ｍｅｔｈｏｄ条件設定部１０４Ｂは、閾値設定者による保守性指標閾値１１３の数値入力を受け付け、保守性指標閾値１１３として設定する（１７１０）。次に、Ｌｏｎｇ  Ｍｅｔｈｏｄ条件設定部１０４Ｂは、閾値設定者による可読性低下ワード条件１１４の文字入力を受け付け、可読性低下ワード条件１１４として設定する（１７１１）。
【００７６】
次に、Ｌｏｎｇ  Ｍｅｔｈｏｄ条件設定部１０４Ｂは、閾値設定者の入力をＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ閾値１１２、保守性指標閾値１１３および可読性低下ワード条件１１４として設定すると、１７０６に戻る。そして、Ｌｏｎｇ  Ｍｅｔｈｏｄ条件設定部１０４Ｂは、閾値設定者が閾値の設定を続けないと判断するまで、１７０６〜１７１１の処理を繰り返し、閾値設定者が閾値の設定を続けないと判断すると、処理を終了する。
【００７７】
なお、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ１１８の読み込み（１７０２）、保守性指標１１９の読み込み（１７０３）およびバグ履歴情報１１１の読み込み（１７０４）の順序については問わない。また、閾値設定者によるＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ閾値１１２の入力（１７０９）、保守性指標閾値１１３の入力（１７１０）および可読性低下ワード条件１１４の入力（１７１１）の順序については問わない。
【００７８】
図１８は、図１５のＬｏｎｇ  Ｍｅｔｈｏｄリスト生成部の処理を示すフローチャートである。
図１８において、Ｌｏｎｇ  Ｍｅｔｈｏｄリスト生成部１０５Ｂは、空のＬｏｎｇ  Ｍｅｔｈｏｄリスト１２０Ａを用意する（１８０１）。次に、Ｌｏｎｇ  Ｍｅｔｈｏｄリスト生成部１０５Ｂは、プログラム要素のＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ閾値１１２、保守性指標閾値１１３および可読性低下ワード条件１１４を読み込む（１８０２、１８０３、１８０４）。
【００７９】
次に、Ｌｏｎｇ  Ｍｅｔｈｏｄリスト生成部１０５Ｂは、全てのプログラム要素に対してＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ１１８、保守性指標１１９およびバグ履歴情報１１１のバグ発生要因をＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ閾値１１２、保守性指標閾値１１３および可読性低下ワード条件１１４とそれぞれ比較したかどうかを判断する（１８０５）。全てのプログラム要素に対してＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ１１８、保守性指標１１９およびバグ履歴情報１１１のバグ発生要因をＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ閾値１１２、保守性指標閾値１１３および可読性低下ワード条件１１４とそれぞれ比較していない場合、Ｌｏｎｇ  Ｍｅｔｈｏｄリスト生成部１０５Ｂは、そのプログラム要素のＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ１１８、保守性指標１１９およびバグ履歴情報１１１を読み込む（１８０６、１８０７、１８０８）。
【００８０】
次に、Ｌｏｎｇ  Ｍｅｔｈｏｄリスト生成部１０５Ｂは、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ１１８がＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ閾値１１２以上、かつ、保守性指標１１９が保守性指標閾値１１３以下、かつ、バグ発生要因が可読性低下ワード条件１１４を満たすかどうかを判断する（１８０９）。１８０９の条件を満たす場合、Ｌｏｎｇ  Ｍｅｔｈｏｄリスト生成部１０５Ｂは、Ｌｏｎｇ  Ｍｅｔｈｏｄリスト１２０Ａにプログラム要素を追加し（１８１０）、１８０５に戻る。１８０９の条件を満たさない場合、１８１０をスキップし、１８０５に戻る。全てのプログラム要素に対してＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ１１８、保守性指標１１９およびバグ履歴情報１１１のバグ発生要因をＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ閾値１１２、保守性指標閾値１１３および可読性低下ワード条件１１４とそれぞれ比較すると、処理を終了する。
【００８１】
なお、空のＬｏｎｇ  Ｍｅｔｈｏｄリストの用意（１８０１）、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ閾値１１２の読み込み（１８０２）、保守性指標閾値１１３の読み込み（１８０３）および可読性低下ワード条件１１４の読み込み（１８０４）の順序については問わない。また、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ１１８の読み込み（１８０６）、保守性指標１１９の読み込み（１８０７）およびバグ履歴情報１１１の読み込み（１８０８）の順序については問わない。
【００８２】
図１９は、図１５のＬｏｎｇ  Ｍｅｔｈｏｄ条件設定部で表示される保守性指標を横軸、プログラム要素数を縦軸としたヒストグラムの一例を示す図である。
図１９の例では、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ閾値１１２として６０を、保守性指標閾値１１３として３０を設定した場合を示す。ヒストグラムは、凡例１９０１、保守性指標閾値軸１３０２、縦軸としてプログラム要素数１３０３、横軸として保守性指標１３０４を備える。ヒストグラム本体１９０５は、全プログラム要素のヒストグラム１３０６、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅが閾値以上のプログラム要素のヒストグラム１３０７およびＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅが閾値以上かつ可読性低下ワードを含むプログラム要素のヒストグラム１９０２を備える。Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅが閾値以上かつ可読性低下ワードを含むプログラム要素のうち、保守性指標閾値軸１３０２よりも左に存在するプログラム要素が、Ｌｏｎｇ  Ｍｅｔｈｏｄリスト生成部１０５ＢにおいてＬｏｎｇ  Ｍｅｔｈｏｄと判定される。閾値設定者は、このヒストグラムを参考にＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ閾値１１２と保守性指標閾値１１３と可読性低下ワード条件１１４を変更することができる。
【００８３】
図２０は、図１５のＬｏｎｇ  Ｍｅｔｈｏｄ条件設定部で表示されるＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅを横軸、プログラム要素数を縦軸としたヒストグラムの一例を示す図である。
図２０の例では、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ閾値１１２として６０を、保守性指標閾値１１３として３０を設定した場合を示す。ヒストグラムは、凡例２００１、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ閾値軸１４０２、縦軸としてプログラム要素数１４０３、横軸としてＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ１４０４を備える。ヒストグラム本体２００５は、全プログラム要素のヒストグラム１４０６、保守性指標が閾値以下のプログラム要素のヒストグラム１４０７および保守性指標が閾値以下かつ可読性低下ワードを含むプログラム要素のヒストグラム２００２を備える。保守性指標が閾値以下かつ可読性低下ワードを含むプログラム要素のうち、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ閾値軸１４０２よりも右に存在するプログラム要素が、Ｌｏｎｇ  Ｍｅｔｈｏｄリスト生成部１０５ＢにおいてＬｏｎｇ  Ｍｅｔｈｏｄと判定される。閾値設定者は、このヒストグラムを参考にＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ閾値１１２と保守性指標閾値１１３と可読性低下ワード条件１１４を変更することができる。
【００８４】
このように、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ１１８および保守性指標１１９を用いるとともに、プログラム要素が可読性低下ワードを含むかどうかを判断することでアンチパターンの１つであるＬｏｎｇ  Ｍｅｔｈｏｄに該当するプログラム要素の判定精度を向上させることができる。
【００８５】
（第３実施形態）
第３実施形態は、図７のＬｏｎｇ  Ｍｅｔｈｏｄリスト１２０ＡのＬｏｎｇ  Ｍｅｔｈｏｄレコード７０２において、Ｌｏｎｇ  Ｍｅｔｈｏｄに該当するプログラム要素名７０１に加え、当該プログラム要素のＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅや保守性指標等も記録するものである。
図２１は、第３実施形態に係るソースコード解析装置で生成されるＬｏｎｇ  Ｍｅｔｈｏｄリストの一例を示す図である。
図２１において、Ｌｏｎｇ  Ｍｅｔｈｏｄリスト１２０Ｂは、各Ｌｏｎｇ  Ｍｅｔｈｏｄリスト生成部１０５Ａ、１０５ＢによってＬｏｎｇ  Ｍｅｔｈｏｄに該当すると判断されたプログラム要素をＬｏｎｇ  Ｍｅｔｈｏｄレコード２１０４として記録したものである。Ｌｏｎｇ  Ｍｅｔｈｏｄレコード２１０４は、Ｌｏｎｇ  Ｍｅｔｈｏｄに該当するプログラム要素名２１０１と、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ２１０２と、保守性指標２１０３等を備える。Ｌｏｎｇ  Ｍｅｔｈｏｄレコード２１０４にはさらに他の情報を含めてもよい。
【００８６】
（第４実施形態）
第４実施形態は、図７のＬｏｎｇ  Ｍｅｔｈｏｄリスト１２０Ａまたは図２１のＬｏｎｇ  Ｍｅｔｈｏｄリスト１２０Ｂを生成後、さらに、Ｌｏｎｇ  Ｍｅｔｈｏｄリスト１２０Ａ、１２０Ｂ中の各プログラム要素をサブアンチパターンに分類し、サブアンチパターンに応じて改善箇所を示したソースコードを生成する。
【００８７】
図２２は、第４実施形態に係るソースコード解析装置の機能的な構成を示すブロック図である。
図２２において、ソースコード解析装置１０Ｃは、図１５のソースコード解析装置１０Ｂの構成に加え、サブアンチパターン分類部１０６と、改善箇所マッピング部１０７を備える。これらの機能は、第１実施形態から第３実施形態の場合と同様に実現される。
【００８８】
ソースコード解析にあたって、ソースコード解析装置１０Ｃには、ソースコード１０９、ソースコード１０９のプログラム要素変更履歴１１０、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ閾値１１２および保守性指標閾値１１３、バグ履歴情報１１１および可読性低下ワード条件１１４に加え、サブアンチパターン定義情報１１５および改善カタログ情報１１６が入力される。
【００８９】
サブアンチパターン分類部１０６は、解析対象となるソースコード１０９と、サブアンチパターン定義情報１１５と、プログラム要素変更履歴１１０と、コードメトリクス１１７と、Ｌｏｎｇ  Ｍｅｔｈｏｄリスト１２０Ｂを受け付けて、サブアンチパターンリスト１２１を生成する。改善箇所マッピング部１０７は、ソースコード１０９と、改善カタログ情報１１６を受け付けて、改善箇所を示したソースコード１２２を生成する。ソースコードの改善箇所はプログラムの行単位またトークン単位で示すことができる。
【００９０】
Ｌｏｎｇ  Ｍｅｔｈｏｄの改善箇所は、例えば、以下のＡ）〜Ｄ）に分類することができる。
Ａ）処理の切れ目があれば、その切れ目
Ｂ）分岐先に共通部分があれば、その共通部分を括りだして関数化するような箇所
Ｃ）次にどの状態に遷移するかを判断する処理と、その状態で実行する処理を分割する切れ目
Ｄ）本来の処理に例外処理が追加されている場合、本来の処理と例外処理を分割する切れ目
【００９１】
情報記憶部２００は、コードメトリクス１１７と、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ１１８と、保守性指標１１９に加えて、Ｌｏｎｇ  Ｍｅｔｈｏｄリスト１２０Ｂおよびサブアンチパターンリスト１２１を記憶する。情報記憶部２００は、これらの情報以外にも、コードメトリクス取得部１０１や、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ計算部１０２や、保守性指標計算部１０３や、Ｌｏｎｇ  Ｍｅｔｈｏｄ条件設定部１０４Ｂや、Ｌｏｎｇ  Ｍｅｔｈｏｄリスト生成部１０５Ｂや、サブアンチパターン分類部１０６や、改善箇所マッピング部１０７が適宜参照もしくは生成する情報等を記憶する。情報記憶部２００は、補助記憶装置１３に記憶する情報を、例えば、ファイルシステムやＤＢＭＳ（ＤａｔａＢａｓｅ  Ｍａｎａｇｅｍｅｎｔ  Ｓｙｓｔｅｍ）によって管理することができる。
【００９２】
ここで、ソースコード解析装置１０Ｃは、サブアンチパターン定義情報１１５に基づいて、分割すべきプログラム要素をサブアンチパターンに分類し、改善カタログ情報１１６に基づいて改善箇所を示したソースコード１２２を提示することにより、リファクタリング作業者は、メソッドの分割箇所について自ら判断することなく、メソッド内のどの箇所でメソッド分割を行えばよいのかについて認識することができ、機能の拡張または変更が繰り返されたソフトウェアの可読性を向上させることができる。
【００９３】
なお、図２２では、図１５のソースコード解析装置１０Ｂの構成にサブアンチパターン分類部１０６と改善箇所マッピング部１０７を追加した構成を示したが、図２のソースコード解析装置１０Ａの構成にサブアンチパターン分類部１０６と改善箇所マッピング部１０７を追加してもよい。
【００９４】
図２３は、図２２のソースコード解析装置に入力されるサブアンチパターン定義情報の一例を示す図である。
図２３において、サブアンチパターン定義情報１１５は、アンチパターンの１つであるＬｏｎｇ  Ｍｅｔｈｏｄをさらにサブアンチパターンへと分類するための定義情報をサブアンチパターン定義レコード２３０３として記録したものである。サブアンチパターンレコード２３０３は、当該サブアンチパターンの名称２３０１と、当該サブアンチパターンの定義２３０２を備える。
【００９５】
サブアンチパターン定義２３０２において、１つのプログラム要素が複数のサブアンチパターンに当てはまるような定義になっていてもよい。また、サブアンチパターン定義２３０２の記述方法は問わないが、ソースコード１０９と、コードメトリクス１１７と、プログラム要素変更履歴１１０の組合せで定義することができる。サブアンチパターンとして、例えば、「箇条書き」が挙げられる。これは複数の処理ブロックを一連の処理として記述したサブアンチパターンである。その他にも、多くの条件文からなるサブアンチパターンである「大量の条件文」や、状態遷移を行っているコード中で当該状態での処理本体と、状態遷移のための処理を混同して記述したサブアンチパターンである「状態遷移」が挙げられる。さらに、本来の処理に例外処理が追加されているサブアンチパターンである「塩漬け」が挙げられる。
【００９６】
図２４は、図２２のソースコード解析装置で生成されるサブアンチパターンリストの一例を示す図である。
図２４において、サブアンチパターンリスト１２１は、図２１のＬｏｎｇ  Ｍｅｔｈｏｄリスト１２０Ｂの各Ｌｏｎｇ  Ｍｅｔｈｏｄレコード２１０４に対し、Ｌｏｎｇ  Ｍｅｔｈｏｄとして分類されたサブアンチパターンの名称２３０１が追記されたサブアンチパターン分類レコード２４０２を備える。
【００９７】
例えば、プログラム要素１は、図２３のサブアンチパターン定義２３０２で定義されたサブアンチパターンＡ１に該当するものとすると、プログラム要素１のサブアンチパターン分類レコード２４０２にサブアンチパターンＡ１という名称２３０１が追記される。また、プログラム要素２は、図２３のサブアンチパターン定義２３０２で定義されたサブアンチパターンＡ２に該当するものとすると、プログラム要素２のサブアンチパターン分類レコード２４０２にサブアンチパターンＡ２という名称２３０１が追記される。
【００９８】
なお、当該プログラム要素に複数のサブアンチパターンが当てはまる場合、同一のプログラム要素名でサブアンチパターンの異なる複数のサブアンチパターン分類レコード２４０５が存在してよい。
また、図２４では、図２１のＬｏｎｇ  Ｍｅｔｈｏｄリスト１２０Ｂの各Ｌｏｎｇ  Ｍｅｔｈｏｄレコード２１０４に対し、Ｌｏｎｇ  Ｍｅｔｈｏｄとして分類されたサブアンチパターンの名称２３０１を追記した例を示したが、図７のＬｏｎｇ  Ｍｅｔｈｏｄリスト１２０Ａの各Ｌｏｎｇ  Ｍｅｔｈｏｄレコード７０２に対し、Ｌｏｎｇ  Ｍｅｔｈｏｄとして分類されたサブアンチパターンの名称２３０１を追記してもよい。
【００９９】
図２５は、図２２のソースコード解析装置に入力される改善カタログ情報の一例を示す図である。
図２５において、改善カタログ情報１１６は、サブアンチパターン定義情報１１５に定義された各サブアンチパターンに対するプログラム改善方法を、改善方法レコード２５０３として記録したものである。改善方法レコード２５０３は、当該サブアンチパターンの名称２５０１と、当該サブアンチパターンの改善方法２５０２を備える。改善方法２５０２の記述方法は問わない。
【０１００】
図２６は、図２２のサブアンチパターン分類部の処理を示すフローチャートである。
図２６において、サブアンチパターン分類部１０６は、空のサブアンチパターンリスト１２１を用意する（２６０１）。次に、サブアンチパターン分類部１０６は、解析対象プログラムのソースコード１０９、サブアンチパターン定義情報１１５およびＬｏｎｇ  Ｍｅｔｈｏｄリスト１２０Ｂを読み込む（２６０２、２６０３、２６０４）。
【０１０１】
次に、サブアンチパターン分類部１０６は、Ｌｏｎｇ  Ｍｅｔｈｏｄリスト１２０Ｂ中の全てのプログラム要素に対してコードメトリクス１１７およびプログラム要素変更履歴１１０を読み込んだかどうかを判断する（２６０５）。Ｌｏｎｇ  Ｍｅｔｈｏｄリスト１２０Ｂ中の全てのプログラム要素に対してコードメトリクス１１７およびプログラム要素変更履歴１１０を読み込んでいない場合、サブアンチパターン分類部１０６は、コードメトリクス１１７およびプログラム要素変更履歴１１０を読み込む（２６０６、２６０７）。取得するコードメトリクスの種類としては、サブアンチパターン定義情報１１５に記載のあるものを選択する。
【０１０２】
次に、サブアンチパターン分類部１０６は、Ｌｏｎｇ  Ｍｅｔｈｏｄリスト１２０Ｂ中のプログラム要素のソースコードパターン、コードメトリクス１１７およびプログラム要素変更履歴１１０がサブアンチパターン定義を満たすかどうかの判断を全てのサブアンチパターン定義情報１１５に対して実施したかどうかを判断する（２６０８）。Ｌｏｎｇ  Ｍｅｔｈｏｄリスト１２０Ｂ中のプログラム要素のソースコードパターン、コードメトリクス１１７およびプログラム要素変更履歴１１０がサブアンチパターン定義を満たすかどうかの判断を全てのサブアンチパターン定義情報１１５に対して実施していない場合、サブアンチパターン分類部１０６は、プログラム要素のソースコードパターン、コードメトリクス１１７およびプログラム要素変更履歴１１０がサブアンチパターン定義を満たすかどうかを判断する（２６０９）。
【０１０３】
２６０９の条件を満たす場合、サブアンチパターン分類部１０６は、サブアンチパターンリスト１２１にプログラム要素およびサブアンチパターンを追加し（２６１０）、２６０８に戻る。２６０９の条件を満たさない場合、２６１０をスキップし、２６０８に戻る。Ｌｏｎｇ  Ｍｅｔｈｏｄリスト１２０Ｂ中のプログラム要素のソースコードパターン、コードメトリクス１１７およびプログラム要素変更履歴１１０がサブアンチパターン定義を満たすかどうかの判断を全てのサブアンチパターン定義情報１１５に対して実施すると、２６０５に戻る。Ｌｏｎｇ  Ｍｅｔｈｏｄリスト１２０Ｂ中の全てのプログラム要素に対して２６０６〜２６１０の処理を実行すると、処理を終了する。
【０１０４】
なお、空のサブアンチパターンリスト１２１の用意（２６０１）、ソースコード１０９の読み込み（２６０２）、サブアンチパターン定義情報１１５の読み込み（２６０３）およびＬｏｎｇ  Ｍｅｔｈｏｄリスト１２０Ｂの読み込み（２６０４）の順序については問わない。また、コードメトリクス１１７の読み込み（２６０６）およびプログラム要素変更履歴１１０の読み込み（２６０７）の順序については問わない。
【０１０５】
図２７は、図２２の改善箇所マッピング部の処理を示すフローチャートである。
図２７において、改善箇所マッピング部１０７は、解析対象プログラムのソースコード１０９、改善カタログ情報１１６およびサブアンチパターンリスト１２１を読み込む（２７０１、２７０２、２７０３）。次に、改善箇所マッピング部１０７は、サブアンチパターンリスト１２１中の全てのプログラム要素に対して改善箇所を示したソースコード１２２を生成したかどうかを判断する（２７０４）。サブアンチパターンリスト１２１中の全てのプログラム要素に対して改善箇所を示したソースコード１２２を生成していない場合、改善箇所マッピング部１０７は、改善カタログ情報１１６に従い、プログラム要素のソースコードに分割すべき箇所をマッピングし、改善箇所を示したソースコード１２２を生成し、２７０４に戻る（２７０５）。改善箇所の示し方については問わない。サブアンチパターンリスト１２１中の全てのプログラム要素に対して改善箇所を示したソースコード１２２を生成すると、処理を終了する。
【０１０６】
なお、ソースコード１０９の読み込み（２７０１）、改善カタログ情報１１６の読み込み（２７０２）およびサブアンチパターンリスト１２１の読み込み（２７０３）の順序については問わない。このように、Ｌｏｎｇ  Ｍｅｔｈｏｄリスト生成後に、Ｌｏｎｇ  Ｍｅｔｈｏｄの改善箇所を示すことで、プログラム修正者のプログラム修正を支援することができる。
【０１０７】
（第５実施形態）
Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ計算部１０２は、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅの計算方法として可読性スコアおよび変更発生スコアを用いる。上述した第１実施形態では、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ計算部１０２の処理を図９のフローチャートで示した際、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ１１８の計算方法（９０４）については問わないとしたが、本実施形態では、その計算方法として、可読性スコアおよび変更発生スコアを用いる。可読性スコアとは、当該プログラム要素の可読性を数値化したものであり、その計算方法は問わない。変更発生スコアとは、当該プログラム要素に対する変更発生の度合いを数値化したものであり、その計算方法は問わない。また、可読性スコアと変更発生スコアをどのように用いてＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ１１８を計算するかについても問わない。
【０１０８】
（第６実施形態）
図２８は、第６実施形態に係るソースコード解析装置から出力される改善箇所を示したソースコードの一例を示す図である。
図２８において、改善箇所を示したソースコード１２２は、当該プログラム要素のソースコード２８０１と、当該プログラム要素のソースコード２８０１中の改善対象箇所２８０２と、改善方法を示すソースコード２８０３を備える。
【０１０９】
図２８の例では、プログラム要素のソースコード２８０１がＬｏｎｇ  Ｍｅｔｈｏｄとして抽出されている。この時、Ｌｏｎｇ  Ｍｅｔｈｏｄリスト生成部１０５Ｂは、当該プログラム要素のソースコード２８０１をＬｏｎｇ  Ｍｅｔｈｏｄリスト１２０Ｂに登録する。
【０１１０】
このソースコード２８０１は、本来の処理に例外処理Ｒ１、Ｒ２が追加されているサブアンチパターンである。この時、サブアンチパターン分類部１０６は、本来の処理に例外処理Ｒ１、Ｒ２が追加されているサブアンチパターンとして、当該プログラム要素のソースコード２８０１をサブアンチパターンリスト１２１に登録する。
【０１１１】
改善箇所マッピング部１０７は、当該プログラム要素のソースコード２８０１中の改善対象箇所２８０２として例外処理Ｒ１、Ｒ２を特定する。そして、改善箇所マッピング部１０７は、例外処理Ｒ１、Ｒ２を関数化したコードを、改善方法を示すソースコード２８０３として提示する。
【０１１２】
これにより、リファクタリング作業者は、メソッドの分割箇所について自ら判断することなく、当該プログラム要素のソースコード２８０１から例外処理Ｒ１、Ｒ２を分割することができ、本来の処理に例外処理Ｒ１、Ｒ２が追加されたソフトウェアの可読性を向上させることができる。
【０１１３】
（第７実施形態）
Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ計算部１０２は、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅの計算方法として可読性スコアおよび変更発生スコアの調和平均を用いる。上述した第５実施形態では、可読性スコアと変更発生スコアをどのように用いてＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ１１８を計算するかについては問わないとしたが、本実施形態では、その計算方法を可読性スコアおよび変更発生スコアの調和平均とする。ただし、可読性スコアおよび変更発生スコアの計算方法は問わない。調和平均は、逆数の算術平均の逆数として定義される。すなわち、本実施例では何らかの方法で求めた可読性スコアの逆数と、何らかの方法で求めた変更発生スコアの逆数の算術平均を計算し、その逆数をＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ１１８とする。
【０１１４】
例えば、可読性低下スコアは、コメント抜き行数、循環的複雑度、コメント行数およびローカル変数宣言数を正規化した４値の調和平均値とすることができる。変更発生スコアは、コミット当たりの変更箇所数および重み付きコミット回数を正規化した２値の調和平均値とすることができる。Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ１１８は、可読性低下スコアおよび変更発生スコアの調和平均値とすることができる。
【０１１５】
（第８実施形態）
図２９は、第８実施形態に係るソースコード解析装置の画面遷移の一例を示す図である。
図２９において、ソースコード解析装置１０Ｃの画面は、解析対象選択画面２９０１と、Ｌｏｎｇ  Ｍｅｔｈｏｄ条件設定画面２９０２と、Ｌｏｎｇ  Ｍｅｔｈｏｄ一覧画面２９０３と、改善箇所表示画面２９０４を備える。解析対象選択画面２９０１とＬｏｎｇ  Ｍｅｔｈｏｄ条件設定画面２９０２の間は双方向に遷移可能である。Ｌｏｎｇ  Ｍｅｔｈｏｄ条件設定画面２９０２とＬｏｎｇ  Ｍｅｔｈｏｄ一覧画面２９０３の間は双方向に遷移可能である。Ｌｏｎｇ  Ｍｅｔｈｏｄ一覧画面２９０３と改善箇所表示画面２９０４の間は双方向に遷移可能である。改善箇所表示画面２９０４からは、解析対象選択画面２９０１に遷移可能である。
【０１１６】
図３０は、図２２のソースコード解析装置の解析対象選択画面の一例を示す図である。
図３０において、解析対象選択画面２９０１は、解析タブ３００１と設定タブ３００２を備える。解析タブ３００１は、解析対象ソースコード１０９を選択するための解析対象ソースコード選択部３００３と、バグ履歴情報１１１を選択するためのバグ履歴情報選択部３００４と、プログラム要素変更履歴１１０を選択するためのプログラム要素変更履歴選択部３００５と、解析開始ボタン３００６を備える。
【０１１７】
ソースコード解析装置１０Ｃの利用者は、解析のたびに解析対象ソースコード選択部３００３と、バグ履歴情報選択部３００４と、プログラム要素変更履歴選択部３００５を用いて各データを選択し、解析ボタン３００６を押下し、解析を開始させる。ソースコード解析装置１０Ｃの利用者が解析ボタン３００６を押下すると、ソースコード解析装置１０内のコードメトリクス計算部１０１と、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ計算部１０２と、保守性指標計算部１０３と、Ｌｏｎｇ  Ｍｅｔｈｏｄ条件設定部１０４Ｂが動作し、ソースコード解析装置１０Ｃの画面はＬｏｎｇ  Ｍｅｔｈｏｄ条件設定画面２９０２へと遷移する。
【０１１８】
設定タブ３００２は、改善カタログ情報１１６を選択するための改善カタログ情報選択部３００７と、サブアンチパターン定義情報１１５を選択するためのサブアンチパターン定義情報選択部３００８を備える。ソースコード解析装置１０Ｃの利用者は、ソースコード解析装置１０Ｃの初回利用時に改善カタログ情報選択部３００７と、サブアンチパターン定義情報選択部３００８を用いて各データを選択する。２回目以降の利用であっても、改善カタログ情報１１６およびサブアンチパターン定義情報１１５を変更する必要がある場合は、改善カタログ情報選択部３００７およびサブアンチパターン定義情報選択部３００８を用いて各データを選択する。
【０１１９】
図３１は、図２２のソースコード解析装置のＬｏｎｇ  Ｍｅｔｈｏｄ条件設定画面の一例を示す図である。
図３１において、Ｌｏｎｇ  Ｍｅｔｈｏｄ条件設定画面２９０２は、閾値設定タブ３１０１とヒストグラムタブ３１０２と解析対象選択戻るボタン３１１３と設定完了ボタン３１１４を備える。
【０１２０】
閾値設定タブ３１０１は、Ｌｏｎｅ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ閾値１１２を設定するためのＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ閾値選択部３１０５と、保守性指標閾値１１３を選択するための保守性指標閾値選択部３１０６と、可読性低下ワード条件１１４を選択するための可読性低下ワード条件選択部３１０７を備える。
【０１２１】
ソースコード解析装置１０Ｃの利用者がＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ閾値選択部３１０５、保守性指標閾値選択部３１０６および可読性低下ワード条件選択部３１０７の値および条件を変更すると、それに応じてヒストグラムタブ３１０２内の保守性指標ヒストグラムタブ３１０３およびＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅヒストグラムタブ３１０４の内容が変更される。
【０１２２】
ヒストグラムタブ３１０２は、保守性指標ヒストグラムタブ３１０３と、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅヒストグラムタブ３１０４を備える。保守性指標ヒストグラムタブ３１０３内には図１９に示した内容が描かれており、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅヒストグラムタブ３１０４内には図２０に示した内容が描かれている。
【０１２３】
ソースコード解析装置１０Ｃの利用者は保守性指標ヒストグラムタブ３１０３およびＬｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅヒストグラムタブ３１０４の内容を参考に、Ｌｏｎｇ  Ｍｅｔｈｏｄ  Ｓｃｏｒｅ閾値選択部３１０５、保守性指標閾値選択部３１０６および可読性低下ワード条件選択部３１０７の値および条件を設定する。ソースコード解析装置１０Ｃの利用者が設定を完了した後、設定完了ボタン３１１４を押下すると、ソースコード解析装置１０Ｃ内のＬｏｎｇ  Ｍｅｔｈｏｄリスト生成部１０５Ｂとサブアンチパターン分類部１０６が動作し、画面はＬｏｎｇ  Ｍｅｔｈｏｄ一覧画面２９０３へと遷移する。一方、解析対象選択戻るボタン３１１３を押下すると、解析対象選択画面２９０１へと遷移する。
【０１２４】
図３２は、図２２のソースコード解析装置のＬｏｎｇ  Ｍｅｔｈｏｄ一覧画面の一例を示す図である。
図３２において、Ｌｏｎｇ  Ｍｅｔｈｏｄ一覧画面２９０３は、サブアンチパターンリスト表示部３２０１と、Ｌｏｎｇ  Ｍｅｔｈｏｄ条件設定戻るボタン３２０２を備える。サブアンチパターンリスト表示部３２０１はサブアンチパターンリスト１２１を表示する。ソースコード解析装置１０Ｃの利用者がサブアンチパターンリスト１２１中の各サブアンチパターン分類レコード２４０１のＬｏｎｇ  Ｍｅｔｈｏｄのプログラム要素を押下すると、改善箇所マッピング部１０７が動作し、画面は改善箇所表示画面２９０４へと遷移する。一方、Ｌｏｎｇ  Ｍｅｔｈｏｄ条件設定戻るボタン３２０２を押下すると、Ｌｏｎｇ  Ｍｅｔｈｏｄ条件設定画面２９０２へと遷移する。
【０１２５】
図３３は、図２２のソースコード解析装置の改善箇所表示画面の一例を示す図である。
図３３において、改善箇所表示画面２９０４は、改善箇所を示したソースコード表示部３３０１と、解析対象選択戻るボタン３３０２と、Ｌｏｎｇ  Ｍｅｔｈｏｄ一覧戻るボタン３３０３を備える。改善箇所を示したソースコード表示部３３０１は改善箇所を示したソースコード１２２を表示する。ソースコード解析装置１０Ｃの利用者は改善箇所表示画面２９０４を閲覧することで、ソースコードの改善箇所および改善方法を知ることができる。
【０１２６】
ソースコード解析装置１０Ｃの利用者が解析対象選択戻るボタン３３０２を押下すると、解析対象選択画面２９０１へと遷移する。一方、Ｌｏｎｇ  Ｍｅｔｈｏｄ一覧戻るボタン３３０３を押下すると、Ｌｏｎｇ  Ｍｅｔｈｏｄ一覧画面２９０３へと遷移する。
【符号の説明】
【０１２７】
１０…ソースコード解析装置、１１…プロセッサ、１２…主記憶装置、１３…補助記憶装置、１４…入力装置、１５…出力装置、１６…通信装置、１７…バス
【図１】
2019219848.tif 000003
【図２】
2019219848.tif 000004
【図３】
2019219848.tif 000005
【図４】
2019219848.tif 000006
【図５】
2019219848.tif 000007
【図６】
2019219848.tif 000008
【図７】
2019219848.tif 000009
【図８】
2019219848.tif 000010
【図９】
2019219848.tif 000011
【図１０】
2019219848.tif 000012
【図１１】
2019219848.tif 000013
【図１２】
2019219848.tif 000014
【図１３】
2019219848.tif 000015
【図１４】
2019219848.tif 000016
【図１５】
2019219848.tif 000017
【図１６】
2019219848.tif 000018
【図１７】
2019219848.tif 000019
【図１８】
2019219848.tif 000020
【図１９】
2019219848.tif 000021
【図２０】
2019219848.tif 000022
【図２１】
2019219848.tif 000023
【図２２】
2019219848.tif 000024
【図２３】
2019219848.tif 000025
【図２４】
2019219848.tif 000026
【図２５】
2019219848.tif 000027
【図２６】
2019219848.tif 000028
【図２７】
2019219848.tif 000029
【図２８】
2019219848.tif 000030
【図２９】
2019219848.tif 000031
【図３０】
2019219848.tif 000032
【図３１】
2019219848.tif 000033
【図３２】
2019219848.tif 000034
【図３３】
2019219848.tif 000035