疎結合とは、基本的に、モジュールの進化方法に関するモジュール間の間接的な依存関係です。
一般に、緊密に結合されたシステムがある場合、さまざまなモジュール/オブジェクトには、周辺オブジェクトの動作を想定した非常に特定の動作があります。そのようなオブジェクトは他のモジュールの動作にリンク/結合されており、それらを単独でまたは他のコンテキストで再利用することはできません。
個々の機能を担当するモジュールが独立して進化できない、または進化できない場合でも、このようなモジュール
例:
3つのオブジェクト
Shape(モデルオブジェクト)とCanvas(UI要素)があるとします。今
メソッドshape.draw(Canvas)がキャンバスの平面によって提供される平面上にオブジェクトを描画すると想定します。
現在、ウィンドウの一部が覆われ、サイズが変更される場合があります。そのような場合、上記のメソッドはこのようなことをするだけかもしれません。
shape::draw(Canvas) {
Rect.WindowLeft = Canvas.GetWindowRect.getLeftOffset();
Rect.LeftPixel = Canvas.GetWindowRect.pixels() + Rect.WindowLeft;
.... // like this get all co-ordinates.
draw_instance(Rect); // This will draw the actual shape.
}
基本的に、ここでは、ドロー関数は、物事を描画する必要がある長方形をピックアップします。これは理解しやすい(人々はこの単純なと呼ぶかもしれません)コードです。ただし、これは非常に結合されたコードです。
状況を想像してみてください:
- キャンバスのウィンドウを保持するメカニズムが長方形ではなくなった場合はどうなりますか?
- Canvasが保持する追加のオフセットがプライベートである場合はどうなりますか?
- 他のアプリケーションが同じ形状を必要としているが、GUIウィンドウがなくなった場合(たとえば、画像を作成してファイルに保存している場合)はどうなるでしょうか。
この問題の根本的な原因は、オブジェクトがをshape 知っているため、と密に結合していることCanvasです。
ピクセルセットは、それが書き込む場所の形状に与えられることが望ましい。shapeピクセルが実際に書き込まれる場所に関する(暗黙的な)知識があってはなりません。