ソフトウェア開発方法論

2009年4月2日(木)
上川 伸彦

モジュール化の評価基準(凝集度と結合度)

 ここでは、プログラムがどれほどモジュール化されているか、という評価基準として、「凝集度(強度とも言います)」と「結合度」について説明します。この評価基準は、オブジェクト指向においても同じように適用できるため、非常に重要と言えます。

 凝集度とは、1つのモジュール内の関連性についての尺度で、以下のように分類されます(凝集度の高い順で1→7となっており、凝集度が高いほうが望ましいとされる)。

1)機能的
 1つの機能を実行するモジュール。

2)情報的(逐次的)
 同じデータやリソースを処理する複数の機能をまとめたモジュール。まとめられた機能は関連性が高く、実行順が固定であり、それらを分割してもメリットがないようなケース。

3)連絡的(通信的)
 情報的凝集度と似ているが、まとめられた機能の実行順が固定ではないようなケース。

4)手順的
 ある実行順で処理される複数機能をまとめたモジュール。まとめられた機能の関連性が弱いケース。

5)時間的(一時的)
 初期処理や終了処理のように、特定のタイミングで実行する機能をまとめたモジュール。まとめられた機能間にあまり関連はない。よくあるケースのように思えるが、モジュールの再利用性が悪く、同じようなモジュールが複数作られるケースを生むため、凝集度が低いと見なされる。

6)論理的
 関連した複数の機能を持ち、実行時におけるモジュール呼び出しの引数等により、モジュール内の機能が決定されるケース。

7)暗号的(偶発的)
 モジュールは、プログラムを単純に分割しただけで、複数の機能を持つが、機能間にまったく関連はない。

 結合度とは、モジュール間の関連性についての尺度で、以下のように分類されます(結合度の低い順に1→6となり、結合度が低いほうが望ましいとされる)。

1)データ結合
 相手モジュールをブラックボックスとして扱うことができ、必要なデータだけを相手モジュールとやり取りする。相手モジュールとは、やり取りするデータ以外の関連はない。

2)スタンプ結合
 相手モジュールに、必要なデータ以外もやり取りするケース。例えば、必要な要素を含む構造体(やクラス等)のすべてを相手モジュールに渡す場合を指す。

3)制御結合
 相手モジュールの処理を制御するようなパラメータを相手モジュールに渡すケース。凝集度の論理的凝集度に相当する。

4)外部結合
 モジュール間で必要なデータを他モジュールから参照できるようにし、相手モジュールと共有するケース。

5)共通結合
 モジュール間で必要なデータを、共通領域に定義し、他モジュールと共有するケース。

6)内容結合
 絶対アドレス等を用いて、自分のデータを、直接相手モジュールに渡して処理をさせるケース。

オブジェクト指向(オブジェクト指向設計、オブジェクト指向プログラミング)

 構造化技法がシステム全体の機能を細かく分割していく、という考え方だったのに対して、システム全体の機能を、オブジェクト間の相互作用で表現する、すなわち「オブジェクトに分割していく」という考え方が、オブジェクト指向と言えます。ここで言うオブジェクトとは、データと処理を持つモジュールという風に考えてください。

 このオブジェクト指向は、ますます大規模化、複雑化するソフトウエアの開発効率を上げるには部品化によるモジュールの再利用化が不可欠であり、それは構造化技法だけでは実現できない、という背景があり普及していきました。そのため、オブジェクト指向の研究が進むにつれて、オブジェクト指向に対応したプログラミング言語が次々と誕生しました。C++やJava、今をときめく(?)Rubyはもちろんのこと、COBOLも最近の拡張により、オブジェクト指向に対応しています。

 では、オブジェクト指向とは、何でしょうか。簡単に表現するのは難しいのですが、オブジェクト指向には下記のような特徴があります(図2)。

・クラスとオブジェクト
 同じ特性(データや処理内容)を持つ複数のオブジェクトを纏(まと)めて抽象化し、クラスとして定義する。クラスは枠組みであり、実行時にはクラスから実体化されたオブジェクトが処理を行う。

・カプセル化
 クラスの内部を外部(ほかのクラス)から隠ぺいすること。隠ぺいするのは、クラスの持つデータや処理内容である。これにより結合度が低くなる。

・メッセージパッシング
 オブジェクトがほかのオブジェクトに処理を実行させるためには、メッセージを送るだけで良い、ということ。これは、ほかのオブジェクトのデータ構造や処理内容を知らずに、指示を出すだけで良いということを指している。

・継承
 クラスの特性(データや処理内容)を、ほかのクラスから引き継ぐこと。これにより、あるクラスを簡単に拡張できるようになる。ただし、継承を使った場合、継承元クラスと継承先クラスとの結合度が高くなってしまうことに注意が必要である。

・ポリモフィズム(多態性、多相性、多様性)
 他オブジェクトからの操作に対して、実際に呼び出されるオブジェクトに従って、処理内容が決まるということ。これは、プログラム作成時点では、どのような処理が行われるかは決定せず、実行時のオブジェクトによって処理内容を切り替えることができる、ということを意味する。

 オブジェクト指向にこれらの特徴があることがおわかりいただけたと思います。では、どうなれば「より良いオブジェクト指向」なのでしょうか。評価が難しいのも「オブジェクト指向は難しい」と言われるゆえんではないでしょうか。そこで、オブジェクト指向の評価基準について見ていきたいと思います。

株式会社ビーブレイクシステムズ
(株)ビーブレイクシステムズ技術担当取締役。RDB製品の開発、各種業界団体におけるXML/EDI標準の策定やSOA基盤の設計等に従事。最近は、業務システムの構築に携わることが多く、お客様からの無理難題と向き合う日々を送っている。http://www.bbreak.co.jp/

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています