05-迪米特法则(LOD 又名: 最少知道原则)

2023-12-18 22:10

本文主要是介绍05-迪米特法则(LOD 又名: 最少知道原则),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 背景

     类与类之间的关系越密切,耦合度越大,当一个类发生变化时,对另一个类的影响也越大。

2. 定义

    一个类应该对其它类保持最少的了解。

3. 解决方法

     尽量降低类与类之间的耦合。

4. 迪米特法则的核心

      低耦合

5.迪米特法则深究

  只与直接的朋友通信。
   每个对象都会与其他对象有耦合关系,只要两个对象之间有耦合关系,我们就说这两个对象之间是朋友关系。
     耦合的方式很多,依赖、关联、组合、聚合等。其中,我们称出现成员变量、方法参数、方法返回值中的类为直接的朋友, 而出现在局部变量中的类则不是直接的朋友。也就是说,陌生的类最好不要作为局部变量的形式出现在类的内部。

6. 模拟业务场景

  有一个集团公司,下面有很多分公司,现在要求,总公司打印出所有分公司员工的信息。剖析:总公司有很多员工(Employee),分公司里也有很多员工(SubEmployee);总公司与公司的员工、总公司与分公司、分公司与分公司的员工是直接朋友;总公司和分公司的员工不是直接朋友。

      先看一个违反了迪米特法则的设计方式:

 1     /// <summary>
 2     /// 总公司员工类
 3     /// </summary>
 4     public class Employee
 5     {
 6         private string id;
 7         public void setId(string id)
 8         {
 9             this.id = id;
10         }
11         public string getId()
12         {
13             return id;
14         }
15     }
 1     /// <summary>
 2     /// 分公司员工类
 3     /// </summary>
 4     public class SubEmployee
 5     {
 6         private string id;
 7         public void setId(string id)
 8         {
 9             this.id = id;
10         }
11         public string getId()
12         {
13             return id;
14         }
15     }
 1     /// <summary>
 2     /// 分公司管理类
 3     /// </summary>
 4     public class SubCompanyManager
 5     {
 6         /// <summary>
 7         /// 获取分公司员工信息
 8         /// </summary>
 9         /// <returns></returns>
10         public List<SubEmployee> getAll()
11         {
12             List<SubEmployee> list = new List<SubEmployee>();
13             for (int i = 0; i < 5; i++)
14             {
15                 SubEmployee sel = new SubEmployee();
16                 sel.setId("分公司员工" + i);
17                 list.Add(sel);
18             }
19             return list;
20         }
21 
22     }
 1 /// <summary>
 2     /// 总公司管理类
 3     /// </summary>
 4     public class CompanyManager
 5     {
 6         /// <summary>
 7         /// 获取总公司员工信息
 8         /// </summary>
 9         /// <returns></returns>
10         public List<Employee> getAll()
11         {
12             List<Employee> list = new List<Employee>();
13             for (int i = 0; i < 5; i++)
14             {
15                 Employee sel = new Employee();
16                 sel.setId("总公司公司员工" + i);
17                 list.Add(sel);
18             }
19             return list;
20         }
21         /// <summary>
22         /// 打印总公司员工信息
23         /// </summary>
24         public void printEmployee()
25         {
26             foreach (var item in this.getAll())
27             {
28                 Console.WriteLine(item.getId());
29             }
30         }
31         /// <summary>
32         /// 打印分公司员工信息
33         /// </summary>
34         public void printSubEmployee(SubCompanyManager sub)
35         {
36             //这里违背了迪米特法则,直接操控了分公司的员工,总公司和分公司员工不应该是直接关系
37             foreach (var item in sub.getAll())
38             {
39                 Console.WriteLine(item.getId());
40             }
41         }
42 
43     }
 1    public static void show()
 2         {
 3             //模拟业务场景:有一个集团公司,下面有很多分公司,现在要求,总公司打印出所有分公司员工的信息。
 4             //剖析:总公司有很多员工(Employee),分公司里也有很多员工(SubEmployee);总公司与公司的员工、总公司与分公司、分公司与分公司的员工是直接朋友;
 5             //总公司和分公司的员工不是直接朋友
 6 
 7             //下面先看一个违反了迪米特法则的设计:总公司管理类CompanyManager中直接操作了分公司的员工。
 8             //printSubEmployee方法中违背了迪比特法则,违背了迪米特法则,直接操控了分公司的员工,总公司和分公司不应该是直接关系
 9             CompanyManager cManager = new CompanyManager();
10             cManager.printSubEmployee(new SubCompanyManager());
11 
12         }

总结:总公司管理类CompanyManager中直接操作了分公司的员工。printSubEmployee方法中违背了迪比特法则,违背了迪米特法则,直接操控了分公司的员工,总公司和分公司不应该是直接关系。

改进后的设计:给SubCompanyManager类中添加打印分公司员工的方法,然后再CompanyManager中,直接调用打印分公司员工的方法,这样就是总公司依赖了分公司,得到了分公司员工的信息,并没有直接依赖分公司员工。

 1     /// <summary>
 2     /// 分公司管理类
 3     /// </summary>
 4     public class SubCompanyManager
 5     {
 6         /// <summary>
 7         /// 获取分公司员工信息
 8         /// </summary>
 9         /// <returns></returns>
10         public List<SubEmployee> getAll()
11         {
12             List<SubEmployee> list = new List<SubEmployee>();
13             for (int i = 0; i < 5; i++)
14             {
15                 SubEmployee sel = new SubEmployee();
16                 sel.setId("分公司员工" + i);
17                 list.Add(sel);
18             }
19             return list;
20         }
21 
22         /// <summary>
23         /// 新增:打印分公司员工信息,为了满足迪米特法则
24         /// </summary>
25         public void printSubEmployee()
26         {
27             foreach (var item in this.getAll())
28             {
29                 Console.WriteLine(item.getId());
30             }
31         }
32 
33     }
 1     /// <summary>
 2     /// 总公司管理类
 3     /// </summary>
 4     public class CompanyManager
 5     {
 6         /// <summary>
 7         /// 打印分公司员工信息2
 8         /// </summary>
 9         public void printSubEmployee2(SubCompanyManager sub)
10         {
11             //这里总公司直接依赖分公司,得到了分公司员工信息,遵循了迪米特法则
12             sub.printSubEmployee();
13         }
14 
15     }
    public static void show(){//模拟业务场景:有一个集团公司,下面有很多分公司,现在要求,总公司打印出所有分公司员工的信息。//剖析:总公司有很多员工(Employee),分公司里也有很多员工(SubEmployee);总公司与公司的员工、总公司与分公司、分公司与分公司的员工是直接朋友;//总公司和分公司的员工不是直接朋友//下面先看一个违反了迪米特法则的设计:总公司管理类CompanyManager中直接操作了分公司的员工。//printSubEmployee方法中违背了迪比特法则,违背了迪米特法则,直接操控了分公司的员工,总公司和分公司不应该是直接关系CompanyManager cManager = new CompanyManager();cManager.printSubEmployee(new SubCompanyManager());//下面是改进后的方案,遵循迪米特法则,给SubCompanyManager类中添加打印分公司员工的方法,然后再CompanyManager中,直接调用打印分公司员工的方法//这样就是总公司依赖了分公司,得到了分公司员工的信息,并没有直接依赖分公司员工
Console.WriteLine("--------------------下面是采用迪米特法则改进后的方案-----------------------");cManager.printSubEmployee2(new SubCompanyManager());}

 

转载于:https://www.cnblogs.com/yaopengfei/p/7118220.html

这篇关于05-迪米特法则(LOD 又名: 最少知道原则)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/509923

相关文章

忽略某些文件 —— Git 学习笔记 05

忽略某些文件 忽略某些文件 通过.gitignore文件其他规则源如何选择规则源参考资料 对于某些文件,我们不希望把它们纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。通常它们都是些自动生成的文件,比如日志文件、编译过程中创建的临时文件等。 通过.gitignore文件 假设我们要忽略 lib.a 文件,那我们可以在 lib.a 所在目录下创建一个名为 .gi

JVM内存调优原则及几种JVM内存调优方法

JVM内存调优原则及几种JVM内存调优方法 1、堆大小设置。 2、回收器选择。   1、在对JVM内存调优的时候不能只看操作系统级别Java进程所占用的内存,这个数值不能准确的反应堆内存的真实占用情况,因为GC过后这个值是不会变化的,因此内存调优的时候要更多地使用JDK提供的内存查看工具,比如JConsole和Java VisualVM。   2、对JVM内存的系统级的调优主要的目的是减少

MipMap的LOD实现原理

当使用MipMap时我们可能会遇到tex2D,tex2Dbias,tex2Dgrad,tex2Dlod几种纹理采样函数。 在PS中tex2D自动计算应该使用的纹理层。 tex2Dbias需要在t.w中指定一个偏移量来把自动计算出的纹理层全部偏移指定的值。 tex2Dgrad需要提供屏幕坐标x和y方向上的梯度来确定应该使用的纹理层。 tex2Dlod需要在t.w中明确指定要使用的纹

[情商-13]:语言的艺术:何为真实和真相,所谓真相,就是别人想让你知道的真相!洞察谎言与真相!

目录 前言: 一、说话的真实程度分级 二、说谎动机分级:善意谎言、中性谎言、恶意谎言 三、小心:所谓真相:只说对自己有利的真相 四、小心:所谓真相:就是别人想让你知道的真相 五、小心:所谓善解人意:就是别人只说你想要听到的话 前言: 何为真实和真相,所谓真相,就是别人想让你知道的真相!洞察谎言与真相! 人与人交流话语中,处处充满了不真实,完全真实的只是其中一小部分,这

C++入门(05-2)从命令行执行C++编译器_GCC

文章目录 GCC编译器1. 下载MinGW-w64,安装(不推荐)2. 使用MSYS2安装MinGW-w64(推荐)2.1 安装MSYS22.2 初始化和更新2.3 安装MinGW-w64编译器2.3 在MSYS2 Shell中导航到代码目录2.4 使用 g++ 编译2.5 运行可执行文件 GCC编译器 GCC(GNU Compiler Collection)是一个开源编译器集

C++入门(05)从命令行执行C++编译器_MSVC

文章目录 1.C++ 编译器2. 常用 C++ 编译器MSVC(Microsoft Visual C++)GCC(GNU Compiler Collection)Clang 3. MSVC 编译器3.1 开发者命令提示符3.2 编译 C++ 代码 1.C++ 编译器 将C++源代码(扩展名为 .cpp )转换成计算机可以运行的可执行程序 编译器会检查代码的语法和语义,生成相应

龙芯+FreeRTOS+LVGL实战笔记(新)——05部署主按钮

本专栏是笔者另一个专栏《龙芯+RT-Thread+LVGL实战笔记》的姊妹篇,主要的区别在于实时操作系统的不同,章节的安排和任务的推进保持一致,并对源码做了改进和优化,各位可以先到本人主页下去浏览另一专栏的博客列表(目前已撰写36篇,图1所示),再决定是否订阅。此外,也可以前往本人在B站的视频合集(图2所示)观看所有演示视频,合集首个视频链接为: 借助RT-Thread和LVGL

看病要排队这个是地球人都知道的常识

归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍+ 收藏⭐ + 留言​📝唯有付出,才有丰富的果实收获! 看病要排队这个是地球人都知道的常识。 不过经过细心的0068的观察,他发现了医院里排队还是有讲究的。0068所去的医院有三个医生(汗,这么少)同时看病。而看病的人病情有轻重,所以不能根据简单的先来

【每日一题】LeetCode 2379.得到K个黑块的最少涂色次数(字符串、滑动窗口)

【每日一题】LeetCode 2379.得到K个黑块的最少涂色次数(字符串、滑动窗口) 题目描述 给定一个字符串 blocks,其中每个字符代表一个颜色块,可以是 ‘W’(白色)或 ‘B’(黑色)。你需要找到一个至少包含 k 个连续黑色块的子串。每次操作可以将一个白色块变成黑色块。你的任务是找到至少出现一次连续 k 个黑色块的最少操作次数。 和该题目类似:【每日一题】LeetCode 202

【SpringMVC学习05】SpringMVC中的异常处理器

SpringMVC在处理请求过程中出现异常信息交由异常处理器进行处理,自定义异常处理器可以实现一个系统的异常处理逻辑。 异常处理思路 我们知道,系统中异常包括两类:预期异常和运行时异常(RuntimeException),前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。系统的dao、service、controller出现异常都通过throws E