結合度(けつごうど、カップリング、coupling)とは、コンピュータープログラミングで用いられる(機械よりは)人間寄りの尺度。ソフトウェア測定法の一種。利用者またはメンテナンスをする者にとって対象を利用、保守しやすいように対象の内容が整理、分割できているかどうかを、その状態によって段階に分けて表現する。
概説
コンピュータープログラマにとっては、既存のソフトウェア製品に対して 無い機能の追加、対応していないデータへの対応といった事柄に対応する場面がある。この際、全ての既存のソフトウェア製品の内部(より具体的にはソースコード)の各機能各データに対して、どのデータはどこで利用されまたどこで利用されていないか確実に判断できるよう整理、分割が行き届いている状態を結合度が低いと表現する。結合度は低いほど好ましい。逆に結合度が高いとは、例えば1つのデータの持ち方の変更が 部品の関連性を伝って波及し(遠く離れた、と感じる)意図しなかった箇所での不具合を招く。1つの変更に対して 広範囲かつ複数の散在した箇所の部品の動作を改造する必要が出てくることがある。
結合度の程度
結合度の概念モデル
結合度は、品質尺度であり、ソースコードを調査検討することで結合度の程度が分類される。高い結合度から低い結合度までを以下のように分類できる:
手続き型プログラミング
- 内容結合(Content coupling)「高」
- 病理学的結合とも呼ばれ、あるモジュールが別のモジュールの内部動作によって変化したり依存したりする(例えば別のモジュールの内部データを直接参照する)。したがって、あるモジュールのデータを生成する方法(場所、種類、タイミング)を変更することは、依存するモジュールの変更につながる可能性がある。
- 共通結合(Common coupling)
- グローバル結合とも呼ばれ、二つのモジュールが同じグローバルデータ(例えば、グローバル変数)を共有する。共通のリソースを変更すると、それを使用したすべてのモジュールを変更することを意味する。
- 外部結合(External coupling)
- 二つのモジュールは、外部から供給されたデータ·フォーマット、通信プロトコル、またはデバイスインターフェイスを共有している場合に起こる。 これは基本的に外部ツールやデバイスへの通信に関連している。
- 制御結合(Control coupling)
- あるモジュールに何をすべきかについての情報(例えば、処理を制御するためのフラグ)を渡すことで、別のモジュール処理の流れを制御する。
- スタンプ結合(Stamp coupling)
- 複数のモジュールが複合データ構造を共有し、その一部のみを使用する(例えば、全レコードの中の1つのフィールドを必要とする関数に全レコードのデータの構造体を渡す)。異なる部分も使用可能。これは、モジュールが必要としないフィールドが変更されることにより、モジュールのレコードを読み取る方法を変更することにつながる可能性がある。
- データ結合(Data coupling)
- モジュールを介してデータを共有する場合、例えば、引数である。 各データは基本部分であり、これらは単純なデータの受け渡しのみを行う(例えば、数値を渡してその平方根を返す)。
- メッセージ結合(Message coupling)「低」
- 最も結合度が低い結合の種類である。(引数のない)メソッドの呼び出し。メッセージパッシング。
- 無結合(No coupling)
- モジュールが相互に全く通信を行わない。
オブジェクト指向プログラミング
- サブクラス結合(Subclass Coupling)
- 子クラスとその親クラスとの間の関係で、子クラスは、その親クラスに依存しているが、親クラスが子クラスを知らない状態。子クラスが親クラスに依存しすぎると、親クラスを修正するのが難しくなる。
- 一時的結合(Temporal coupling)
- あるメソッドが別のメソッドに依存すること(例えば、executeしないとerrorが取得できない)。
脚注
参考文献
関連項目
- 粒度 …結合度は、対象に含まれる全ての要素(粒)の結び付きの尺度である。結合度の高さ低さとは直接関係はしないが、基本的に 粒度が高い方が結合度を低くしやすく好ましい。
- 凝集度 …結合度が低い方が、基本的に凝集しやすく好ましい。
|
---|
団体人物 | |
---|
概念 |
OOP | |
---|
構造性 | |
---|
操作性 | |
---|
関連性 |
- ジェネラライゼーション
- スペシャライゼーション
- リアライゼーション
- インプリメンテーション
- 多重度
- コンポジション
- アグリゲーション
- アソシエーション(英語版)
- ディペンデンシー
|
---|
拡張性 | |
---|
|
---|
図式 |
|
---|
派生言語 | |
---|
その他 | |
---|
カテゴリ |