デメテルの法則は、結合と結合に関するオブジェクト指向システムにどのように適用されますか?[閉まっている]


15

デメテル法則は、結合と結合を備えたオブジェクト指向システムにどのように適用されますか?

私は「ソフトウェア開発と専門的実践」という本を読んでいて、LoDに関する章に出くわし、その原理がオブジェクト指向システムにどのように適用されるのか興味がありました。


かつて、高レベルのカップリング(スタートポロジ)を持つプロジェクトを継承しました。「メディエーターパターン」を使用してオブジェクト間の結合を制限し、代わりにメディエーターが各オブジェクトと会話できるようにして、物事を整理しました。カップリングはまだ関係していますが、カップリングされる個人の数を制限します。設計に高いカップリングの問題があると感じた場合、これをさらに検討したい人もいるかもしれません。
Jeach

回答:


9

Emerson Macedoによると、Demeter法則は次のように述べています。

  • 各ユニットは、他のユニットに関する限られた知識のみを持つ必要があります。現在のユニットに「密接に」関連するユニットのみです。
  • 各ユニットは、その友人とのみ会話する必要があります。見知らぬ人と話をしないでください。
  • 身近な友達とだけ話してください。

これは、上記のように、ユニット(またはオブジェクト)が想定される低結合の原理に直接対応します。

  • 互いに密結合しないでください。最も近いもののみです。
  • 各自はコラボレーターとのみ話し、コラボレーターのコラボレーターとは話さない
  • すぐに共同作業を行うオブジェクトとのみ話す

カップリングの最も低い形式の1つはメッセージの受け渡しです。つまり、パラメーターを使用したメソッド呼び出しを通じてオブジェクト間でデータが共有されます。

さらに、私が見ることができることから、デメテルの法則は、オブジェクト自体が自分が所有するデータを知るべきであると述べるだけであるため、高凝集原則に直接対応していません。凝集度の低いオブジェクトには、独自のメソッドで頻繁に使用していないデータメンバーがあります。オブジェクトの関係やコラボレーションオブジェクトというよりも、オブジェクトのコンテンツに関するものです。


8

カップリング、簡素化

オブジェクトが別のオブジェクトのメソッド、プロパティなどを呼び出すとき、オブジェクトは結合されていると言います。呼び出し先が独自のメソッド/プロップについて何も変更できないため、これをカップリングと呼びます。破壊w.out 発信者を

したがって、より多くのカップリング-メソッド、小道具。- 呼び出し先コードを使用するすべてのコードを壊すことなく、呼び出し先コードを変更するのが難しくなります。

カップリングを考えている

  • 1つのプロパティを参照する場合でも、メソッドは2つのオブジェクトを結合します。
  • ソフトウェアを作成するには、明らかに結合が必要です。
  • 結合の「ロックステップ」の性質を考えると、制限と分離の両方を行います。この目標は、一般的なソフトウェア開発者と単純に一致します。原則。
  • 対話するオブジェクトが少ないほど、結合は低くなります。
  • たとえば、20の異なるメソッド呼び出しを行う必要がある場合、20の呼び出しすべてが1つのクラス/オブジェクトに対するものである場合、結合は低くなります。逆に、それらの同じメソッドは複数のクラス/オブジェクトに広がります。

ほとんどの知識はクレイジーなカップリングを引き起こします

ここで我々はEmployee持っているPerson「アドレス」を持っていることを

public class Employee {
    public Person me = new Person();
}
public class Person {
    public Address home = new Address();
}
public class Address {
    public string street;
} 

通りを取得するには、電話する必要がありますmyEmployee.me.home.street。これは、最小知識の原則の180度反対です。私がする必要が知っている、内部についての複合構造、EmployeePerson、およびAddressクラスを。

この欠陥のあるクラス設計により、それらすべてのクラスについて知る必要があるため、myEmployee.me.home.street私(呼び出し元オブジェクト)を3つ以上のクラスに結合し、1つのプロパティのみを取得します!

最低限の知識が日を救う

Employeeクラスのみと話す場合、私はそれ自体最小の知識原理を適用します。そうすることで、自動的にそのクラスのみに結合を制限し、同時にそのクラスへの結合を分離します。

Employeeクラスに必要なすべてのプロパティを追加することにより、結合を修正します。

かくして

public class Employee {
    public Person me = new Person();
    public string street { return me.home.street; }
}

電話をかけることができます:myEmployee.street-

  1. 私は「知っている」だけ Employee
  2. Employeeどんなに複雑な構造であっても、私は結合しているだけです。

最少知識

私たちは、からmyEmployeeを切り離さPersonAddress、理想的に我々は追加することによって、少なくとも知識を適用続けるべきパススルーをするような性質Employeeだけの話にPersonしてPerson唯一のに話しますAddress


1

調査(V. Basili、L。Briand、およびWL Melo。品質指標としてのオブジェクト指向設計メトリックの検証)は、応答セットが大きいクラスは、応答セットが多いため、応答セットが小さいクラスよりも多くのエラーを作成する傾向があることを示していますより高い結合の可能性を意味します。

デメテルの法則の価値は、定義によって設定された応答を減らすことです。オブジェクトのメソッドは、それ自体のメソッド、メソッドに渡されたパラメーター、作成したオブジェクトのメソッド、および直接保持されたオブジェクトのメソッドのみを呼び出すことができます。応答セットが小さいため、カップリングが大きくなる可能性が低くなります。モジュール/メソッドは即時利用可能な参照のみを使用しているため、より高い凝集度があります。


1
また、研究(Anquetil、N.およびLaval、J. Legacy Software Restructuring:Analysing a Concrete Case)も、カップリングを減らして凝集度を高めると、必ずしも品質が向上しないことを示しています。有害と考えられる単一の小規模な研究の結果に依存しています。

0

とても簡単です。AはBに依存し、BはCに依存します。デメテルの法則がなければ、AでBとCの両方を使用できますが、この法則に従うことで、AはBのみに依存し、Cに依存できません。

これにより、モジュールの依存関係の数が大幅に減少するため、低結合が可能になります。結合は、結合とは概念が異なりますが、同じ方法で実現されます。モジュールへの依存関係を少なくすることで、これらはそのモジュールに対してより具体的になり、凝集度が高まります。また、モジュールの総数が増加し、依存性のあるモジュール(神オブジェクトとは反対)に特化したものを実行するためにより特化され、より一貫したシステムに直接変換されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.