デメテルの法則は、結合と結合を備えたオブジェクト指向システムにどのように適用されますか?
私は「ソフトウェア開発と専門的実践」という本を読んでいて、LoDに関する章に出くわし、その原理がオブジェクト指向システムにどのように適用されるのか興味がありました。
デメテルの法則は、結合と結合を備えたオブジェクト指向システムにどのように適用されますか?
私は「ソフトウェア開発と専門的実践」という本を読んでいて、LoDに関する章に出くわし、その原理がオブジェクト指向システムにどのように適用されるのか興味がありました。
回答:
Emerson Macedoによると、Demeterの法則は次のように述べています。
これは、上記のように、ユニット(またはオブジェクト)が想定される低結合の原理に直接対応します。
カップリングの最も低い形式の1つはメッセージの受け渡しです。つまり、パラメーターを使用したメソッド呼び出しを通じてオブジェクト間でデータが共有されます。
さらに、私が見ることができることから、デメテルの法則は、オブジェクト自体が自分が所有するデータを知るべきであると述べるだけであるため、高凝集の原則に直接対応していません。凝集度の低いオブジェクトには、独自のメソッドで頻繁に使用していないデータメンバーがあります。オブジェクトの関係やコラボレーションオブジェクトというよりも、オブジェクトのコンテンツに関するものです。
カップリング、簡素化
オブジェクトが別のオブジェクトのメソッド、プロパティなどを呼び出すとき、オブジェクトは結合されていると言います。呼び出し先が独自のメソッド/プロップについて何も変更できないため、これをカップリングと呼びます。破壊w.out 発信者を。
したがって、より多くのカップリング-メソッド、小道具。- 呼び出し先コードを使用するすべてのコードを壊すことなく、呼び出し先コードを変更するのが難しくなります。
カップリングを考えている
ほとんどの知識はクレイジーなカップリングを引き起こします
ここで我々は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度反対です。私がする必要が知っている、内部についての複合構造、Employee
、Person
、および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
-
Employee
Employee
どんなに複雑な構造であっても、私は結合しているだけです。最少知識
私たちは、からmyEmployeeを切り離さPerson
とAddress
、理想的に我々は追加することによって、少なくとも知識を適用続けるべきパススルーをするような性質Employee
だけの話にPerson
してPerson
唯一のに話しますAddress
調査(V. Basili、L。Briand、およびWL Melo。品質指標としてのオブジェクト指向設計メトリックの検証)は、応答セットが大きいクラスは、応答セットが多いため、応答セットが小さいクラスよりも多くのエラーを作成する傾向があることを示していますより高い結合の可能性を意味します。
デメテルの法則の価値は、定義によって設定された応答を減らすことです。オブジェクトのメソッドは、それ自体のメソッド、メソッドに渡されたパラメーター、作成したオブジェクトのメソッド、および直接保持されたオブジェクトのメソッドのみを呼び出すことができます。応答セットが小さいため、カップリングが大きくなる可能性が低くなります。モジュール/メソッドは即時利用可能な参照のみを使用しているため、より高い凝集度があります。
とても簡単です。AはBに依存し、BはCに依存します。デメテルの法則がなければ、AでBとCの両方を使用できますが、この法則に従うことで、AはBのみに依存し、Cに依存できません。
これにより、モジュールの依存関係の数が大幅に減少するため、低結合が可能になります。結合は、結合とは概念が異なりますが、同じ方法で実現されます。モジュールへの依存関係を少なくすることで、これらはそのモジュールに対してより具体的になり、凝集度が高まります。また、モジュールの総数が増加し、依存性のあるモジュール(神オブジェクトとは反対)に特化したものを実行するためにより特化され、より一貫したシステムに直接変換されます。