6508


モジュール結合度では、結合の弱い順に

  * データ結合
  * スタンプ結合
  * 制御結合
  * 外部結合
  * 共通結合
  * 内部結合

の６段階のレベルにより分類されていますが、これらは具体的にはどの様な違いがありますか

例えばC言語のprintf関数がどこに分類されるのかやC++のlist<>はどこにやファイルの分割の仕方で変化するものなのかなどが知りたいです。

参考  
[wikipedia結合度](http://ja.wikipedia.org/wiki/%E7%B5%90%E5%90%88%E5%BA%A6)


CC BY-SA 3.0
2015-02-14T19:37:53.800
6495
2015-02-15T04:47:31.137
2015-02-15T00:09:38.130
question
詳細設計
モジュール結合度の具体的な例を教えて下さい。


ピッタリと当てはまるものを示すのは難しいですが、C言語を使って少し具体的な例を挙げてみます。

# データ結合

[code]

    atan(0.0);
    
[/code]

データのやりとりのみを行うので結合度は低くなります。

# スタンプ結合

[code]

    struct Address {
        char* country;
        char* prefecture;
        char* city;
    };
    
    struct User {
        char*          name;
        int            age;
        struct Address addr;
    };
    
    int GetUserPostalCode(struct User user) {
    
    }
    
[/code]

`GetUserPostalCode`はユーザーの住所をもとに郵便番号を取得する関数ですが、引数がUserなので郵便番号の取得に関係のないデータにもアクセスできてしまいます。

# 制御結合

[code]

    printf("%d:%s", 123, "abc");
    
[/code]

ユーザーが指定する書式でprintf内部の挙動が変わります。  
「データ結合」との違いがちょっとわかりにくいですが、printfは呼び出し側が責任をもって引数を与えないと正常に動かないため、制御結合と言えると思います。

# 外部結合

[code]

    glBegin(GL_POLYGON);
    glEnd();
    
[/code]

OpenGLの関数は、デバイスコンテキストを共有しているので外部結合です。

## 共通結合

[code]

    srand(time(NULL));
    rand();
    
[/code]

srandを実行するとrandの挙動にグローバルに影響を与えるので共通結合です。

## 内容結合

C言語の場合、ファイル分割によって内容結合を抑制することができます。  
例えば、SQLiteでは構造体`sqlite3`の実装は非公開になっています。

しかし、内部用のヘッダをインクルードすると構造体のメンバにアクセスできてしまうので、そのメンバに依存するようなコードを書くと内容結合が発生します。


CC BY-SA 3.0
2015-02-15T04:47:31.137
6508
2015-02-15T04:47:31.137
3639
6495
answer