モジュール結合度について

ソフトウェアのモジュール結合度は下記のように分類される。
上ほど結合度が弱く、下に行くほど強い。

  • データ結合
  • スタンプ結合
  • 制御結合
  • ハイブリッド結合
  • 外部結合
  • 共通結合
  • 内部結合

※モジュールの分類は6つで、ハイブリッド結合と外部結合が分け方により片方があったりなかったりするみたいです。詳しくはしりません。

結合度は極力弱い方が良い。最低でも制御結合以下とするべき。
下記各結合を簡単な例で記載してみる。

(1)データ結合
引数で単純なデータを渡す場合。

void ConfirmDataCoupling(int arg);//データ結合

(2)スタンプ結合
引数で構造体を渡す場合。オブジェクトなどデータの集合を同じく分類される。また単純にデータを渡している中に使用していないデータがある場合もこの分類になる。

typedef struct{
string name;
int age;
bool man;
}_person;

void ConfirmStampCoupling(_person person);//スタンプ結合

(3)制御結合
引数dayの値の種類により、関数の処理が変わる場合。いわゆるフラグで制御する結合。

enum dayOfWeek{SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRYDAY, SATURDAY};

void ConfirmControlCoupling(dayOfWeek day);//制御結合

(4)ハイブリッド結合
引数temperatureが、下記のように値の範囲で関数の処理が変わる場合
temperature<0であれば○○○、
0

void ConfirmControlCoupling(double temperature);//ハイブリッド結合

※ハイブリッド結合がない分類では制御結合に含まれていると思われる。

(5)外部結合
グローバルである単純なデータでモジュール間が結合されている場合。
共有メモリを使ったアクセスも含まれる

extern int globalValue;//外部結合

※外部結合がない分類では共通結合に含まれていると思われる。

(6)共通結合
モジュールが複数のグローバルなデータ構造の受け渡しをしている場合。
データ構造というのが肝。

extern _person gloablePerson;//共通結合

(7)内容結合
一方のモジュールが他方のモジュールの内容を直接参照している状態。
いわゆるカプセル化が出来ていない。

ModuleB::confirmInternalCopuling(){

if(moduleA.value > 0){
     …
}
moduleA.value = 100;
}

※ModuleBクラスがModuleAクラスのフィールドを直接アクセスしている。