迪米特法则(Law of Demeter)又叫最少知道原则(Interface Segregation Principle)。
一个对象应该对其它对象有尽可能少的理解;比如有一个A类,A类肯定对自身的属性和方法是熟悉的;如果A类的方法传参的是B类,那么A类对B类也是熟悉;在A类中直接实例化一个C类,那A类也是对C类熟悉。除此之外,A类就不应对其它类熟悉。
如果要满足迪米特法则,那么就是尽可能少写public方法和变量,不需要让其它对象知道的变量或方法就不要公开。迪米特法则的主要目的是减少模块间的依赖,降低模块间的耦合度,提高代码的复用性。
举个例子,我们去饭店点菜,想要知道今天有什么菜色可以点,一般是直接找服务员。
//服务员 public class Waiter { public Menu menu = new Menu(); } //菜单 public class Menu { public string Content { get; set; } }
顾客获取菜单信息。
//顾客 public class People { public void GetMenu() { Waiter waiter = new Waiter(); Menu menu = waiter.menu; Console.WriteLine(menu.Content); } }
根据迪米特法则,People类是不应该获得Menu类的相关内容,没必要知道太多,这里却产生了依赖关系。我们应该进行修改,在Waiter类中不对外开放Menu类,通过Waiter的方法来提供Menu的信息。
//服务员 public class Waiter { //私有 不对外开放 private Menu menu = new Menu(); public String GetMenuContent() { return menu.Content; } } //顾客 public class People { public void GetMenu() { Waiter waiter = new Waiter(); Console.WriteLine(waiter.GetMenuContent()); } }
这样People就可以通过waiter的getMenuContent的方法来获取Menu信息,这样可以避免People和Menu产生依赖。