勇哥注:
迪米特法则是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
版权声明:本文为博主原创文章,转载请附上博文链接!

