DEV Community

Anh Trần Tuấn
Anh Trần Tuấn

Posted on • Originally published at tuanh.net on

Reasons to Embrace the Law of Demeter (LoD) in Your Codebase

1. What Is the Law of Demeter?

Image

The Law of Demeter, also known as the principle of least knowledge, is a design guideline for developing software, particularly object-oriented programs. It states that a module should only interact with its immediate collaborators and not have knowledge of the internal details of the objects it manipulates. This means that an object should only "talk" to its friends, not to strangers.

1.1 Origins and Purpose of LoD

The Law of Demeter was introduced in the late 1980s as part of the Demeter project at Northeastern University. The purpose was to promote low coupling between software components, thereby improving modularity and reducing dependencies.

1.2 Why Is LoD Important?

Image

The Law of Demeter is important because it reduces the complexity of your code by limiting the interactions between objects. This makes your code easier to maintain, test, and debug, ultimately leading to fewer bugs and more resilient software.

2. Applying the Law of Demeter in Your Codebase

Adopting the Law of Demeter involves following a few simple rules when designing your classes and methods. Here’s how you can apply LoD in practice:

2.1 Avoiding "Train Wrecks"

Image

A common violation of the Law of Demeter occurs when your code starts to look like a chain of method calls, often referred to as a "train wreck." For example:

Customer customer = order.getCustomer().getAddress().getCity().getName();
Enter fullscreen mode Exit fullscreen mode

This code snippet demonstrates how one object is reaching deep into another object’s structure to retrieve data. This not only makes the code harder to read but also tightly couples your classes, making changes in one class potentially break others.

Solution:

To adhere to the Law of Demeter, you can refactor this code by introducing methods that encapsulate the internal details:

Customer customer = order.getCustomerName();
Enter fullscreen mode Exit fullscreen mode

This way, order is responsible for knowing how to get the customer's name, and the other parts of your code don't need to know the internal structure of the Customer object.

2.2 Designing with LoD in Mind

When designing your classes, consider how they interact with each other. Ensure that each class has a well-defined interface and only exposes the necessary methods. For example, if a Car object needs to interact with an Engine , it should do so through a method like startEngine() rather than accessing the engine’s internal methods directly.

Example:

class Car {
    private Engine engine;

    public void startCar() {
        engine.start();
    }
}
Enter fullscreen mode Exit fullscreen mode

In this example, the Car class interacts with the Engine through a method, respecting the Law of Demeter.

2.3 Reducing Dependency Chains

A long chain of dependencies can make your code brittle and hard to maintain. The Law of Demeter encourages breaking these chains by ensuring that each class only depends on its immediate collaborators.

Example:

Instead of having a House object that directly accesses the Window of a Room , you can refactor it to interact through the Room :

class House {
    private Room room;

    public void openWindow() {
        room.openWindow();
    }
}
Enter fullscreen mode Exit fullscreen mode

Here, the House interacts with the Room, and the Room interacts with the Window. This keeps the interactions local and manageable.

3. Benefits of Following the Law of Demeter

By following the Law of Demeter, you can achieve several benefits in your codebase:

Your code becomes more modular as each class only interacts with its immediate collaborators. This modularity makes it easier to understand, maintain, and extend.

With fewer dependencies between classes, unit tests become easier to write and maintain. You can test each class in isolation, leading to faster and more reliable tests.

The Law of Demeter naturally reduces the coupling between classes, making your code more flexible and easier to refactor.

4. Common Misconceptions About the Law of Demeter

While the Law of Demeter is a powerful guideline, it's often misunderstood. Let’s clarify some common misconceptions:

Some developers mistakenly believe that following the Law of Demeter means eliminating all dependencies between classes. In reality, LoD encourages limiting unnecessary dependencies while allowing necessary ones.

Another misconception is that following LoD will degrade performance due to the added method calls. However, in modern software development, the benefits of maintainability and readability far outweigh the minor performance impact.

5. Conclusion

The Law of Demeter is more than just a guideline—it's a fundamental principle for writing clean, maintainable code. By limiting the interactions between your classes, you can create a more modular, testable, and robust codebase. Start applying the Law of Demeter today and see the difference it can make in your projects.

Have questions or need clarification? Feel free to drop a comment below!

Read posts more at : Reasons to Embrace the Law of Demeter (LoD) in Your Codebase

Top comments (0)