The Law of Demeter (LoD), also known as the Principle of Least Knowledge, is a design guideline aimed at reducing the coupling between components in a system. It states that a module should only communicate with its immediate collaborators and not with distant objects.
The Law of Demeter suggests that an object should only call methods of:
Consider the following code where Customer accesses methods of Order and Product:
class Product {
double getPrice() {
return 100.0;
}
}
class Order {
private Product product;
Order(Product product) {
this.product = product;
}
Product getProduct() {
return product;
}
}
class Customer {
private Order order;
Customer(Order order) {
this.order = order;
}
double getProductPrice() {
return order.getProduct().getPrice();
}
}
This violates LoD because Customer interacts with Order and Product. To adhere to LoD, delegate the responsibility to Order:
class Product {
double getPrice() {
return 100.0;
}
}
class Order {
private Product product;
Order(Product product) {
this.product = product;
}
double getProductPrice() {
return product.getPrice();
}
}
class Customer {
private Order order;
Customer(Order order) {
this.order = order;
}
double getProductPrice() {
return order.getProductPrice();
}
}
By following the Law of Demeter, you reduce dependencies and make your system more robust and adaptable to changes.