web-dev-qa-db-ja.com

これは、密結合と疎結合の正しい理解ですか?

カップリングは「依存」を意味します。仕事を成し遂げるために「クラスB」に依存する「クラスA」の場合です。

タイトカップリングは、「クラスA」が「クラスB」の実装を使用する場合です。疎結合とは、「クラスA」が「クラスB」の抽象化を使用する場合です。

これは正しい理解ですか、それとも単純化しすぎていますか?

2

タイトカップリングとは、「クラスA」が「クラスB」または「クラスB」のオブジェクトを直接呼び出してジョブを実行することです。疎結合では、「クラスA」は、抽象クラスまたは抽象クラスのオブジェクトを呼び出してジョブを実行します。したがって、「クラスB」が言及された抽象を実装する場合、「クラスA」は、「クラスB」に依存せずに、間接的に「クラスB」と呼ばれます。

例として、「クラスB」は、SQLServerDbでクエリを実行するためのサービスを提供するデータ層であると考えてください。たとえば、Oracle DB、MySQL、XMLなどで同じアプリケーションを実行したい場合はどうなりますか。「クラスB」に依存する代わりに「クラスA」を使用する場合は、IDBProviderなどの抽象クラスに依存します。次に、IDBProviderを実装するだけの任意のクラスで「クラスA」を使用できます。これは疎結合です。

2
mesut

次の例を考えてみましょう。

// Let's say this method lives in a class MyClass
public void doSomething(Foo foo, Bar bar) {
    foo.prepareProcessing();
    Worker work = foo.createWorker();
    work.dispatchTask(new Task(bar), 12);
    work.start();
    foo.waitForWorker(work);
    foo.finishProcessing();
}

次のように比較してください。

public void doSomething(Foo foo, Bar bar) {
    foo.runTaskAtPriority(bar, 12);
}

最初の例では、クラスFooMyClassは緊密に結合されています。MyClassFooだけでなく、Fooの依存関係にも依存します。 、WorkerおよびTaskクラスのように。さらに、MyClassFooの非常に特定の内部に依存します。特定の順序でいくつかのメソッドを呼び出す必要があります。 Fooで何かを変更するには、MyClassも変更する必要がある可能性がはるかに高くなります。

2番目の例は、Foo自体にのみ依存しています。したがって、Fooが内部でWorkerの使用を停止した場合、MyClassは気にする必要はありません。 MyClassFooは疎結合です。

結局のところ、それはすべて知識に関するものです。それを使用するために特定のクラス/メソッドについて知る必要があるほど、結合は緊密になります。

「コンクリーションではなく抽象化に依存する」は、低結合を実現するための一般的な方法です。しかし、抽象クラス/インターフェースを導入しても、結合が自動的に減少するわけではありません。むしろ、あるクラスと別のクラスとの可能な相互作用(知識)を減らす方法を考える必要があります。

1
lethal-guitar