ソフトウェアの計量化
設計評価
ソフトウェアの設計過程においては,設計の中間段階で設計内容を適宜評価し,その結果をフィードバッグしながら設計の質を高めていくことが必要である. 設計内容の評価については,定められた機能を正しく実現していることはもちろんであるが,プログラムが良構造に設計されており生産性や信頼性の向上につながることが重要である.
プログラムの構造化設計の観点から設計評価尺度として用いられる尺度には次のようなものがある.
階層化尺度
プログラムの機能を全体から部分へと階層的に定義して,ある階層の機能を理解するのにそれより下位の機能の詳細を知らなくても理解できるようにすることにより,プログラムの理解が容易になり大規模なプログラムを系統的に作成できるようになる.
- 階層構造の形状
モジュールを分割したとき,モジュール間の呼出し関係を基にモジュール群を木構造で表すことができる.このとき,この木構造の形状からモジュールの階層構造の良否をある程度判断することができる.
モジュールの階層構造の形状は,モスク型,釣鐘型,提灯型,ピラミッド型に分けられる. 一般に,理想的なモジュール階層構造では,階層構造の上部では各モジュールが多くの従属モジュールを持ち同一階層のモジュール数が増え,中間では従属モジュールが少なくなり同一階層のモジュール数がほぼ一定になる.また,階層の下部では共用モジュールが増えるため同一階層のモジュール数はやや少なくなる. そのため,全体として見ると階層構造はモスク型になる.
また,階層構造の形状の他に階層数や階層の対象性も階層構造の良否の判断材料になり得る.
- モジュールの大きさ
モジュールを分割するとき,モジュールの共用化や理解の容易性などの観点から各モジュールの大きさには適切な値が存在する. モジュールが大き過ぎると,モジュールの機能の理解やテストが難しくなり,小さ過ぎると機能が分散されモジュールの共用が難しくなる.
モジュールの平均的大きさは,プログラムの規模が大きくなるにつれて増加することが経験的に知られている.
- モジュールの制御関係
モジュールの階層的な制御関係を計測する尺度として,モジュールの呼出し数(fan-out)と被呼出し数(fan-in)がある.モジュールの呼出し数は,そのモジュールが直接呼出している他モジュール(従属モジュール)の数であり,被呼出し数はそのモジュールを直接呼び出しているモジュール(上位モジュール)の数である.
モジュールの呼出し数は,大きすぎると1つの機能が多数のモジュールに分割されることになり,小さすぎるとモジュールの階層が増大しモジュール間の制御が分散されることになる.そのため,モジュールの呼出し数には適切な値の目安(3~7程度)がある.
モジュールの被呼出し数は,大きいほどモジュールが共用されていることになり,モジュールの独立性が高く良いモジュール分割といえる.
モジュールの被呼出し数は,モジュールの階層構造がピラミッド型の場合その平均は1に近い値になり,モスク型や提灯型では階層構造の下部で大きく上部で小さい値をとり全体としてピラミッド型よりも大きな値になる.
独立性尺度
- 凝集度
モジュール凝集度は,モジュール内の機能の関連性の度合いを示すものであり,凝集度が高いほど関連性の高い機能がモジュールに集約されておりモジュール内の機能がまとまっていることを示している. 構造化設計では,モジュールの凝集度を凝集度が高い順に次のように分類している[Myers78].
- 機能的
単一の固有の機能を実行する.
- 情報的
複数入口を持ち,各入口は単一の固有の機能を実行する.また,各機能はモジュール内のデータ構造に関係する.いくつかの関連した機能的モジュールを一つにまとめたものである.
- 連絡的
一連の手順により実行される複数の機能を持ち,かつ各機能がデータの使用に関して互いに関連している.
- 手順的
一連の手順により実行される複数の機能を持つ. 機能間には問題仕様に基ずく関連性を有する.
- 時間的
同じ時点に逐次的に実行される複数の機能を持つ. 機能間の関連は時間的共通性以外にはほとんどない.
- 論理的
論理的に抽象化された複数の機能を含み,引数により各機能を選択的に実行する.
- 暗合的
モジュール内の機能に特定の関係がなく,また機能を定義できない.
これらの分類の順序は,モジュールの品質や生産性に与える影響,すなわちモジュールの再利用性,エラー発生率,保守性,拡張性などへの効果に基づいて設定されている.
- 結合度
モジュール間の関連性の度合いを表す尺度として,モジュール結合度がある. モジュール結合度は,モジュール間のインタフェースの特徴,すなわち2つのモジュール間のデータの受渡し方法や受渡しデータの構造,種類により結合度が低い順に次のように分類できる [Myers78].
- 非直接結合
2つのモジュール間に直接的関係がない.
- データ結合
一方のモジュールが他方のモジュールへデータを引き渡す.
- スタンプ結合
一方のモジュールが他方のモジュールへデータ構造を引き渡す.
- 制御結合
一方のモジュールが他方のモジュールへモジュールの論理を制御するための制御データを引き渡す.
- 外部結合
複数のモジュールが大域的データの参照をとおして結合している.
- 共通結合
複数のモジュールが大域的データ構造の参照をとおして結合している.
- 内容結合
一方のモジュールが他方のモジュールの内部の機能やデータを直接参照する.
複雑性尺度
設計評価尺度としては,モジュール化の尺度である階層化尺度と独立性尺度の他に個々のモジュール内の複雑さを評価する尺度が必要である. すなわち,モジュールが適切に分割,階層化され,モジュール間のインタフェースも適切に設計されたとしても,各モジュール内のプログラム設計が適切でなければプログラムは複雑化し信頼性や保守性の向上にはつながらない.
このプログラムの簡潔さや適切さを表す尺度として複雑性尺度がある. 複雑性尺度の詳細については,
複雑性尺度に示す.