Dancrumbが上で述べているように、法律の考え方は、人々が適切なレベルでオブジェクトにアクセスできるようにすることだと思います。
Band
私たちのクラスがバンドのオフィスのフロント デスクをモデル化していると想像してください。バンドメンバーへのPAとして活動し、バンドと交流したい人に対応するのが仕事です.
ここで、PR 会社のツアー プロモーターが、次のツアーの PR 資料をまとめたいと考えているとします。クラスで彼をモデル化できます。
class TourPromoter {
public String makePosterText(Band band) {
String guitaristsName = band.getGuitarist().getName();
String drummersName = band.getDrummer().getName();
String singersName = band.getSinger().getName();
StringBuilder posterText = new StringBuilder();
posterText.append(band.getName()
posterText.append(" featuring: ");
posterText.append(guitaristsName);
posterText.append(", ");
posterText.append(singersName);
posterText.append(", ")
posterText.append(drummersName);
posterText.append(", ")
posterText.append("Tickets £50.");
return posterText.toString();
}
}
実生活では、これはツアー プロモーターがオフィスに電話をかけ、次のように言っているのと同じです。
PAはすぐに解雇されると言えば十分です。ほとんどの合理的な人々は、「その電話を処理してくれませんでしたか?」と尋ねるでしょう。
getGuitaristsName()
技術的にはデメテルの法則を尊重する方法を使用することもできますが、TourPromoter
クラスにはまだバンドに関する詳細を覚えておくように求めています。
賢明な方法でメソッドを導入していることを確認するには、ツアー プロモーターが実際に探しているもの、つまりすべてのバンド メンバーの名前を調べる必要があります。Band
そのメソッドをコードでモデル化すると、後で変更する際の柔軟性が高まりますTourPromoter
。
public class Band {
private Singer singer;
private Drummer drummer;
private Guitarist guitarist;
public String[] getMembers() {
return {singer.getName(), drummer.getName(), guitarist.getName()};
}
}
public class TourPromoter {
public String makePosterText(Band band) {
StringBuilder posterText = new StringBuilder();
posterText.append(band.getName());
posterText.append(" featuring: ");
for(String member: band.getMembers()) {
posterText.append(member);
posterText.append(", ");
}
posterText.append("Tickets: £50");
return posterText.toString();
}
}
ここで Bassist または KeyboardPlayer を追加すると、Band クラスだけが違いを知る必要があり、ツアー プロモーターは変更する必要がありません。これは、単一責任の原則も尊重していることを意味します。つまりmakePosterText()
、バンドが変わった場合ではなく、ポスターのフォーマットを変更した場合にのみ方法を変更する必要があります。
私は、デメテルの法則が、最良の方法で(例えば、上記getMembers()
ではなく)原則を満たすためにどの方法を引き出す必要があるかを教えてくれるとは思わない.getGuitaristsName()
物事が壊れたときですが、必ずしもそれらを修正する方法ではありません。ただし、LoD を念頭に置くということは、SRP などの他の設計原則の組み合わせによって修正できる違反に注意を払うことを意味します。