(57)【要約】【課題】ソフトウェアモジュールの保守において無駄となる保守作業量を把握可能な凝集度計測装置を提供する。【解決手段】ソフトウェアモジュール内で関数や変数によって実現される機能とそれら機能毎の規模を併せて入力する機能入力部と、機能毎に関連情報を入力する関連情報入力部と、ソフトウェアモジュールのある機能に関連する機能群の規模の割合と機能の規模による加重平均の積によって凝集度を算出する凝集度算出部を備える凝集度計測装置。【選択図】図２
2013045426.tif 000002
【特許請求の範囲】
【請求項１】
ソフトウェアモジュール内で関数や変数によって実現される機能とそれら機能毎の規模を併せて入力する機能入力部と、
前記機能毎に関連情報を入力する関連情報入力部と、
前記ソフトウェアモジュールのある機能に関連する機能群の規模の割合と機能の規模による加重平均の積によって凝集度を算出する凝集度算出部を
備える凝集度計測装置。
【請求項２】
前記機能を記憶する機能記憶部と、
前記関連情報を記憶する関連記憶部を
備える請求項１記載の凝集度計測装置。
【請求項３】
前記関連情報は、ある機能同士が関連有り或いは関連無しである請求項１又は請求項２記載の凝集度計測装置。
【請求項４】
前記機能の規模は、ある機能を実現する関数、変数を記述したソースコードの行数である請求項１乃至請求項３のいずれか1項に記載の凝集度計測装置。
【請求項５】
前記凝集度は、ソフトウェアモジュール内の任意の２箇所を選んだ場合、それら任意の２箇所が関連する確率である請求項１記載の凝集度計測装置。
【請求項６】
前記凝集度は、下式で算出する請求項１記載の凝集度計測装置。
【数２】
2013045426.tif 000004
である。
【請求項７】
ソースコードやソフトウェアの設計書から、関数の名前及び規模から成る関数情報と、関数の呼び出し関係、変数の利用関係、型の利用関係のいずれかである構造情報を取得する構造解析部と、
前記構造解析部で取得した関数情報と構造情報を用いて、関数や変数によって実現される機能を検出する機能検出部と、
前記検出した機能間の関連有無を検出する際に使用する関連の定義を付与する関連定義入力部と、
前記構造情報及び前記関連の定義に基づいて機能間の関連を検出する関連検出部と、
前記機能と機能毎の関連情報に基づいて凝集度を算出する凝集度算出部を
備える凝集度計測装置。
【請求項８】
前記構造解析部で取得した関数情報を記憶する関数情報記憶部と、
前記構造解析部で取得した構造情報を記憶する構造情報記憶部と、
前記機能検出部で検出した機能を記憶する機能記憶部と、
前記検出した関連を記憶する関連記憶部を
備える請求項７記載の凝集度計測装置。
【請求項９】
前記機能間の関連の定義は、内部変数の共有、型の共有、関数の呼び出し関係のいずれかである請求項７又は請求項８記載の凝集度計測装置。
【請求項１０】
前記機能検出部は、検出した機能について、ある関数を呼び出している関数の数が１つであった場合、呼び出し元の関数と統合して１機能として数える請求項７乃至請求項９のいずれか1項に記載の凝集度計測装置。
【請求項１１】
前記機能の規模は、ある機能を実現する関数、変数を記述したソースコードの行数である請求項７乃至請求項１０のいずれか1項に記載の凝集度計測装置。
【請求項１２】
ソフトウェアモジュール内の関数や変数によって実現される機能を検出し、
前記機能を実現する関数、変数を記述したソースコードの行数によって前記機能毎の規模を取得し、
前記機能間の関連の有無を検出し、
前記全ての機能について、その機能を更新する際、無駄にならない保守作業の割合を算出し、
前記割合を足し合わせて平均を取り、ソフトウェアモジュールの凝集度を算出する、
凝集度計測方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明の実施形態は、ソフトウェアモジュールの保守性を考慮した凝集度計測装置及び凝集度計測方法に関する。
【背景技術】
【０００２】
関数や変数によって実現される“機能”の集まりであるソフトウェアモジュールについて、その構造の良し悪しを判断する尺度として、“モジュールの凝集性”を計測することが行われる。モジュールの凝集性は、モジュール内部が互いに関連する機能同士から構成されているか否かを表す性質で、凝集性を指標化したものが“凝集度”である。
【０００３】
プログラマの意図によって凝集度が変わってしまう問題を解決するために、ソースプログラムからプログラムを機能単位に分割し意味情報を解析し、意味情報を考慮した新たな機能単位を基に正確な凝集度を測定することが提案されている（例えば、特許文献１参照。）。  
また、少資源(組込みなど)な開発環境では、性能要求などが優先されるために、ソフトウェアの保守性をはじめとした非機能品質を犠牲にした実装が行われることに鑑み、少資源な環境でのソフトウェアに対して高効率な実装を行われたソースコードに対する保守作業を容易にするための手法が提案されている（例えば、特許文献２参照。）。これは、実際のソースコードについて関数内でそれぞれが独立した意味を持つように分割された機能を抽出し、機能単位を認識して修正可能であると共に、保守性の低いコードに適切なビューを与えることで保守作業を容易にするものである。
【０００４】
ソフトウェア開発において保守作業（改定作業）の工数は無視できないものとなってきている。そのため、保守作業に必要な努力の度合いである保守性が高いことが望まれる。
【０００５】
一般に、凝集性が高いモジュールは保守しやすいと言われるが、既存の凝集度は、保守性に結びついたものではない。モジュール更新時には、原則的にモジュール全体を調査するが、そこに関係のない機能が含まれると、その機能に関する調査は無駄となる。また、モジュール更新時には、原則的にモジュール全体をテストしなおすが、そこに関係のない機能が含まれると、その機能に関するテストは無駄となる。
【０００６】
これらのことから、凝集度が低いモジュールは保守しにくく、モジュール全体を保守するにあたって無駄な保守作業が発生してしまうが、既存の凝集度では、無駄な保守作業量を把握することができなかった。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開２００４−６２４５２号公報
【特許文献２】特開２００８−１８６２４４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００８】
本発明が解決しようとする課題は、ソフトウェアモジュールの保守において無駄となる保守作業量を把握可能な凝集度計測装置及び凝集度計測方法を提供することである。
【課題を解決するための手段】
【０００９】
実施形態の凝集度計測装置は、ソフトウェアモジュール内で関数や変数によって実現される機能とそれら機能毎の規模を併せて入力する機能入力部と、前記機能毎に関連情報を入力する関連情報入力部と、前記ソフトウェアモジュールのある機能に関連する機能群の規模の割合と機能の規模による加重平均の積によって凝集度を算出する凝集度算出部を備える。
【図面の簡単な説明】
【００１０】
【図１】機能の規模と凝集度との関係を示す図である。
【図２】本実施形態に係る凝集度計測装置の構成例を示す図である。
【図３】機能記憶部２０における機能記憶表の一例を示す図である。
【図４】関連記憶部４０における関連情報記憶表の一例を示す図である。
【図５】凝集度算出の流れを示すフローチャートである。
【図６】あるモジュールAの構造と、その凝集度の算出例を示す図である。
【図７】既存の凝集度によるモジュールの対比を説明するための図である。
【図８】各モジュールごとのＬＣＯＭ＊、本実施形態による凝集度、保守作業量の一例を示す図である。
【図９】機能、規模、関連の異なるモジュールを比較する図である。
【図１０】図９に示した各モジュールについて、ＬＣＯＭ＊、本実施形態による凝集度、保守作業量を求めたものを示す図である。
【図１１】第２の実施形態に係る凝集度計測装置の構成例を示す図である。
【図１２】モジュールＡの構造の一例を示す図である。
【図１３】記憶する関数情報の一例を示す図である。
【図１４】記憶する構造情報の一例を示す図である。
【図１５】検出後にまとめた機能を示す図である。
【図１６】機能記憶部２０における機能記憶表の一例を示す図である。
【図１７】機能の検出に際し、呼び出し元の関数との統合を説明する図である。
【図１８】機能間の関連検出を説明する図である。
【図１９】第２の実施形態における凝集度の算出例を示す図である。
【発明を実施するための形態】
【００１１】
以下、本発明の一実施の形態について、図面を参照して説明する。尚、各図において同一箇所については同一の符号を付すとともに、重複した説明は省略する。
【００１２】
（第１の実施形態）
まず、本実施形態で用いる主要な用語について説明する。
【００１３】
「モジュール」とは、関数や変数などのソフトウェアの構成部品のうち、所定の関係があるものをまとめたものをいう。
【００１４】
「モジュールの規模」とは、あるモジュールを構成する関数、変数を記述したソースコードの行数をいう。ステップ数でもモジュールの規模を表すことができる。
【００１５】
「無駄な保守作業」とは、機能の更新による影響を受けないにも関わらず、調査やテストに費やされる保守作業（改定作業）をいう。
【００１６】
「機能の変更確率」とは、モジュール内の機能の変更されやすさを示す指標である。
【００１７】
本実施形態に係るソフトウェアモジュールの凝集度計測装置は、モジュールの規模の違いによる無駄な保守作業量の違いを凝集度で表現可能とするもので、関数や変数によって実現される機能の規模を加味して、無駄な保守作業量を見積もることのできる凝集度を算出するものである。
【００１８】
本実施形態では、二つの構造において、同じ凝集度である場合、同じ保守作業量となる。例えば、凝集度０．８ならば、 保守時に無駄でない作業量は必ず８０％となる。さらに、二つの構造において同じ保守作業量の場合、同じ凝集度となる。例えば、無駄でない保守作業量が８０％ならば、 凝集度は必ず０．８である。凝集度と保守作業量には相関があり、凝集度が高いほど、 無駄でない保守作業量が多くなる。
【００１９】
（機能の規模と凝集度との関係）
機能の規模を加味して、無駄な保守作業量に直結する凝集度を算出するために、
（１）モジュール内のある機能fに関連する機能群の規模の割合をA(f) とする。ここで、関連する機能群とは、機能間で内部変数の共有関係や関数の呼び出しがあることである。（２）A(f)は機能fを変更する際、無駄にならない作業の割合を示す値である。換言すれば、変更に対してモジュール全体を再テストしたとき、無駄ではないテストの割合であり、変更に際してモジュール全体を調査したとき、無駄ではない調査の割合である。
【００２０】
そこで、モジュール内のある一機能を変更するときの、A(f)の平均値をもって凝集度とする。モジュール内の各機能の変更確率はその規模に比例するものとし、各機能の規模での加重平均とする。
【００２１】
これらのことをまとめると、上記凝集度の定義は、以下のように言い換えることができる。本実施形態における凝集度とは、「モジュール内の任意の２箇所（２行）を選んだ時、それらが関連する確率」である。
【００２２】
図1は、機能の規模と凝集度との関係を示す図である。図１に示すモジュールＡは、機能Ａ１、Ａ２、Ａ３から構成され、機能Ａ２とＡ３の間には何らかの関係がある。機能Ａ１はモジュールＡ全体の５０％の規模を占め、機能Ａ２は３０％の規模、機能Ａ３は２０％の規模を占めている。このようなモジュールＡについて、上記A(f)及び凝集度への寄与は図１に示すようになる。例えば、機能Ａ２は、機能Ａ２自身と機能Ａ３が関連し、A(f)は各機能の規模０．３及び０．２の合計であり、凝集度への寄与はA(f)と機能の規模による加重平均との積、すなわち、（０．３＋０．２）＊０．３となる。ここで、機能の規模による加重平均は、機能の変更確率を表している。
【００２３】
図２は、本実施形態に係る凝集度計測装置の構成例を示す図である。凝集度計測装置１００は、機能入力部１０、機能記憶部２０、関連情報入力部３０、関連記憶部４０、凝集度算出部５０から構成されている。
【００２４】
まず、各部を簡潔に説明する。
【００２５】
機能入力部１０は、モジュール内の機能を入力するものである。各機能毎の規模（行数）も併せて入力する。機能入力部１０で入力した機能は機能記憶部２０に記憶される。図３は、機能記憶部２０における機能記憶表の一例を示している。
【００２６】
関連情報入力部３０は、各機能毎に関連情報を入力する。関連がある場合には、関連「有り」、関連が無い場合には、関連「無し」と入力する。関連情報入力部３０で入力した関連情報は関連記憶部４０に記憶される。図４は、関連記憶部４０における関連情報記憶表の一例を示す図である。図４に示す例では、機能３は機能１及び機能２と関連しているが、機能１と機能２は関連が無いことがわかる。
【００２７】
凝集度算出部５０は、モジュールの全機能と機能毎の関連情報から、凝集度を算出する。凝集度は、下式によって算出する。
【数１】
2013045426.tif 000003
【００２８】
（凝集度算出のフロー）
図５は、以上のように構成された凝集度計測装置における凝集度算出の流れを示すフローチャートである。まず、モジュール内の機能を検出する（ステップＳ５１）。次いで、各機能の規模を取得する（ステップＳ５２）。また、機能間の関連の有無を検出する（ステップＳ５３）。
【００２９】
次に、全ての機能ｆｉについて、A(fｉ)を算出する（ステップＳ５４）。ここで、A(fｉ)は機能ｆｉを更新する際、無駄にならない保守作業の割合を示す値であり、ｉ＝機能の数である。
【００３０】
次に、A(fｉ)を足し合わせて平均を取り、モジュールの凝集度を算出する（ステップＳ５５）。
【００３１】
（凝集度算出例）
図６は、あるモジュールAの構造と、その凝集度の算出例を示す図である。図６に示す例では、モジュールＡの機能Ａ１は２０％の規模、機能Ａ２は５０％の規模、機能Ａ３は３０％の規模であり、機能Ａ３は機能Ａ１と機能Ａ２に関連している。このような場合、機能Ａ１について、機能Ａ１自身の凝集度への寄与は規模＊A(f)＊関連の有無＝０．２＊０．２＊１であり、機能Ａ３の凝集度への寄与は０．２＊０．３＊１である。機能Ａ２について、機能Ａ２自身の凝集度への寄与は０．５＊０．５＊１であり、機能Ａ３の凝集度への寄与は０．５＊０．３＊１である。同様に、機能Ａ３について、機能Ａ１の凝集度への寄与は０．３＊０．２＊１であり、機能Ａ２の凝集度への寄与は０．３＊０．５＊１であり、機能Ａ３自身の凝集度への寄与は０．３＊０．３＊１である。したがって、モジュールＡの凝集度は、０．８となる。
【００３２】
（凝集度の効果の検証）
既存の凝集度と本実施形態に係る凝集度について対比することにより、凝集度の効果について検証する。既存の凝集度は、ＬＣＯＭ＊（Lack of Cohesion in Methods）の式（ここでは、略す）で計算され、ＬＣＯＭ＊の値が小さいほど、ゼロに近づくほど凝集度が高いと評価している。今、図７に示すようなモジュールＡとモジュールＢを例にとって対比する。モジュールＡは、規模５００行の機能１、規模２５０行の規模２、規模２５０行の規模３から成り、機能２と機能３は関連がある。一方、モジュールＢは、規模１０行の機能１、規模４９５行の規模２、規模４９５行の規模３から成り、機能２と機能３は関連がある。既存の凝集度では、モジュールＡとモジュールＢもＬＣＯＭ＊＝０．５であり、両モジュールに差異は無いと判定していた。
【００３３】
これに対し、本実施形態によって凝集度を算出し、保守作業量を求めると、図８のようになる。図８は、各モジュールごとのＬＣＯＭ＊、本実施形態による凝集度、保守作業量の一例である。図８では、モジュールＡの凝集度は０．５、各機能の変更確率を考慮した場合の保守作業量は機能１の変更時で２５０行、機能２の変更時で１２５行、機能３の変更時で１２５行、保守に無駄でない作業量は５００行となっている。また、モジュールＢの凝集度は０．９８２、各機能の変更確率を考慮した場合の保守作業量は機能１の変更時で０．１行、機能２の変更時で約４９１行、機能３の変更時で約４９１行、保守に無駄でない作業量は約９８２行となっている。
【００３４】
このことから、モジュールＡに比べて、モジュールＢの方が無駄な保守作業が発生しない、すなわち保守し易い構造であることが明らかとなる。
【００３５】
さらに、モジュールの構成を変えて検証を続ける。
【００３６】
図９は、機能、規模、関連の異なるモジュールを比較する図である。図９に示した各モジュールについて、ＬＣＯＭ＊、本実施形態による凝集度、保守作業量を求めると、図１０のようになる。
【００３７】
今まで述べてきたように、保守作業量を見積もることのできる凝集度であるためには、
条件１：二つの構造において同じ凝集度である場合、同じ保守作業量となる。
【００３８】
条件２：二つの構造において同じ保守作業量である場合、同じ凝集度となる。
【００３９】
条件３：凝集度と保守作業量には相関がある。
【００４０】
の３条件を満たすことが必要である。
【００４１】
図１０によれば、ＬＣＯＭ＊では、
条件１：同じ凝集度の場合でも保守作業量が異なる（モジュールＢとモジュールＤ）。
【００４２】
条件２：同じ保守作業量の場合でも凝集度が異なる（モジュールＢとモジュールＣ）。
【００４３】
条件３：ＬＣＯＭ＊の大小と保守作業量は関係がない。
【００４４】
ことから、３条件を満たさず、保守作業量を見積もることができない。
【００４５】
一方、本実施形態による凝集度によれば、
条件１：モジュールＢとモジュールＣは同じ凝集度で、同じ保守作業量である。
【００４６】
条件２：モジュールＢとモジュールＣは同じ保守作業量で、同じ凝集度である。
【００４７】
条件３：凝集度と保守作業量には相関がある。
【００４８】
ことから、３条件を満たし、保守作業量を見積もることができる。
【００４９】
本実施形態によれば、モジュールの機能の規模を用いて保守作業量を見積もることができるので、無駄な保守作業量を評価することができる。
【００５０】
（第２の実施形態）
次に、第２の実施形態について説明する。図１１は、第２の実施形態に係る凝集度計測装置の構成例を示す図である。第２の実施形態に係る凝集度計測装置２００は、構造解析部６０、関数情報記憶部６１、構造情報記憶部６２、機能検出部７０、関連検出部８０、関連定義入力部９０、機能記憶部２０、関連記憶部４０、凝集度算出部５０から構成されている。第２の実施形態に係る凝集度計測装置２００と第１の実施形態に係る凝集度計測装置１００との大きな相違点は、機能の検出、機能間の関連の検出を行う点である。それ以外の点については、第１の実施形態と同様である。
【００５１】
構造解析部６０は、ソースコードやソフトウェアの設計書から、関数の名前、規模（行数）及び構造情報を取得する。ここで、構造情報とは、関数の呼び出し関係、変数の利用関係、型の利用関係である。図１２は、モジュールＡの構造の一例を示している。構造解析部６０で取得した関数情報は、関数情報記憶部６１に記憶される。図１３は、記憶する関数情報の一例を示す図で、関数名と規模を記憶する。構造解析部６０で取得した構造情報は、構造情報記憶部６２に記憶される。図１４は、記憶する構造情報の一例を示す図で、関連の主体毎に、関連の対象及び関連の種類を記憶する。
【００５２】
機能検出部７０は、構造解析部６０で取得した関数情報と構造情報を用いて、機能を検出する。検出した機能は、関数の呼び出し関係においてまとめる。図１５は、検出後にまとめた機能を示す図である。図１６は、機能記憶部２０における機能記憶表の一例を示している。機能の検出では、１関数＝１機能とするが、ある関数を呼び出している関数の数が１つであった場合、呼び出し元の関数と統合して１機能とする。図１７は、機能の検出に際し、呼び出し元の関数との統合を説明する図である。図１７に示す例では、関数Ａ５は関数Ａ４からのみ呼ばれているので統合することを示している。
【００５３】
関連定義入力部９０は、機能間の関連検出において、関連の定義を与えるものである。例えば、内部変数の共有時のみ関連がある、と定義する。機能間の関連の定義には、次のような例を挙げることができる。
【００５４】
（１）     内部変数の共有
これは、モジュール内に定義されている同一変数を参照（リード／ライト）している場合、それらの機能には関連がある、とする例である。
【００５５】
（２）     型の共有
これは、同一の型を使用している場合、それらの機能間には関連がある、とする例である。尚、型はユーザ定義の構造体とする。
【００５６】
（３）     関数の呼び出し関係
これは、一方の機能が他方の機能を呼び出していれば、それらの機能間には関連がある、とする例である。呼び出しには間接的な呼び出しも含め、機能A→機能B→機能Cという呼び出し関係があった場合、機能Aと機能Cの間にも呼び出し関係があるものとする。
【００５７】
関連検出部８０は、構造情報記憶部６２の記憶内容及び関連定義入力部９０の入力から、機能間の関連を検出する。検出した関連は、関連記憶部４０に記憶される。図１８は、機能間の関連検出を説明する図である。図１８に示す例では、“内部変数の共有”に該当するものを関連の定義とし、機能１と機能２の間に関連があることがわかる。
【００５８】
凝集度算出部５０は、第１の実施形態と同様に、モジュールの全機能と機能毎の関連情報から、凝集度を算出する。図１９は、第２の実施形態における凝集度の算出例を示す図である。図１９に示す例では、モジュールＡの凝集度は０．４５となる。
【００５９】
第２の実施形態によれば、ソースコードやソフトウェアの設計書を入力として与えることで、凝集度の算出が可能となる。
【００６０】
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
【符号の説明】
【００６１】
１００、２００・・・凝集度計測装置、
１０・・・機能入力部、
２０・・・機能記憶部、
３０・・・関連情報入力部、
４０・・・関連記憶部、
５０・・・凝集度算出部、
６０・・・構造解析部、
７０・・・機能検出部、
８０・・・関連検出部、
９０・・・関連定義入力部。
【図１】
2013045426.tif 000005
【図２】
2013045426.tif 000006
【図３】
2013045426.tif 000007
【図４】
2013045426.tif 000008
【図５】
2013045426.tif 000009
【図６】
2013045426.tif 000010
【図７】
2013045426.tif 000011
【図８】
2013045426.tif 000012
【図９】
2013045426.tif 000013
【図１０】
2013045426.tif 000014
【図１１】
2013045426.tif 000015
【図１２】
2013045426.tif 000016
【図１３】
2013045426.tif 000017
【図１４】
2013045426.tif 000018
【図１５】
2013045426.tif 000019
【図１６】
2013045426.tif 000020
【図１７】
2013045426.tif 000021
【図１８】
2013045426.tif 000022
【図１９】
2013045426.tif 000023