定义:一个对象应该对其他对象保持最少的了解。
问题由来:类与类之间的关系越密切,耦合度越大,当一个类发生改变时,对另一个类的影响也越大。
解决方案:尽量降低类与类之间的耦合。
自从我们接触编程开始,就知道了软件编程的总原则,低耦合,高内聚。无论是面向对象编程还是面向过程编程,只有使各个模块之间的耦合尽量的低,才能提高代码的复合率。低耦合的优点不言而喻,但是怎么样编程才能做到低耦合昵?
迪米特法则又称为最少知道法则,最早是在1987年美国Northeastern University的lan Holland提出的。通俗来讲,就是一个类对自己依赖的类知道的越少越好。也就是说,对于被依赖的类来说,无论逻辑多么复杂,都尽量地的将逻辑封装在类的内部,对外除了提供的public方法,不对外泄露任何信息。迪米特法则还有一个更简单的定义:只与直接的朋友通信。首先来解释一下什么是直接的朋友;每隔对象都会与其它对象有耦合关系,只要两个对象之间有耦合关系,我们就说这两个对象之间是朋友关系。耦合的方式很多,依赖、关联、组合、聚合等。其中,我们称出现成员变量、方法参数、方法返回值中的类为直接的朋友,而出现在局部变量中的类则不是直接的朋友。也就是说,陌生的类最好不要作为局部变量的形式出现在类的内部。
举一个例子:有一个学校类,班级类和学生类,现在要求打印出班级下面 所有的学生信息,先来看一下反迪米特反正的设计。
public class Student
{
public int Id{get;set;}
public string StudentName{get;set;}
}
public class Class{
public int Id{get;se;}
public int ClassName{get;set;}
public List StudentList{get;set;}
public void Print()
{
foreach(Student s in this.StudentList)
{
Console.WriteLine{"{0}Manage{1}",s.GetType().Name,s.StudentName};
}
}
}
public class School{
public int Id{get;set;}
public string SchoolName{get;set;}
public List ClassList{get;set;}
public void Print(){
foreach(Class c in this.ClassList){
Console.WriteLine("Manage{0},this.GetType().Name");
c.Print();
//
List studentList = c.StudentList;
//
foreach (Student s in studentList)
//
{
//
Console.WriteLine(" {0}Manage {1} ", s.GetType().Name, s.StudentName);
//
}
}
}
}
注意点:调用班级打印学生名称的方法,避免使用学校类直接来打印学生名称,从而避免了与班级的学生发生耦合。每个类只对与之关联的类进行建立关系,不要跨类进行调用,降低耦合。使程序更加的灵活,复用;
迪米特法则的初衷是降低类之间的耦合,由于每个类都减少了不必要的依赖,因此的确可以降低耦合关系.但是凡事都有度,虽然可以避免与非直接的类通信,但是要通信,必然会通过一个"中介"来发生联系.