If you ask any Software Developer, he would vouch that separation of concerns is the fundamental principles for maintaining any complex system and one of the vital links for achieving Separation of Concerns is decoupling.
Law of Demeter (LoD), also known as Principle of least knowledge, intends to reduce coupling between objects as proposed by Ian Holland.
Definition
The original version is outlined as follows.
Each unit should have only limited knowledge about other units: only units “closely” related to the current unit. Or: Each unit should only talk to its friends; Don’t talk to strangers.
The gist of the definition lies in the simple fact that the class should speak only to objects that it directly knows, or in other words, do not talk to strangers.
Let’s examine a real life scenario. You are out to stroll with your favourite pet. You do not order your pet’s legs to walk. Instead, you order your pet, which inturns commands its legs to move.
If we were to examine the rule from the perspective of an Object Oriented Programming Language,
A Method M, of an Object of Type C, may only call methods of
a) Class C
b) Parameters of method M
c) Instance variables of C
d) Objects created by M
e) Global Variables
Let’s write some code to replicate the Pet Scenario we discussed earlier.
public class Owner:IHuman,IHasPet { public string Name{get;set;} public Pet Pet{get;set;} public void MovePet() { Pet.GetLegs().Move(); } } public class Pet { private Legs _legs; public Legs GetLegs ( )=>_legs; } public class Legs { public void Move() { } }
As observed, the Owner Class uses instance of Pet to retrieve instance of Legs, and then request them to move.But, there is no reason the owner needs to be have access or knowledge of the legs or how the Pet commands the legs to move. This is the responsibility of the Pet class and should not be exposed the owner class.
In the above scenario, the Owner class has knowledge of something, which it doesn’t instantiate or should knowledge of and is a clear violation of Law of Demeter.
We can rewrite the classes to overcome the problem.
public class Owner:IHuman,IHasPets { public string Name{get;set;} public Pet Pet{get;set;} public void MovePet() { Pets.Move(); } } public class Pet { private Legs _legs; public void Move() { _legs.Move(); } }
In fact, if you look back at Gang Of Four patterns, many of the patterns discretely follows the Law Of Demeter.
A Word of Caution.
While the benefits of following the rule is evident, one also needs to be beware of focusing way too much on adherence to the rule, rather than fulfilling the purpose of the rule, which is to reduce coupling.
One thought on “Law Of Demeter”