Bird
Raised Fist0
LLDsystem_design~10 mins

Law of Demeter in LLD - Scalability & System Analysis

Choose your learning style10 modes available
Scalability Analysis - Law of Demeter
Growth Table: Law of Demeter Impact
UsersCode ComplexityModule CouplingMaintenance EffortBug Rate
100LowLowLowLow
10,000ModerateModerateModerateModerate
1,000,000High if violatedHigh if violatedHigh if violatedHigh if violated
100,000,000Very High if violatedVery High if violatedVery High if violatedVery High if violated

The Law of Demeter helps keep code loosely coupled and easier to maintain as user base grows.

First Bottleneck

When the Law of Demeter is violated, the first bottleneck is increased code coupling. This leads to modules depending too much on internal details of others.

As users and features grow, this causes maintenance difficulty and bug introduction because changes ripple through many modules.

Scaling Solutions
  • Strict adherence: Ensure each module only talks to its immediate friends, not friends of friends.
  • Use interfaces: Hide internal details behind clear interfaces to reduce coupling.
  • Refactor: Break down large modules into smaller, focused ones to reduce dependencies.
  • Automated tests: Use tests to catch unintended coupling and side effects early.
  • Code reviews: Enforce the Law of Demeter during reviews to maintain clean design.
Back-of-Envelope Cost Analysis

Violating the Law of Demeter increases maintenance cost exponentially with user growth.

  • At 1,000 users, small coupling issues cause minor delays.
  • At 10,000 users, fixing bugs from tight coupling can cost weeks of developer time.
  • At 1 million users, downtime or bugs due to coupling can cause significant revenue loss.
  • At 100 million users, system instability from poor design can cause catastrophic failures.
Interview Tip

When discussing scalability, explain how following the Law of Demeter reduces coupling and improves maintainability.

Describe how this prevents cascading failures and makes the system easier to extend as users grow.

Use simple examples like "talk only to your immediate friends" to show understanding.

Self Check

Question: Your codebase is tightly coupled violating the Law of Demeter. As traffic grows 10x, bugs increase and maintenance slows. What do you do first?

Answer: Refactor code to reduce coupling by enforcing the Law of Demeter. Introduce interfaces and limit module knowledge to immediate neighbors to improve scalability and maintainability.

Key Result
Following the Law of Demeter keeps code loosely coupled, preventing maintenance and bug issues as user scale grows from thousands to millions.

Practice

(1/5)
1.

What is the main idea behind the Law of Demeter in system design?

easy
A. An object should only communicate with its immediate friends.
B. An object can access any part of the system freely.
C. Objects should share all their internal details with others.
D. Objects must avoid any communication with other objects.

Solution

  1. Step 1: Understand the Law of Demeter principle

    The Law of Demeter states that an object should only talk to its immediate friends, meaning it should not reach deep into other objects.
  2. Step 2: Match the principle to the options

    An object should only communicate with its immediate friends. correctly describes this idea, while others contradict it.
  3. Final Answer:

    An object should only communicate with its immediate friends. -> Option A
  4. Quick Check:

    Law of Demeter = Talk only to immediate friends [OK]
Hint: Remember: Only talk to your immediate friends [OK]
Common Mistakes:
  • Thinking objects can access any part of the system
  • Believing objects should share all internal details
  • Assuming no communication is allowed between objects
2.

Which of the following code snippets follows the Law of Demeter?

class Car {
  Engine engine;
  void start() {
    engine.start();
  }
}
easy
A. Calling engine.start() directly inside Car is allowed.
B. Accessing engine.fuel.tank.level inside Car is allowed.
C. Calling engine.getFuel().getTank().getLevel() is preferred.
D. Car should access engine.fuel.tank.level directly.

Solution

  1. Step 1: Identify allowed communication

    According to the Law of Demeter, Car can call methods on its direct member engine.
  2. Step 2: Analyze the options

    Calling engine.start() directly inside Car is allowed. shows Car calling engine.start(), which is allowed. Options A, B, and C involve accessing deeper nested objects, which breaks the law.
  3. Final Answer:

    Calling engine.start() directly inside Car is allowed. -> Option A
  4. Quick Check:

    Direct member calls = Allowed [OK]
Hint: Only call methods on your direct members [OK]
Common Mistakes:
  • Accessing nested objects directly
  • Chaining multiple getters in one call
  • Ignoring encapsulation principles
3.

Consider this code snippet:

class A {
  B b;
  void doSomething() {
    int x = b.getC().getValue();
    System.out.println(x);
  }
}

Which statement about this code is true regarding the Law of Demeter?

medium
A. It follows the Law of Demeter perfectly.
B. It violates the Law of Demeter by chaining calls.
C. It violates the Law of Demeter by not calling b directly.
D. It follows the Law of Demeter by accessing getValue().

Solution

  1. Step 1: Analyze the method call chain

    The code calls b.getC().getValue(), which chains two calls to reach a nested object.
  2. Step 2: Compare with Law of Demeter

    The Law of Demeter discourages chaining calls like this; an object should only call methods on its direct members.
  3. Final Answer:

    It violates the Law of Demeter by chaining calls. -> Option B
  4. Quick Check:

    Chained calls = Violation [OK]
Hint: Watch out for chained method calls [OK]
Common Mistakes:
  • Thinking chained calls are allowed
  • Confusing direct member calls with nested calls
  • Ignoring encapsulation rules
4.

Identify the problem in this code snippet related to the Law of Demeter and suggest a fix:

class Order {
  Customer customer;
  void printCustomerCity() {
    System.out.println(customer.getAddress().getCity());
  }
}
medium
A. No problem; code follows the Law of Demeter.
B. Violation: Order should print city without any method calls.
C. Violation: Order should access Address directly. Fix by removing Customer.
D. Violation: Order accesses nested Address. Fix by adding getCity() in Customer.

Solution

  1. Step 1: Identify Law of Demeter violation

    Order calls customer.getAddress().getCity(), chaining calls to nested objects.
  2. Step 2: Suggest fix to follow Law of Demeter

    Add a getCity() method in Customer that returns the city, so Order calls only customer.getCity().
  3. Final Answer:

    Violation: Order accesses nested Address. Fix by adding getCity() in Customer. -> Option D
  4. Quick Check:

    Use direct member methods to avoid chaining [OK]
Hint: Add helper methods to avoid deep calls [OK]
Common Mistakes:
  • Ignoring nested call chains
  • Removing needed objects instead of fixing access
  • Trying to print without method calls
5.

You are designing a messaging system where ChatRoom has User objects, and each User has a Profile. To follow the Law of Demeter, how should ChatRoom get a user's display name?

hard
A. Make Profile public and access displayName directly.
B. chatRoom.getUser().getProfile().getDisplayName() chaining calls is fine.
C. Add a method getDisplayName() in User and call chatRoom.getUser().getDisplayName().
D. Let ChatRoom access Profile objects directly.

Solution

  1. Step 1: Identify Law of Demeter violation in chaining

    Chaining calls like getUser().getProfile().getDisplayName() breaks the Law of Demeter.
  2. Step 2: Apply Law of Demeter by adding helper method

    Adding getDisplayName() in User lets ChatRoom call only one method on its direct friend User.
  3. Final Answer:

    Add a method getDisplayName() in User and call chatRoom.getUser().getDisplayName(). -> Option C
  4. Quick Check:

    Use helper methods to avoid deep chains [OK]
Hint: Use helper methods in immediate objects [OK]
Common Mistakes:
  • Allowing chained calls
  • Making internal objects public
  • Accessing nested objects directly
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard