Zasady projektowania obiektowego – LoD

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.