The Law of Demeter is a design guideline that suggests a module should only communicate with its immediate friends and not with strangers. It means an object should only call methods of: itself, its fields, parameters, or objects it creates.
Click to reveal answer
beginner
Why is the Law of Demeter important in system design?
It reduces dependencies between modules, making the system easier to maintain and less fragile. Changes in one part of the system are less likely to break others.
Click to reveal answer
intermediate
Which of the following violates the Law of Demeter?
order.getCustomer().getAddress().getCity()
This violates the Law of Demeter because it accesses a chain of objects beyond immediate friends. The object should not reach through multiple objects to get data.
Click to reveal answer
intermediate
How can you fix a violation of the Law of Demeter?
You can add methods to intermediate objects to hide internal structure. For example, add a method getCity() in Customer that returns the city, so callers don't chain calls.
Click to reveal answer
beginner
What is a real-life analogy for the Law of Demeter?
Imagine you want to know the weather. Instead of asking your friend’s friend’s friend, you ask your friend directly. Your friend then asks their friend and tells you the answer. You don’t talk to strangers.
Click to reveal answer
Which of these is a principle of the Law of Demeter?
AUse global variables for communication
BAccess any object in the system freely
CTalk only to your immediate friends
DChain multiple method calls across objects
✗ Incorrect
The Law of Demeter advises to only communicate with immediate friends (directly related objects).
What problem does the Law of Demeter help to avoid?
ALow performance
BHigh coupling between modules
CMemory leaks
DSyntax errors
✗ Incorrect
It reduces tight coupling by limiting object interactions.
Which code snippet violates the Law of Demeter?
Auser.getProfile().getEmail()
Buser.sendMessage()
Corder.calculateTotal()
Dcart.addItem(item)
✗ Incorrect
Calling getEmail() on the profile object returned by getProfile() is chaining calls beyond immediate friends.
How can you improve code that violates the Law of Demeter?
AAdd methods to hide internal object details
BIncrease the number of chained calls
CUse global variables instead
DRemove all method calls
✗ Incorrect
Adding methods to intermediate objects encapsulates details and prevents chaining.
The Law of Demeter is also known as:
ADon't Repeat Yourself
BOpen/Closed Principle
CSingle Responsibility Principle
DPrinciple of Least Knowledge
✗ Incorrect
The Law of Demeter is often called the Principle of Least Knowledge.
Explain the Law of Demeter and why it is useful in designing software systems.
Think about how objects should limit their knowledge about others.
You got /4 concepts.
Describe a scenario where violating the Law of Demeter causes problems and how you would refactor it.
Consider how to hide internal object structure.
You got /4 concepts.
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
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.
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.
Final Answer:
An object should only communicate with its immediate friends. -> Option A
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
Step 1: Identify allowed communication
According to the Law of Demeter, Car can call methods on its direct member engine.
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.
Final Answer:
Calling engine.start() directly inside Car is allowed. -> Option A
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
Step 1: Analyze the method call chain
The code calls b.getC().getValue(), which chains two calls to reach a nested object.
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.
Final Answer:
It violates the Law of Demeter by chaining calls. -> Option B
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
Step 1: Identify Law of Demeter violation
Order calls customer.getAddress().getCity(), chaining calls to nested objects.
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().
Final Answer:
Violation: Order accesses nested Address. Fix by adding getCity() in Customer. -> Option D
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
Step 1: Identify Law of Demeter violation in chaining
Chaining calls like getUser().getProfile().getDisplayName() breaks the Law of Demeter.
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.
Final Answer:
Add a method getDisplayName() in User and call chatRoom.getUser().getDisplayName(). -> Option C
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 unknownstrongwhile earning +1 Grip toward your certificate.