作成日 2007/4/28
最終更新日 2008/3/21
[ Japanese | English ]

オブジェクト指向とモジュールの凝集度、モジュールの結合度

 オブジェクト指向とモジュールの凝集度、モジュールの結合度の関係をいい加減に説明します。

 オブジェクト指向を勉強する上で、モジュールの凝集度とモジュールの結合度は非常に大切なのですが、これについて触れている本は本当に少ないです。何でなんだろうか…。オブジェクト指向の本を書いた人に対して本当にオブジェクト指向を理解しているの?と聞きたくなる。

 あ、そうそう、モジュールの凝集度とモジュールの結合度については情報処理資格の基本情報技術者試験にも出題されますし、UMTP L3の範囲でもあるので、資格取得を考えている人は勉強した方がいいです。


1.モジュールの凝集度とは
2.モジュールの結合度とは
3.オブジェクト指向とモジュールの凝集度、モジュールの結合度
4.参考文献など


1.モジュールの凝集度とは

 本やサイトによっては「モジュールの強度」となっているかもしれない。

 モジュールの凝集度とは、モジュール(クラス)の構成要素の関連性のことです。
 モジュールの凝集度には表1のものがあります。

表1 モジュールの凝集度の種類

独立性

凝集度

種類

説明

暗号的凝集度 プログラムを単純に分割しただけで、モジュールの機能を定義できない。または、複数の機能をあわせもつが、機能間にまったく関連はない。
    論理的凝集度 関連した複数の機能をもち、モジュールが呼び出されるときの引数(機能コード)で、モジュール内の1つの機能が選択、実行される。
    時間的凝集度 初期設定や終了設定モジュールのように、特定の時期に実行する機能をまとめたモジュール。モジュール内の機能間にあまり関連はない。
    手順的凝集度 複数の逐次的に実行する機能をまとめたモジュール。
    連絡的凝集度 手順的凝集度のうち、モジュール内の機能間にデータの関連性があるモジュール。
    情報的凝集度 同一のデータ構造や資源を扱う機能を1つにまとめ、機能ごとに入口点と出口点をもつモジュール。
機能的凝集度 1つの機能だけからなるモジュール。

参考文献:平成16年度 ソフトウェア開発技術者合格教本 ISBN4-7741-1882-6     293,294ページ


 表1は本から引用しましたが、「凝集度と結合度」というページにはもっと詳しく書いてあります。

 で、ソフトウエアを設計する際は、可能な限りモジュールの凝集度を高くするような設計にした方が良いです。
 オブジェクト指向で設計する場合は、クラスの凝集度はできるだけ情報的凝集度となるように設計すればいいと思います。
 あ、すべてのクラスを高凝集度なクラスとすることは難しい(というか無理?)です。
 例えば、時間的凝集度をもつクラスを作成するなんてことは良くあると思います。
 Javaのjava.lang.Mathクラス のようなユーティリティクラスはどれになるんだろう…。わからない…。(すいません。)

 そういえば、エンティティクラスって情報的凝集度をもつクラスじゃないか?
このページのトップへ

2.モジュールの結合度とは

 モジュールの結合度とは、モジュール(クラス)間の関連性のことです。
 モジュールの結合度には表2のようなものがあります。
 
表2 モジュールの結合度の種類

独立性

結合度

種類

説明

内容結合 絶対番地を用いて直接相手モジュールを参照したり、相手モジュールに直接分岐する。
    共有結合 共通領域(グローバル領域)に定義されたデータを参照する。
    外部結合 必要なデータだけを外部宣言し、ほかのモジュールから参照を許可し共有する。
    制御結合 機能コードなど、モジュールを制御する要素を引数として相手モジュールに渡し、モジュールの機能や実行を制御する。モジュール凝集度の論理的凝集度がこれに相当する。
    スタンプ結合 相手モジュールで、構造体データ(レコード)の一部を使用する場合でも、構造体データすべてを引数として相手モジュールに渡す。
データ結合 相手モジュールをブラックボックスとして扱い、必要なデータだけを引数として渡す。

参考文献:平成16年度 ソフトウェア開発技術者合格教本 ISBN4-7741-1882-6     293ページ

 表2は本から引用しましたが、「凝集度と結合度」というページにはもっと詳しく書いてあります。

 で、ソフトウエアを設計する際は、可能な限りモジュールの結合度を弱くする設計にした方が良いです。
 オブジェクト指向で設計する場合は、できるだけ、スタンプ結合かデータ結合となるように設計すればいいと思います。結合度的にはスタンプ結合よりデータ結合の方が弱く、いい気がしますが、ただ、データ結合だとメソッドの引数の数が増えるし、オブジェクトすべてを引数に渡した方がわかりやすい場合があるので、どっちが良いとは簡単には言い切れません。
 それと、すべてのクラス間の結合度を弱くすることは、多分無理だと思います。
このページのトップへ

3.オブジェクト指向とモジュールの凝集度、モジュールの結合度

 もう、少し述べましたが、オブジェクト指向で設計する際は(いや、オブジェクト指向に限らないのですが)、可能な限りモジュール(クラス)の凝集度を強く、モジュールの結合度を弱くするのが良いです。可能な限り、凝集度は情報的凝集度で、結合度はスタンプ結合以上で。
 少なくとも、再利用性を考えているクラスは凝集度を強く、結合度を弱くしましょう(※1)。再利用を考えないクラスはどうでもいいです。
(どうでもいいと書いたのは下手に凝集度を強く、結合度を弱くしようとすると設計に時間(工数)がかかるし、実装も…、ということでそこらへんは割り切った方がいいと思うということです。)

-----
※1:「再利用性を考えているクラスは凝集度を強く、結合度を弱くしましょう」と書きましたが、出来ない場合もあります。
凝集度を強く、結合度を弱くすることは、プログラムの品質をあげることだと思います。
しかし、プログラムの品質は凝集度や結合度(たぶん、解析性、変更性、安定性、試験性に関係すると思う)だけで決まるものではないです。
他にも処理スピード(時間効率性)、セキュリティなどがあります(※2)。
例えば、凝集度がものすごく強いけど、処理スピードが遅すぎて使い物になりませんでは意味がないと言うことです。
※2:プログラム(というかソフトウェア)の品質についてはISO/IEC9126(JIS X 0129)に規定されていて、下記の6つの品質特性と21つの品質副特性があります。
・機能性(合目的性、正確性、相互運用性、標準適合性、セキュリティ)
・信頼性(成熟性、障害許容性、回復性)
・使用性(理解性、習得性、運用性)
・効率性(時間効率性、資源効率性)
・保守性(解析性、変更性、安定性、試験性)
・移植性(環境適応性、設置性、規格適合性、置換性)
(参考文献:情報処理教科書 プロジェクトマネージャ 2006年度版 ISBN4-7981-1090-6   397ページ)
もっと詳しく書きたかったのですが、このページ(HTML)はソフトウェアの品質についてを説明するページではないのでこれくらいで勘弁してください。
詳しく知りたい人は参考文献の4番目を見てください。
ソフトウェアの品質特性については、 情報処理試験 のプロジェクトマネージャの取得を目指している人は勉強しておいた方が良いかもしれません。

このページのトップへ

4.参考文献など

 このページでは、オブジェクト指向とモジュールの凝集度、モジュールの結合度に関して本当に簡単にしか説明していません。
できれば、下のページも読んでほしいです。

番号

リンク先の名称

リンク先の説明

リンクした日

1

設計におけるオブジェクトの責務分配に有効なものさし -凝集度と結合度- 株式会社オージス総研オブジェクトの広場の中のページです。
結構いろいろ書いてあります。
まずはここを見て。
2007/4/28

2

凝集度 - Wikipedia モジュールの凝集度についての説明と、ソフトウエアを設計する際にどのような凝集度が良いのかが書かれています。 2007/4/28

3

凝集度と結合度 モジュールの凝集度とモジュールの結合度の説明があります。 2007/4/28

4

ソフトウェア品質特性 ソフトウェア品質特性(ISO/IEC9126)の解説が書かれています。 2007/8/18

5

【中級】基礎からのオブジェクト指向 第5部 「GRASPパターン」を理解する(前編):ITpro GRASPパターンについての簡単な説明と、その基本となる概念である結合度と凝集度について説明しています。 2008/3/16
Prev Up Next  Top
このページのトップへ

このページの利用によって発生した、いかなる損害について、このホームページの作成者は責任を負いません。
このページの間違いや嘘を見つけた方、このページに書いて欲しい情報がある方はメールをお願いします。

Microsoft 、Windows 、Visual Basic および Excel は米国Microsoft Corporationの米国およびその他の国における登録商標または商標です。
ここではExcel® をエクセル、Visual Basic® for Applications をVBAと表記する場合があります。
Mac 、Mac OS 、Mac OS X は米国Apple Computer,Inc.の登録商標または商標です。
UMTP は特定非営利活動法人UML モデリング推進協議会の登録商標です。
Sun、Sun Microsystems、サンのロゴマーク、Java、及び、Sun/Solaris/Java に関連するすべての商標およびロゴマークは米国 Sun Microsystems, Inc. の米国およびその他の国における商標または登録商標です。
その他、社名および商品名、システム名称などは、一般に各社の商標または登録商標です。

このホームページの作成者はこれらの会社とはいっさい関係がありません。