要求一个对象应该对其他对象有最少的了解
降低类之间的耦合
迪米特法则就是一个类正在创建方法和属性的时候要遵守的法则
多用于我们设计类的时候来使用这个迪米特原则
我们下面这段代码,通过两个类实现人关机的案例
static void Main(string[] args)
{
//实现人关机的案列
}
public class 电脑
{
//1.保存当前程序
public void 保存程序()
{
Console.WriteLine("保存当前程序");
}
//2.关闭显示器
public void 关闭屏幕()
{
Console.WriteLine("关闭屏幕");
}
//3.关闭电源
public void 关闭电源()
{
Console.WriteLine("关闭电源");
}
}
public class 人类
{
public void 关机(电脑 电脑)
{
电脑.保存程序();
电脑.关闭屏幕();
电脑.关闭电源();
}
}
代码看起来是没什么问题的,可是不符合我们的迪米特原则,迪米特原则的第一句话就是类和类之间应该有最少的了解。现在我们将此需求改变,我们关机需要五十步,如果这个关机类不是你写的,是你们团队的某个人写的,当你需要调用的时候你岂不是要通读这个类,去看看这五十步是怎么回事。这对我们程序员来说是非常痛苦的。这就是没使用迪米特原则来写代码的代价。
优化:
static void Main(string[] args)
{
//实现人关机的案列
}
public class 电脑
{
//1.保存当前程序
private void 保存程序()
{
Console.WriteLine("保存当前程序");
}
//2.关闭显示器
private void 关闭屏幕()
{
Console.WriteLine("关闭屏幕");
}
//3.关闭电源
private void 关闭电源()
{
Console.WriteLine("关闭电源");
}
public void 关机()
{
this.保存程序();
this.关闭屏幕();
this.关闭电源();
}
}
public class 人类
{
public void 关机(电脑 电脑)
{
电脑.关机();
}
}
这里我们在电脑类里添加一个方法,我们只需要让人这个类知道我有一个关机的方法供他调用就可以了,以至于关机的步骤其实对他来说可以让他不知道,这也就符合我们的迪米特原则了。
迪米特原则中最重要的思想:只和直接朋友通信
那么什么是直接朋友?
- 成员对象
- 方法参数
- 方法返回值
- 出现在局部变量中的类不是直接朋友
请看例子
static void Main(string[] args)
{
//实现打印总公司和分公司的人员ID
///总公司员工类
///总公司员工管理类 1获取总公司所有员工2.打印总公司员工3.打印分公司员工
///分公司员工类
///分公司员工管理类 获取分公司所有员工
总公司员工管理类 总公司 = new 总公司员工管理类();
分公司员工管理类 分公司 = new 分公司员工管理类();
总公司.打印();
分公司.打印();
Console.ReadKey();
}
public class 总公司
{
public int ID { get; set; }
}
public class 总公司员工管理类
{
public List<总公司>获取所有员工()
{
List<总公司> 总公司人数 = new List<总公司>();
for (int i = 0; i < 10; i++)
{
总公司 总公司 = new 总公司();
总公司.ID = i;
总公司人数.Add(总公司);
}
return 总公司人数;
}
//打印总公司的ID
public void 打印()
{
//获取总公司员工
List<总公司> 总公司人数= this.获取所有员工();
Console.WriteLine("总公司的员工ID是:");
foreach (var item in 总公司人数)
{
Console.WriteLine(item.ID+"、");
}
}
}
public class 分公司
{
public int ID { get; set; }
}
public class 分公司员工管理类
{
public List<分公司> 获取分公司所有员工()
{
List<分公司> 分公司人数 = new List<分公司>();
for (int i = 0; i < 5; i++)
{
分公司 分公司 = new 分公司();
分公司.ID = i;
分公司人数.Add(分公司);
}
return 分公司人数;
}
public void 打印()
{
//获取分公司员工
List<分公司> 分公司人数 = this.获取分公司所有员工();
Console.WriteLine("分公司的员工ID是:");
foreach (var item in 分公司人数)
{
Console.WriteLine(item.ID + "、");
}
}
}
这就符合我们的迪米特原则!