デメテルの法則に沿わない、ダメな例
// NG。以下のようなコードを書くべきではない
class A {
private B b;
public B getB() {
return b;
}
}
class B {
public void hoge() {
System.out.println("hoge");
}
}
class Test {
public static void main(String[] args) {
new A().getB().hoge();
}
}
デメテルの法則に沿う、良い例
// OK。以下のようなコードが望ましい
class A {
private B b;
public void hoge() {
b.hoge();
}
}
class B {
public void hoge() {
System.out.println("hoge");
}
}
class Test {
public static void main(String[] args) {
new A().hoge();
}
}
なぜデメテルの法則に沿うようにするとよいのか?
例えば、クラスBのメソッド名が「hoge」から「fuga」に変わった場合、デメテルの法則が適用されている方のコードはTestクラスの中のコードを変更する必要はない。しかしデメテルの法則が適用されていない方のコードは、Testクラスのコードも変更する必要がある。(つまり、変更箇所が増える)
class A {
private B b;
public void hoge() {
// ↓ここを変えた
b.fuga();
}
}
class B {
// ↓ここを変えた
public void fuga() {
System.out.println("fuga");
}
}
class Test {
public static void main(String[] args) {
new A().hoge();
}
}