質問: モジュール結合度では、結合の弱い順に * データ結合 * スタンプ結合 * 制御結合 * 外部結合 * 共通結合 * 内部結合 の6段階のレベルにより分類されていますが、これらは具体的にはどの様な違いがありますか 例えばC言語のprintf関数がどこに分類されるのかやC++のlist<>はどこにやファイルの分割の仕方で変化するものなのかなどが知りたいです。 参考 wikipedia結合度
回答: ピッタリと当てはまるものを示すのは難しいですが、C言語を使って少し具体的な例を挙げてみます。 データ結合 ===== ``` atan(0.0); ``` データのやりとりのみを行うので結合度は低くなります。 スタンプ結合 ====== ``` struct Address { char* country; char* prefecture; char* city; }; struct User { char* name; int age; struct Address addr; }; int GetUserPostalCode(struct User user) { } ``` `GetUserPostalCode`はユーザーの住所をもとに郵便番号を取得する関数ですが、引数がUserなので郵便番号の取得に関係のないデータにもアクセスできてしまいます。 制御結合 ==== ``` printf("%d:%s", 123, "abc"); ``` ユーザーが指定する書式でprintf内部の挙動が変わります。 「データ結合」との違いがちょっとわかりにくいですが、printfは呼び出し側が責任をもって引数を与えないと正常に動かないため、制御結合と言えると思います。 外部結合 ==== ``` glBegin(GL_POLYGON); glEnd(); ``` OpenGLの関数は、デバイスコンテキストを共有しているので外部結合です。 共通結合 ``` srand(time(NULL)); rand(); ``` srandを実行するとrandの挙動にグローバルに影響を与えるので共通結合です。 内容結合 C言語の場合、ファイル分割によって内容結合を抑制することができます。 例えば、SQLiteでは構造体`sqlite3`の実装は非公開になっています。 しかし、内部用のヘッダをインクルードすると構造体のメンバにアクセスできてしまうので、そのメンバに依存するようなコードを書くと内容結合が発生します。