BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース 分散システムにおける適度な結合とは - Viadik Khononov氏のDDD Europeでの講演より

分散システムにおける適度な結合とは - Viadik Khononov氏のDDD Europeでの講演より

原文(投稿日:2020/02/17)へのリンク

我々はこれまで、結合は悪である、と教えられていた。そのために、すべてのものを分割して小さなサービスや関数に分解することで、それぞれのサービスが独立的に変更できるようにしてきた。一方で、この論法に従った結果として、混乱の分散(distributed mess)に陥ることが少なくない — 先日アムステルダムで開催されたDDD Europe 2020での講演で、Vladik Khononov氏はこのように述べた。結合に抗う代わりとして氏が提案するのは、システム設計を改善する経験則として結合を設計ツールにする、というものだ。

Doit InternationalのクラウドアーキテクトであるKhononov氏は、結合をコンポーネント間の関係性における自由度として定義した、Michael Nygard氏の論を紹介している。これは制約かも知れないが、変化を安全にするためには制約が必要なのだ、とKhononov氏は言う。結合は設計の一部であり、システム内で解決する問題なのである。さらに氏は、すべてのシステムのコンポーネントには関係性がある、そうでなければそれはシステムではなく、無関係な独立したエンティティの集まりに過ぎない、とも述べている。つまり、システムを設計するためには、システム設計の必然的部分として関係性を扱い、設計することが必要なのだ。

結合の程度はさまざまだが、それは3つのディメンジョンで測ることができる。強度(stregngth)距離(distance)、そして変動性(volatility)である。これら3つの特性の組み合わせによって、システムに対する結合の全体的な影響が定義される。

関係性の強度は、システム内のひとつのコンポーネントの変更による他のコンポーネントへの影響を定義する。Glenford J. Myers氏は、1970年代に書かれた"Reliable Software Through Composite Design"と"Composite/Structured Design"という2つの著作の中で、構造化設計に関する6つの結合のタイプについて説明している。

  • 内容結合(Content Coupling)は最も強い結合で、ひとつのモジュールが、別のモジュールの実装の詳細を直接的に参照するものである。今日では一般的ではないが、リフレクションはプライベートコードであるべきものにアクセスする手段のひとつだ。
  • 共通結合(Common Coupling)。グローバルアクセスの可能な非構造化メモリ空間を通じてモジュールがコミュニケーションする。これも今日のシステムでは稀なタイプの結合である。
  • 外部結合(External Coupling)。グローバルアクセスの可能なプライベート値を通じてモジュールがコミュニケーションする。共通結合に似ているが、ドキュメントが整備されているため、結合度はそれよりも低い。
  • 制御結合(Control Coupling)。モジュールが他のモジュールの実行ロジックをコントロールする。そのためには、他のモジュールの振る舞いや実行環境に関する知識を持っていなくてはならない。
  • スタンプ結合(Stamp Coupling)。モジュールがデータ構造を交換することでコミュニケーションする。そのため、構造体の変更が両方に影響する。
  • データ結合(Data Coupling)は、プリミティブな型を交換することによってモジュールがコミュニケーションするもので、統合に必要なのはそれらのみである。6つの結合の中では結合度が最も低く、最も望ましいものだ。

オブジェクト指向プログラミングの世界では、モジュール間の関係の評価はさらに重要である。コナーセンス(Connascence)Meilir Page-Jones氏が提唱したソフトウェア品質の評価基準で、構造化設計における結合度と同じように、オブジェクト指向設計での依存関係を論ずるものだ。ひとつのコンポーネントの変更が別のコンポーネントの変更を必要とする場合、両方のコンポーネントの変更を必要とする変更が想定できる場合、これらのコンポーネントにはコナーセンスがあると定義される。複合設計と同じようにコナーセンスにもレベルがあり、静的(static)と動的(dynamic)の2つにカテゴライズされる。静的コナーセンスはコードを読むことで解析可能だが、動的コナーセンスはソフトウェア実行時の動作を観察する必要がある。

結合のもうひとつのディメンジョンは距離である。コンポーネント間の接続はメソッド間、クラス間、コンポーネント間、サービス間、さらにはシステム間まで拡張することができる。コンポーネント間の距離が大きくなれば、両方に影響する変更を調整するために必要な労力も大きくなる。同じクラスの2つのメソッドを変更するのは、多数のユーザを抱えるシステムのAPIの変更を調整することに比べれば、はるかに簡単で安価だ。結合を最小化する手段としてMeilir Page-Jones氏が推奨するのは、まず最初に、コナーセンスを可能な限り低いレベルにするためのリファクタリングを行うことだ。その次に、カプセル化境界を越えるコナーセンスの最小化と、カプセル化境界内のコナーセンスの最大化を行う。

変動性は結合の第3ディメンジョンであり、コンポーネントの変更の頻度や、共有可能な場合は変更の理由によって影響される。Michael Nygard氏は、変更理由の違いによる結合のレベルとして、意味論的(semantic)、機能的(functional)、開発(development)、運用(operational)、偶発的(accidental)の5つを定義した。意味論的結合の例は、ビジネスドメインモデルを共有する2つのコンポーネントだ。モデルが変更されると、両方のコンポーネントを変更しなければならない。これは構造化設計におけるスタンプ結合に近い。

Khononov氏は要約として、2つのコンポーネント間の関係性を述べた3つのディメンジョン間の相互作用が、関連性を維持することの難しさに影響する、と述べている。最小化に必要なのは、偶発的な結合を回避すること、コナーセンスを可能な限り低減すること、明確なインターフェースの統合によって変動性を吸収すること、距離を小さくすることだ。

マイクロサービスに関心のある人への書籍として、Khononov氏は"Composite/Structured Design"を推奨する。発刊から40年の同書にマイクロサービスという用語はないが、議論の基盤にある理念は同じものだ。

Khononov氏の講演のスライドは公開されており、ダウンロードが可能である。カンファレンスの講演の大部分は録画されており、今後数ヶ月中に公開される予定である。

この記事に星をつける

おすすめ度
スタイル

BT