Law of Demeter (LoD), znana także jako zasada najmniejszej wiedzy (ang. Least Knowledge Principle) to zasada programowania obiektowego, która stanowi, że obiekty powinny mieć ograniczoną wiedzę o innych obiektach, z którymi współpracują.
Zasada ta polega na tym, że obiekt powinien mieć ograniczoną wiedzę o innych obiektach i komunikować się tylko z bezpośrednimi sąsiadami, a nie z obiektami pośrednimi lub całymi strukturami. Innymi słowy, obiekt powinien znać tylko tyle, ile jest mu potrzebne do wykonania swojego zadania, a nie więcej.
Przykład złamania zasady LoD:
class Customer {
private String name;
private Address address;
public String getName() {
return name;
}
public Address getAddress() {
return address;
}
}
class Address {
private String street;
private String city;
private String state;
private String zip;
public String getStreet() {
return street;
}
public String getCity() {
return city;
}
public String getState() {
return state;
}
public String getZip() {
return zip;
}
}
class Order {
private Customer customer;
public Customer getCustomer() {
return customer;
}
}
class OrderService {
public void process(Order order) {
Customer customer = order.getCustomer();
Address address = customer.getAddress();
// ...
}
}
W powyższym przykładzie klasa OrderService łamie zasadę LoD, ponieważ próbuje uzyskać dostęp do właściwości obiektu Address poprzez pośredniczenie obiektu Customer. OrderService powinien uzyskać dostęp do właściwości Address bezpośrednio z obiektu Order, a nie z pośrednika jakim jest obiekt Customer.
Przykład spełnienia zasady LoD:
class Customer {
private String name;
private Address address;
public String getName() {
return name;
}
public Address getAddress() {
return address;
}
}
class Address {
private String street;
private String city;
private String state;
private String zip;
public String getStreet() {
return street;
}
public String getCity() {
return city;
}
public String getState() {
return state;
}
public String getZip() {
return zip;
}
}
class Order {
private Address address;
public Address getAddress() {
return address;
}
public Customer getCustomer() {
return customer;
}
}
class OrderService {
public void process(Order order) {
Address address = order.getAddress();
// ...
}
}
W tym przypadku klasa OrderService przestrzega zasady LoD, ponieważ uzyskuje bezpośredni dostęp do właściwości Address z obiektu Order, bez pośredniczenia przez obiekt Customer. Dzięki temu, klasa OrderService ma ograniczoną wiedzę o innych obiektach i komunikuje się tylko z bezpośrednimi sąsiadami, co wpływa na jakość kodu i ułatwia jego rozwój i utrzymanie w przyszłości.
Zasada LoD jest szczególnie ważna w przypadku dużych projektów programistycznych, gdzie jedna klasa może mieć wiele powiązań z innymi klasami. Przestrzeganie tej zasady ułatwia zrozumienie kodu, upraszcza testowanie i wpływa na jego wydajność.
Podsumowując, zasada LoD polega na minimalizowaniu wiedzy o innych obiektach i ograniczaniu komunikacji tylko do bezpośrednich sąsiadów. Dzięki temu zwiększa się modularność, upraszcza testowanie i rozwój kodu.