"笛米特法则":这是说"你的类对其它类知道的越少越好";
1.概念:
一个软件实体应当尽可能少的与其他实体发生相互作用。每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位。迪米特法则的初衷在于降低类之间的耦合。由于每个类尽量减少对其他类的依赖,因此,很容易使得系统的功能模块功能独立,相互之间不存在(或很少有)依赖关系。迪米特法则不希望类之间建立直接的联系。如果真的有需要建立联系,也希望能通过它的友元类来转达。因此,应用迪米特法则有可能造成的一个后果就是:系统中存在大量的中介类,这些类之所以存在完全是为了传递类之间的相互调用关系——这在一定程度上增加了系统的复杂度。
2.模拟场景:
场景:公司财务总监发出指令,让财务部门的人去统计公司已发公司的人数。
一个常态的编程:(肯定是不符LoD的反例)
UML类图:
代码演示:
namespace TestLibrary.ExtensionsClass
{
using System;
using System.Collections.Generic;
/// <summary>
/// 财务总监
/// </summary>
public class CFO
{
/// <summary>
/// 财务总监发出指令,让财务部门统计已发工资人数
/// </summary>
public void Directive(Finance finance)
{
List<Employee> employeeList = new List<Employee>();
// 初始化已发工资人数
for (int i = 0; i < 500; i++)
{
employeeList.Add(new Employee());
}
// 转告财务部门开始统计已结算公司的员工
finance.SettlementSalary(employeeList);
}
}
/// <summary>
/// 财务部
/// </summary>
public class Finance
{
/// <summary>
/// 统计已结算公司的员工
/// </summary>
public void SettlementSalary(List<Employee> employeeList)
{
Console.WriteLine(string.Format("已结算工资人数:{0}", employeeList.Count));
}
}
/// <summary>
/// 员工
/// </summary>
public class Employee
{
}
/// <summary>
/// 主程序
/// </summary>
public class Runner
{
public static void main(String[] args)
{
CFO cfo = new CFO();
// 财务总监发出指令
cfo.Directive(new Finance());
}
}
}
根据模拟的场景:财务总监让财务部门总结已发工资的人数。 财务总监和员工是陌生关系(即总监不需要对员工执行任何操作)。根据上述UML图和代码解决办法显然可以看出,上述做法违背了LoD法则。
依据LoD法则解耦:(符合LoD的例子)
UML类图:
代码演示:
namespace TestLibrary.ExtensionsClass
{
using System;
using System.Collections.Generic;
/// <summary>
/// 财务总监
/// </summary>
public class CFO
{
/// <summary>
/// 财务总监发出指令,让财务部门统计已发工资人数
/// </summary>
public void Directive(Finance finance)
{
// 通知财务部门开始统计已结算公司的员工
finance.SettlementSalary();
}
}
/// <summary>
/// 财务部
/// </summary>
public class Finance
{
private List<Employee> employeeList;
//传递公司已工资的人
public Finance(List<Employee> _employeeList)
{
this.employeeList = _employeeList;
}
/// <summary>
/// 统计已结算公司的员工
/// </summary>
public void SettlementSalary()
{
Console.WriteLine(string.Format("已结算工资人数:{0}", employeeList.Count));
}
}
/// <summary>
/// 员工
/// </summary>
public class Employee
{
}
/// <summary>
/// 主程序
/// </summary>
public class Runner
{
public static void main(String[] args)
{
List<Employee> employeeList = new List<Employee>();
// 初始化已发工资人数
for (int i = 0; i < 500; i++)
{
employeeList.Add(new Employee());
}
CFO cfo = new CFO();
// 财务总监发出指令
cfo.Directive(new Finance(employeeList));
}
}
}
根据LoD原则我们需要让财务总监和员工之间没有之间的联系。这样才是遵守了迪米特法则。