勇哥注:
迪米特法则是1987年秋天由lan holland在美国东北大学一个叫做迪米特的项目设计提出的, 它要求一个对象应该对其他对象有最少的了解,所以迪米特法则又叫做最少知识原则
迪米特法则包含前后两个部分,如果我们把一个模块看作是一个人,
那么要实现“一个人应该对其他人有最少的了解”,应该做到这两点:
1、只和直接的朋友交流;
2、减少对朋友的了解。
接下来就详细说说如何做到这两点。
首先,我们来看一下,什么叫“朋友”?
软件开发中的朋友:两个对象之间的耦合关系称之为“朋友”,通常有依赖、关联、聚合和组合等。
而直接朋友则通常表现为关联、聚合和组合关系,
即两个对象之间联系更为紧密,通常以成员变量,方法的参数和返回值的形式出现。
减少对朋友的了解
举个例子,明星与粉丝的互动
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication11
{
class Program
{
static void Main(string[] args)
{
名星 star = new 名星();
star.和粉丝互动();
Console.ReadKey();
}
}
public class 粉丝
{
public void 握手()
{
Console.WriteLine($"与偶像握手");
}
public void 签名()
{
Console.WriteLine($"与偶像签名");
}
public void 合影()
{
Console.WriteLine($"与偶像合影");
}
public void 互动()
{
握手(); 签名(); 合影();
}
}
public class 名星
{
private 粉丝 fs=new 粉丝();
public void 和粉丝互动()
{
//由于粉丝类公布的公有方法太多,因此互动有下面的可能性
//1.
fs.互动();
//2.
fs.握手();
fs.签名();
fs.合影();
//3.
fs.签名();
fs.合影();
}
//问题:
//粉丝做为明星的朋友,公开方法太多,使得明星对粉化了解过程。
//明星就得花大精力去考虑以哪种方式跟粉丝互动
}
}问题:
粉丝做为明星的朋友,公开方法太多,使得明星对粉丝了解过多。
明星就得花大精力去考虑以哪种方式跟粉丝互动
修改后:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication11
{
class Program
{
static void Main(string[] args)
{
名星 star = new 名星();
star.和粉丝互动();
Console.ReadKey();
}
}
public class 粉丝
{
private void 握手()
{
Console.WriteLine($"与偶像握手");
}
private void 签名()
{
Console.WriteLine($"与偶像签名");
}
private void 合影()
{
Console.WriteLine($"与偶像合影");
}
public void 互动()
{
握手(); 签名(); 合影();
}
}
public class 名星
{
private 粉丝 fs=new 粉丝();
public void 和粉丝互动()
{
fs.互动();
}
}
}其实,明星由于全身心投入艺术,所以许多日常事务由经济人负责处理,
如粉丝见面会,和媒体公司的业务洽谈等。
这里的经纪人就是明星的直接朋友,粉丝和媒体公司是明星的间接朋友。
只和直接的朋友交流
现在,我们在刚才的场景中,加多一个经纪人类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication11
{
class Program
{
static void Main(string[] args)
{
名星 star = new 名星();
star.粉丝互动();
Console.ReadKey();
}
}
public class 粉丝
{
private void 握手()
{
Console.WriteLine($"与偶像握手");
}
private void 签名()
{
Console.WriteLine($"与偶像签名");
}
private void 合影()
{
Console.WriteLine($"与偶像合影");
}
public void 互动()
{
握手(); 签名(); 合影();
}
}
public class 名星
{
private 经纪人 man = new 经纪人();
public void 粉丝互动()
{
man.粉丝互动();
}
}
public class 经纪人
{
private 粉丝 fs;
private 商务洽谈 sw;
public 经纪人()
{
fs = new 粉丝();
sw = new 商务洽谈();
}
public void 粉丝互动()
{
fs.互动();
}
}
public class 商务洽谈
{
}
}明星的直接朋友只有一个,也就是他的经纪人,无需了解粉丝和公司。
这样做有一个好处,就是能够简化对象与对象之间的通信,
进而减轻依赖,提供更高的灵活性,当然也可以提供一定的安全性。
总结
不该有直接依赖关系的类之间,不要有依赖;
有依赖关系的类之间,尽量只依赖必要的接口(也就是定义中的“有限知识”)。
---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!


少有人走的路


















