結合度とは
この節の要点
- 結合度とは複数の関数・メソッド・クラスなどのモジュールがどの程度関係しているかを表す尺度である。
モジュールの結合度(coupling) とは、 あるモジュールがどれだけ他のモジュールと結びついているかを表します 。この考え方は1974年にラリー・コンスタンティンを中心として、凝集度と対になる形で合わせて考えられました[10][8]。
どのようなモジュールの結合度ならばよいソースコードといえるのか、その基準として、良いモジュール間結合 とは、あるモジュールが他のモジュールから複雑な前処理がなく簡単に使用できるぐらい繋がりが薄い(疎結合である)こと とされています。
例えば、java.lang.Mathパッケージに含まれるdouble sin(double a)といったラジアン値に対する正弦関数の値を返すメソッドは、別のモジュールから呼び出されるに当たって、ラジアン値が1つ渡されることだけ知っておけば良いので、疎結合であると言えます。
しかし例えば次の、void initVariables(double a, double b, ..., double x)といった、何らかの初期化を行う関数があったとすれば、これは前述したsinメソッドよりかは、密結合だといえます。なぜならば、別のモジュールからinitVariablesメソッドを呼び出す際に、そのモジュールは、渡さなければならない全ての引数から、その関数の中で何が起きるかを実質的に知っていることと同じだからです。
以下に、モジュールに対する結合度の度合いとその分類を段階別で示します[10]。ここで、結合度は高(強)ければ悪く、低(弱)ければ良いとされます。
- 内容結合(最も密、最も悪い) (Content coupling)
- あるモジュール内部のコードを別のモジュールで利用している場合(図17)
goto文などのジャンプ命令によって処理を共有するなど、一部のプログラミング言語でしか実現できない結合度
- あるモジュール内部のコードを別のモジュールで利用している場合(図17)

- 共有結合 (Common coupling)
- 複数のモジュールが共通のグローバルデータ(プログラムのどこからでもアクセスできるデータ)にアクセスしている場合(図18)

- 外部結合 (External coupling)
- 複数のモジュールが外部ソフトウェアで用意されているデータフォーマットやプロトコル、やデバイスなどの役割を共有している場合(図19)

- 制御結合 (Control coupling)
- 1つのモジュールが別のモジュールの処理の内容を制御している場合(図20)。例えば、なんらかのフラグをモジュール間で渡している、など

- スタンプ結合 (Stamp coupling)
- 複数モジュールがデータを共有し、そのデータのうち一部だけ利用し、かつおのおのしか使われていないような場合(図21)

- データ結合(最も疎、最も良い) (Data coupling)
- 複数モジュールがデータを共有し、各モジュールがそのデータのうち全体を利用している場合(図22)

基本的に、我々が作ることになる大体のモジュールは、データ結合(疎結合)になるように心がけるべきです。ただ、すべてのモジュールを疎結合にすることは困難です、注意してください。保守性を特に高めたい箇所は選ばなければなりません。 各モジュールが疎結合となることで、おのおののモジュールが容易に切り離すこと(モジュールの削除や内容の変更など)ができることを意味し、また新たなモジュールに容易に組み合わせること(新たなモジュールの追加)ができることに相当します。これは保守性やモジュールの再利用性に関係していて、重要な特性です 。 こうした、データ結合になるようなモジュールの設計方針として以下の3つが挙げられます。
- 結合箇所の多さをなるべく少なくする。
- なるべく関数の引数の数を少なくする。
- あまり多くの関数を公開しすぎない(アクセス修飾子による)。
- 結合箇所をなるべく明らかにする。
- モジュール内部であるデータを利用する際、モジュール内部で暗黙的にデータを参照するよりかは、モジュールの引数などで明示的にデータを渡して参照する。
- グローバル変数は使わない(Javaだと特に
static変数)。
- グローバル変数は使わない(Javaだと特に
- モジュール内部であるデータを利用する際、モジュール内部で暗黙的にデータを参照するよりかは、モジュールの引数などで明示的にデータを渡して参照する。
- 結合箇所はなるべく単純にする。
- 複雑なデータ構造を引数としてモジュールに渡すのではなく、もし単純に済むのであれば単純な引数にする。
[8]: M. Steve, ``CODE COMPLETE 上 完全なプログラミングを目指して'', 第二版, 日経BP社 (2005)
[10]: W.P. Stevens, G.J. Myers, and L.L. Constantine, ``Structured Design'', IBM Systems Journal, Vol.13, pp.115-139 (1974)