疎結合のメリットが活きるWebサービス

文:Jeff Hanson(TechRepublic) 翻訳校正:村上雅章・野崎裕子
2008-01-07 08:00:00
  • このエントリーをはてなブックマークに追加
最新特集【一覧】

 コンポーネント同士の結合を緩やかにすることで、互いが干渉し合うことなく独立した操作を行わせることが可能になる。そして、すべてのコンポーネントが常に利用可能であるとは限らないようなWebサービスを設計する際には、こういったコンポーネントがしっくりくる。

 結合とは一般的に、鎖の輪のように2つのものを1つにまとめるという動作を指している。しかしソフトウェア開発においては、結合は普通、ソフトウェアのコンポーネントやモジュールが互いに依存している度合いを指している。コンポーネント同士が結びついている度合いによって、それらが密結合であるか、あるいは疎結合であるかが決定される。密結合のコンポーネントでは、各コンポーネントと、すべての副次的に依存するオブジェクトがコンパイル時だけではなく、実行時にも存在していなければならない。その一方、疎結合のコンポーネントは互いに独立して操作を行うことが可能である。

コンパイル時の結合

 ソフトウェア開発においては、通常のプログラミング手法を用いて1つ以上のコンポーネントを互いに関連付けることで、結合が生み出されることになる。例えば、CやC++の開発者が外部ソースファイルを他のソースファイルからインクルードすると、結合が生み出されることになる。また、インポート文やインクルード文が使用されている場合には必ず、現在のクラスやファイルと、インポートされるクラスやファイルとの間に結合が生み出されるということになる。以下のコード片がそのことを示している。

#include 
#include "externalprocs.h"
void doSomething(MyStruct* aStruct) {
    dumpStructContents(aStruct);
}

 このコード片には、外部ファイルをインポートする行が2行記述されている。最初の文はexternalstructs.hという名前のファイルをインクルードするというものである。ここではMyStructという構造体がこのファイル中に定義されていると仮定してほしい。そして2番目の文はexternalprocs.hという名前のファイルをインクルードするというものである。ここではdumpStructContentsという手続きがこのファイル中に定義されていると仮定してほしい。

 このコード片はC言語を用いて記述されているため、コード同士の依存はすべてコンパイル時に生み出されることになる。これはアーリーバインディング(早期束縛)と呼ばれる。このコード片では、MyStructの構造や、dumpStructContentsのシグネチャを少しでも変更すると、doSomethingを含んでいるファイルと、dumpStructContentsを含んでいるファイルの再コンパイルが必要となるため、コンパイル時の依存性が非常に高いということになる。

実行時の結合

 また、やり取りを行う2つのコンポーネントが実行時に同一のプロセス空間に存在する必要がある場合にも結合が生み出される。この種の結合によって、1つのコンポーネントの配備が他のコンポーネントの存在に依存するという制約が課されることになる。

 1つのコンポーネントが実行時に他のコンポーネントに対して要求を行い、呼び出し側のコンポーネントが、呼び出されたコンポーネントからの応答を待たなければならない場合、時間的な結合が生み出されることになる。こういった時間的な結合は同期呼び出しとも呼ばれ、ある特定プロセスの応答が、呼び出し側プロセスの許容範囲を超えて遅くなった場合、アプリケーション障害が引き起こされるおそれがある。非同期呼び出しによって、コンポーネント同士の時間的な結合をなくすメカニズムが提供される。

  • 新着記事
  • 特集
  • ブログ