ソフトウェア工学において、結合とはソフトウェアモジュール間の相互依存度、2つのルーチンまたはモジュールがどれだけ密接に接続されているかの尺度、[1]およびモジュール間の関係の強さのことです。[2]結合は2次元ではなく多次元です。[3]

結合度は通常、凝集度と対比されます。結合度が低いと凝集度が高くなることが多く、その逆も同様です。結合度が低いことは、コンピューター システムが適切に構造化され、設計が優れていることの表れであると考えられており、凝集度が高いことと組み合わせると、読みやすさと保守性が高くなるという一般的な目標をサポートします。[要出典]
歴史
ソフトウェア品質のメトリクスである結合度と凝集度は、保守と変更のコストを削減する「優れた」プログラミング手法の特性に基づいて、 1960年代後半に構造化設計の一部としてラリー・コンスタンチンによって発明されました。凝集度と結合度を含む構造化設計は、 Stevens、Myers、Constantine (1974) [4] の論文とYourdon & Constantine (1979) [5]の書籍で発表され、後者はその後標準用語になりました。
カップリングの種類

結合は、「低い」(「緩い」や「弱い」とも呼ばれる)または「高い」(「密な」や「強い」とも呼ばれる)場合があります。結合の種類は、結合度の高い順に次のとおりです。
手続き型プログラミング
ここでのモジュールとは、あらゆる種類のサブルーチン、つまり、名前と、できれば独自の変数名のセットを持つ 1 つ以上のステートメントのセットを指します。
- コンテンツ結合度(高)
- コンテンツ結合は、あるモジュールが別のモジュールのコード (ブランチなど) を使用する場合に発生すると言われています。これは、基本的なソフトウェア設計概念である情報の隠蔽に違反します。
- 共通カップリング
- 共通結合は、複数のモジュールが同じグローバル データにアクセスする場合に発生すると言われています。ただし、変更が加えられたときに、制御不能なエラーの伝播や予期しない副作用が発生する可能性があります。
- 外部カップリング
- 外部結合は、2 つのモジュールが外部から課せられたデータ形式、通信プロトコル、またはデバイス インターフェイスを共有する場合に発生します。これは基本的に、外部のツールやデバイスとの通信に関係します。
- 制御カップリング
- 制御結合とは、あるモジュールが別のモジュールに何を実行するかに関する情報を渡すことによって (たとえば、実行内容フラグを渡すことによって)、そのモジュールのフローを制御することです。
- スタンプ結合(データ構造結合)
- スタンプ結合は、モジュールが複合データ構造を共有し、その一部、場合によっては異なる部分のみを使用する場合に発生します (たとえば、レコードの 1 つのフィールドのみを必要とする関数にレコード全体を渡す場合など)。
- このような状況では、モジュールが必要としないフィールドを変更すると、モジュールがレコードを読み取る方法が変わる可能性があります。スタンプ結合の概念を説明するために、コンポーネントを含むシナリオを考えてみましょう
UserProfile。このコンポーネントは、消費者が特定の属性のみを必要としている場合でも、要求に応答してユーザープロファイル情報全体を返すように設計されています。この方法はスタンプ結合の例であり、特に大規模になると、重大な帯域幅の問題につながる可能性があります。コンポーネント内のいずれかの属性が変更されると、変更された属性を使用していなくても、そのコンポーネントと対話するすべての消費者がテストを受ける必要がある場合があります。 [6]UserProfile - データ結合
- データ結合は、モジュールがパラメータなどを通じてデータを共有するときに発生します。各データは基本要素であり、共有されるデータはこれだけです (たとえば、平方根を計算する関数に整数を渡すなど)。
オブジェクト指向プログラミング
- サブクラスの結合
- 子と親の関係を説明します。子は親に接続されていますが、親は子に接続されていません。
- 時間的結合
- 2 つのアクションが偶然同時に発生するという理由だけで、1 つのモジュールにまとめられることです。
最近の研究では、さまざまなカップリング概念が研究され、実際に使用されているさまざまなモジュール化原則の指標として使用されています。[7]
動的結合
このタイプの結合を定義および測定する目的は、ソフトウェア システムの実行時評価を提供することです。動的バインディングまたは継承を集中的に使用すると、静的結合メトリックの精度が低下すると主張されてきました。[8]この問題を解決するために、動的結合の測定が考慮されました。
意味的結合
この種の結合メトリックは、たとえばコメントや識別子を使用し、潜在的意味索引(LSI) などの技術に依存して、ソフトウェア エンティティ間の概念的な類似性を考慮します。
論理結合
論理的結合 (または進化的結合、変更結合) 分析では、ソフトウェア システムのリリース履歴を利用して、モジュールまたはクラス間の変更パターンを見つけます。たとえば、一緒に変更される可能性が高いエンティティや変更のシーケンス (クラス A の変更の後には、常にクラス B の変更が続く) などです。
カップリングの寸法
グレゴール・ホッペによれば、カップリングは多次元的である。[3]
- テクノロジーへの依存
- 場所依存性
- トポロジ依存性
- データ形式と型の依存関係
- 意味的依存性
- 会話の依存性
- 順序の依存関係
- 時間依存性
密結合の欠点
密結合されたシステムは、次のような開発特性を示す傾向があり、これはしばしば欠点と見なされます。
- 通常、1 つのモジュールを変更すると、他のモジュールにも波及効果が生じます。
- モジュール間の依存関係が増加するため、モジュールの組み立てにはより多くの労力と時間が必要になる可能性があります。
- 依存モジュールを含める必要があるため、特定のモジュールの再利用やテストが難しくなる可能性があります。
パフォーマンスの問題
疎結合か密結合かに関係なく、システムのパフォーマンスは、メッセージとパラメータの作成、転送、変換 (マーシャリングなど)、およびメッセージの解釈 (文字列、配列、またはデータ構造への参照など) によって低下することがよくあります。これらの処理は、SOAPメッセージなどの複雑なメッセージを作成するよりもオーバーヘッドが少なくて済みます。メッセージが長くなると、生成により多くの CPU とメモリが必要になります。実行時のパフォーマンスを最適化するには、メッセージの長さを最小限に抑え、メッセージの意味を最大限にする必要があります。
- メッセージ送信のオーバーヘッドとパフォーマンス
- メッセージの意味を完全に保持するには、メッセージ全体を送信する必要があるため、メッセージの送信を最適化する必要があります。メッセージが長いほど、送受信に多くの CPU とメモリが必要になります。また、必要に応じて、受信者はメッセージを元の状態に再構成して完全に受信する必要があります。したがって、実行時のパフォーマンスを最適化するには、メッセージの長さを最小限に抑え、メッセージの意味を最大化する必要があります。
- メッセージ変換のオーバーヘッドとパフォーマンス
- メッセージ プロトコルとメッセージ自体には、多くの場合、追加情報 (パケット、構造、定義、言語情報など) が含まれています。そのため、受信者は、余分な文字や構造情報を削除したり、値をある型から別の型に変換したりして、メッセージをより洗練された形式に変換する必要があります。どのような種類の変換でも、CPU やメモリのオーバーヘッドが増加します。実行時のパフォーマンスを最適化するには、メッセージ形式とコンテンツを削減して洗練させ、意味を最大限に高め、翻訳を減らす必要があります。
- メッセージ解釈のオーバーヘッドとパフォーマンス
- すべてのメッセージは、受信側で解釈する必要があります。整数などの単純なメッセージは、解釈に追加の処理を必要としない場合があります。ただし、SOAPメッセージなどの複雑なメッセージは、意図した意味を表すためにパーサーと文字列トランスフォーマーが必要です。実行時のパフォーマンスを最適化するには、メッセージを改良して縮小し、解釈のオーバーヘッドを最小限に抑える必要があります。
ソリューション
結合を減らすための 1 つのアプローチは、機能設計です。これは、機能に応じてモジュールの責任を制限することを目的としています。次の場合、2 つのクラスAとBの間の結合が増加します。
- A にはBを参照する(型の)属性があります。
- A はオブジェクトBのサービスを呼び出します。
- Aには、 B を参照するメソッドがあります(戻り値の型またはパラメーター経由)。
- A はクラスBのサブクラスです(または実装します)。
低結合とは、あるモジュールがシンプルで安定したインターフェースを介して別のモジュールと対話し、他のモジュールの内部実装を考慮する必要がない関係を指します (「情報の隠蔽」を参照)。
CORBAやCOMなどのシステムでは、他のオブジェクトの実装について何も知らなくても、オブジェクトが相互に通信できます。これらのシステムでは、オブジェクトが他の言語で記述されたオブジェクトと通信することもできます。
結合と凝集
結合と凝集度は、非常に頻繁に一緒に使用される用語です。結合はモジュール間の相互依存性を指し、凝集度は単一のモジュール内の機能の関連性を表します。凝集度が低いということは、特定のモジュールが互いにあまり関連していないタスクを実行していることを意味し、そのためモジュールが大きくなると問題が発生する可能性があります。
モジュール結合
ソフトウェア工学における結合[9]では、この概念に関連するメトリクスのバージョンについて説明しています。
データと制御フローの結合の場合:
- d i : 入力データパラメータの数
- c i : 入力制御パラメータの数
- d o : 出力データパラメータの数
- c o : 出力制御パラメータの数
グローバル結合の場合:
- g d : データとして使用されるグローバル変数の数
- g c : 制御として使用されるグローバル変数の数
環境カップリングの場合:
- w : 呼び出されるモジュールの数(ファンアウト)
- r : 対象モジュールを呼び出すモジュールの数(ファンイン)
Coupling(C)モジュールの結合度が高いほど、値は大きくなります。この数値は、約 0.67 (低結合) から 1.0 (高結合) の範囲です。
たとえば、モジュールに入力と出力のデータパラメータが1つしかない場合
モジュールに5つの入力および出力データパラメータ、同数の制御パラメータがあり、ファンインが3、ファンアウトが4で10項目のグローバルデータにアクセスする場合、
参照
- 凝集性(コンピュータサイエンス)
- コナセンス (コンピュータサイエンス)
- カップリング(物理学)
- デッドコードの除去
- 依存地獄
- 遠心性カップリング
- 制御の反転
- オブジェクト指向プログラミング用語の一覧
- 疎結合
- (ソフトウェア)を作成する
- 静的コード分析
参考文献
- ^ ISO/IEC/IEEE 24765:2010 システムおよびソフトウェアエンジニアリング — 語彙
- ^ ISO/IEC TR 19759:2005、ソフトウェアエンジニアリング - ソフトウェアエンジニアリング知識体系ガイド (SWEBOK)
- ^ ab Hohpe, Gregor.エンタープライズ統合パターン:メッセージングソリューションの設計、構築、展開。Addison-Wesley Professional。ISBN 978-0321200686。
- ^ Stevens, Wayne P. ; Myers, Glenford J. ; Constantine, Larry LeRoy (1974 年 6 月)。「構造化設計」。IBM Systems Journal。13 ( 2): 115–139。doi :10.1147/sj.132.0115 。
- ^ エドワード・ユアドン、ラリー・ルロイ・コンスタンティン(1979) [1975]。構造化設計:コンピュータプログラムとシステム設計の分野の基礎。ユアドン・プレス。Bibcode : 1979sdfd.book..... Y。ISBN 978-0-13-854471-3。
- ^ リチャーズ、マーク。ソフトウェアアーキテクチャの基礎:エンジニアリングアプローチ。オライリーメディア。ISBN 978-1492043454。
- ^ Beck, Fabian; Diehl, Stephan (2011 年 9 月)。「モジュール性とコード結合の一致について」。第19 回 ACM SIGSOFT シンポジウムおよび第13 回欧州ソフトウェア工学基礎会議 (SIGSOFT/FSE '11) の議事録。ハンガリー、セゲド。p. 354。doi :10.1145/2025113.2025162。ISBN 9781450304436. S2CID 2413103。
{{cite book}}: CS1 メンテナンス: 場所が見つかりません 発行者 (リンク) - ^ Arisholm, Erik; Briand, Lionel C. ; Føyen, Audun (2004 年 8 月). 「オブジェクト指向ソフトウェアの動的結合測定」. IEEE Transactions on Software Engineering . 30 (8). IEEE : 491–506. doi :10.1109/TSE.2004.41. hdl : 10852/9090 . S2CID 3074827.
- ^ プレスマン、ロジャー S. (1982)。ソフトウェアエンジニアリング - 実践者のアプローチ(第 4 版)。マグロウヒル。ISBN 0-07-052182-4。
さらに読む
- Myers, Glenford J. (1974)。複合設計による信頼性の高いソフトウェア。ニューヨーク: Mason and Lipscomb Publishers。
- Offutt, A. Jefferson; Harrold, Mary Jean ; Kolte, Priyadarshan (1993年3 月)。「モジュール結合のためのソフトウェア メトリック システム」。システムおよびソフトウェア ジャーナル。20 (3): 295–308。doi : 10.1016 /0164-1212(93)90072-6。
- Page-Jones, Meilir (1980)。構造化システム設計の実践ガイド。ニューヨーク: Yourdon Press。ISBN 978-8-12031482-5。
- ソフトウェアエンジニアリング用語の標準用語集。ニューヨーク:IEEE。1990年。ISBN 0-7381-0391-8610.12_1990.
- 「CPSA (Certified Professional for Software Architecture) カリキュラム - 基礎レベル」(PDF)。3.01。国際ソフトウェアアーキテクチャ資格委員会 (ISAQB)。2015-05-15 [2009] 。2017-03-29 にオリジナル(PDF)からアーカイブ。2019-06-23に取得。[1] 2016年2月22日にWayback Machineにアーカイブ
