カップリングは「依存」を意味します。仕事を成し遂げるために「クラスB」に依存する「クラスA」の場合です。
タイトカップリングは、「クラスA」が「クラスB」の実装を使用する場合です。疎結合とは、「クラスA」が「クラスB」の抽象化を使用する場合です。
これは正しい理解ですか、それとも単純化しすぎていますか?
タイトカップリングとは、「クラスA」が「クラスB」または「クラスB」のオブジェクトを直接呼び出してジョブを実行することです。疎結合では、「クラスA」は、抽象クラスまたは抽象クラスのオブジェクトを呼び出してジョブを実行します。したがって、「クラスB」が言及された抽象を実装する場合、「クラスA」は、「クラスB」に依存せずに、間接的に「クラスB」と呼ばれます。
例として、「クラスB」は、SQLServerDbでクエリを実行するためのサービスを提供するデータ層であると考えてください。たとえば、Oracle DB、MySQL、XMLなどで同じアプリケーションを実行したい場合はどうなりますか。「クラスB」に依存する代わりに「クラスA」を使用する場合は、IDBProviderなどの抽象クラスに依存します。次に、IDBProviderを実装するだけの任意のクラスで「クラスA」を使用できます。これは疎結合です。
次の例を考えてみましょう。
// 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);
}
最初の例では、クラスFoo
とMyClass
は緊密に結合されています。MyClass
はFoo
だけでなく、Foo
の依存関係にも依存します。 、Worker
およびTask
クラスのように。さらに、MyClass
はFoo
の非常に特定の内部に依存します。特定の順序でいくつかのメソッドを呼び出す必要があります。 Foo
で何かを変更するには、MyClass
も変更する必要がある可能性がはるかに高くなります。
2番目の例は、Foo
自体にのみ依存しています。したがって、Foo
が内部でWorker
の使用を停止した場合、MyClass
は気にする必要はありません。 MyClass
とFoo
は疎結合です。
結局のところ、それはすべて知識に関するものです。それを使用するために特定のクラス/メソッドについて知る必要があるほど、結合は緊密になります。
「コンクリーションではなく抽象化に依存する」は、低結合を実現するための一般的な方法です。しかし、抽象クラス/インターフェースを導入しても、結合が自動的に減少するわけではありません。むしろ、あるクラスと別のクラスとの可能な相互作用(知識)を減らす方法を考える必要があります。