TL;DR
プログラムの部品(モジュールなど)どうしが、互いにどの程度依存しているかを表す尺度。結合度は低いほど好ましい。
なぜ必要か
Wikipedia によると、結合度が高いと、あるデータの持ち方を変えたときに部品の関連をたどって影響が広がり、意図しない箇所で不具合が起きることがある。1 つの変更のために、散らばった複数の箇所を直す必要も生じる。
仕組み
手続き型プログラミングでは、結合度の高いものから順に次のように分類される。
- 内容結合: 別のモジュールの内部動作に依存する
- 共通結合: 同じグローバルデータを共有する
- 外部結合: 外部のデータ形式、通信プロトコル、デバイスのインタフェースを共有する
- 制御結合: 処理の流れを制御するフラグなどを渡す
- スタンプ結合: 複合データ構造を共有し、その一部だけを使う
- データ結合: 単純なデータを引数で受け渡す
- メッセージ結合: 引数のないメソッド呼び出しやメッセージの受け渡しで結合する
オブジェクト指向プログラミングでは、子クラスが親クラスに依存しすぎて親クラスを直しにくくなるサブクラス結合や、あるメソッドが別のメソッドの実行に依存する一時的結合もある。
例
テスト駆動開発 第6章 では、is-a の関係(継承)は結合度が高く、変更に弱いとしている。