00:00
看下迪米特法则。我们首先对迪米特法则做一个基本的介绍。第一点,一个对象应该对其他对象保持最少的了解。什么意思呢?就说比如说我有一个A类,A类里面呢有一个对象。对吧,它会用到这个对象,对象和对象之间。那么我们要保持最少的了解,就是这样的呢,它耦合性就会降低,第二个呢,类与类之间的关系越密切,耦合度就会越大。显然我们类和类之间的关系呢,要。耦合,耦合度要小的话,就让他们的关系尽量的松散。就不要过于的密切。那么迪米特法则又叫最少知道原则。怎么说这个什么是最少知道原则呢?即一个类,一个类,对自己以来的类知道的越少越好。也就是说,对于被以代的内,不管有多么的复杂,都尽量将封,将这个逻辑封装在类的内部,对外提供一个public。
01:06
就可以了,就说我们类和类之间的调用呢,通过public方法就OK,尽量不要对外泄露任何的信息。这些听起来都很抽象啊,同学们不要着急,后面我们会有案例的,因为你光从这个语言来说,你最多也就知道一句话,就最少知道就是什么呢,类和类,比如A类。他要依赖这个B类。所以依赖就是有可能他们是继承的关系,也有可能是实现的关系,是不是?当然他们也有可能是聚合的关系,也有可能是组合的关系。那么也就是说A类如果依赖这个B类。那么它的这个迪米特法则就是我们之间,就是A类和B类之间,他们要要满足这个,最少知道原则,这样它的耦合度才会降低。
02:00
那怎样降低呢?就A类如果用到B类,最好是我通过B类的一个public方法调用就可以,至于你B类里面怎么去实现的,我不关心。啊,就这样子的迪米特法则呢,还有一个更简单的定义,就是说就叫只与直接朋友进行通讯。那么什么叫直接朋友呢?大家不要着急,我给大家解解释一下何为直接朋友,认真听哈。所以直接朋友指的是每个对象。都会与其他对象有这个耦合关系。这一段写错了,有。有耦合关系。就说类对象和对象之间,你不可能是一丁点耦合关系都没有,这是很难做到的,所以他说有这个耦合关系,那么只要两个对象之间的耦合关系,只要两个对象偶关系,我们只要有这个耦合关系啊,我们就说两个对象之间是朋友关系。那么有是朋友关系,那就这个朋友关系里面有直接朋友,还有不是直接朋友,那现在我们来解释一下什么叫直接朋友。
03:12
那么我们刚才讲过,耦合的方式很多。就是什么叫耦合方式很多呢,就是比如说偶A类。要用到这个B类。其实这个A类和B类之间,他们就存在耦合了。大家明白我在说什么吗?就说A类,它只要用到B类,B类我们就叫有依赖,有依赖这个有依赖就叫有耦合。那么耦合的方式很多,有依赖、有关联,有组合、有聚合等。那么现在这个偶合方式的不同,它出现的位置不同呢?我们就来就可以决定他到底是直接朋友还是非直接朋友。什么情况,什么情况下我们称之为是直接朋友呢?就是如果出现是在成员变量方法参数或者方法返回值中的类,我们称之为直接朋友。我举个例子,大家认真听啊。
04:07
Ay。A类用到了B类。这个就叫依赖,或者叫说已经有耦合了,但是这个依赖的关系它有很多种,我们现在不是还没有讲那个类图吗。所以大家先听着,那如果这个A类,同学们注意听,如果这个A类里面有这样一种写法。怎么写法呢,我这有个B,注意听啊B。OK。大家可以看到,如果有一个B的对象,它是A类的一个成员变量,我们就称为B是A的直接朋友。明白。那同样还有一种可能是方法参数,比如说我这个A类里面有个方法叫M这个方法。这个M方法里面呢,我要去接收一个B这样的对象实例,这个也称之为B,是A的直接朋友。
05:05
好,还有一种可能,比如说我这有个方法叫M2,这个M2呢,它返回一个B这样的类型的一个对象实例,我们也称之为A,呃,也称之为B,是A的直接朋友。好,是这样子的。那么如果注意听,如果出现在局部变量的类呢?我们就不是直接朋友了。打个比方,还以A依赖B为例,比如说A这个类里面有个方法叫M3M2吧。MM3了这个M3里面呢,它直接就在这个M3里边去用到了这个B,比如说我在M3这个这个方法里边,我溜了一个B这样的对象实例。好,同学们,同学们,如果是这样一种情况呢,我们就这个B就不是A的这个BB类,就不是AA的直接朋友了,就这个意思明白了吧,所以说迪米特法则就规定。
06:04
陌,那么不是职业朋友是什么?这个就叫陌生的类。陌生的类,陌生的这个类呢,最好不要以局部变量的形式出现在类的内部,也就是说最好不要这样去写,你这有个M3。这个方法A类有个,就说我们这个A类里边呢,诶。AA类里边有一个M3这个方法。这个M3方方法里面呢。在局部变量里面突然使用到B了,那这个B。就是一个陌生类,对,对B,对A而言是一个陌生类,这种写法就不好。明白了吧,好,当然了,不要着急,后面我们还有案例啊,因为我这儿只是简单跟大家说一下,因为讲到这我肯定要做解释嘛。好了,同学们有了迪米特法则的一个基本介绍以后呢,我们来看一个小小的案例。我们来看一个案例,这个案例呢,它是这样子的。当然,第一个案例肯定是不遵守迪米特法则的。
07:03
然后我们用迪米特法则对它进行一个改进,就能充分的体会到何为迪米特法则,说有一个学校,这个学校呢,下属有各个学院,学院和还有他的总部,就他有总部,还有下属的学院。现在要求打印学校总部的员工的ID和学院员工的ID,就是说把他的各个学院的员工的ID打出来,再把他学校总部的各个员工的ID打出来,就是这么一个意思。那么这道题,这个题其实挺简单的,我们来给大家写一下啊,因为这个代码呢,嗯,比较多,而且比较简单,它多而且还比较简单,所以说这个代码我已经给大家准备好了,我们直接来给大家看一下就行,好吧来吧,我新建一个包包。这个包呢,我们就叫迪米特法则。就叫迪米特。迪米特,它的写法是迪米特。我们就。
08:01
它是个音译过来的啊,米特,然后呢,我就写到这儿,我们先看第一个案例。丁米特的低概率走低。米特。一。把方法勾上。那这段这段代码呢,我其实这边已经准备好了,我们直接拿来给大家看一眼就行,好吧,那同学们看,我这里有写了一段代码,我把这个代码呢,粘贴复制过来就可以了,因为它并不难。好朋友们,我们保存一下,我们来先看看这个代码,它是说了一个什么事情,好这个呢,你可以认为是客户端。就是使用的这这里有雇员。这个就是我们总部的哈,就相当于是学校。我我写到学校。学校。总部总部员工。好,这个很好理解,Employee,这是学校总部的员工。这个类。
09:01
好的,那这个学校总部的员工呢,里面我们就写了一个ID,有个set ID,有get ID就完事了。那这边是学院的员工,学院的员工。这个也很好,理学院员工类college employ里面呢,也有只有ID和只有ID信息,下面这个是一个什么类呢?注意听这是管理管理学院员工的。员工的一个类。就是管理类吧,管理类。这个管理类大家有没有发现,其实他就写了一个方法,这个方法是get or employee,就是他把这个学院他写的一个方法,可以把学院员工的所有的雇员返回来,而且大家有没有发现在这里呢?在这个方法里面,他临时创建了十个员工。大家看啊,这这个方法是返回。返回学院。
10:01
学院的所有员工。员工,OK,那这里呢,呃,在这个方法里面呢,我这写了一个for循环,For循环就是产生了,就像我们这一个集合里边,看到在这个集合里面,我们加了十个员工进去这里。这里我们增加了,增加了十个员工。对吧,十个员工。到哪里呢?到我们这个历史的集合。也就是说这个历史的集合里面呢,就是我们学院的员工,因为我要模拟嘛,所以说我这做了一个模拟,那下面这个地方呢,就是学校。学校的管理类也很好,也很好,理解也一样的。也一样的,这里面呢,它是返回。返回学校总部。学校总部的员工。对,那这里呢,我我们这里增加了几个呢,同学们大家看到这里我们增加了五个,五个员工到学校总部。
11:05
因为这五个员工是直接放到我们这个list里面的,而这个list里面放的就是我们总部的员工,是不是很好理解?好,嗯,那同学们看到这里面还。关于学校。这个类里面呢,还有一个方法叫print or employee,就是打印。这个方法是干什么呢?完成该方法,该方法完成完成输出。输出学校总部,注意听啊,学校总部和学院。学院员工。员工。员工信息的一个方法。那么这个信息现在目前呢,只有ID,大家看我怎么写的,首先我们这接收到一个college manager。College manager manager是不是就是我们管理学院员工的一个管理类?
12:02
他拿到过后呢,他在这里调用了一个get or employee,就把。就把学院的所有员工的信息得到了。是不是这个是获取到获取到学院。学院员工的所有员工啊,获取到学院员工,然后负循环输出,那这写个叫学院。学院的员工。那这个地方呢,同学们看到他在这里呢,是获取到获取到获取到学校总部。总部的员工。很好理解对不对,然后呢,也是输出。这个代码就写完了。这个代码就行了,其实这个功能主要是有两个管理类,有两个管理,一个是学院的。学院学院员工,呃,就说有一个学院员工的管理类,还有一个学校管理类,然后管理了各自的员工,然后呢,这输出了学校总部的员工和学院员工信息,就这么简单。
13:12
那现在呢,我们来用一下,看看是否能够跑起来,大家看我在这儿呢,同学们看这里,这里我们先创建了。创建了一个学校的管理类,就是school manager这个对象。然后在这个地方我们调用print all employee的方法,然后再把一个学院管理对象也放进去了。这是我的第一个方案,因为我要讲这个,我必须有个案例,同学们明白吧,我没有案例,我无法讲这个迪米特法则。好,显然这个地方其实就是干什么呢,就是就是输出了,输出了学校。呃,就是学院的员工ID和学校总部的。
14:00
学校总部的员工。员工。员工信息这个没问题吧,那我现在运行一下,同学们看运行完了,这个结果当然很很明确,大家看他首先呢,把学院员工的ID全部打出来了,显然我因为在。进行初始化的时候,学院员工只有十个,因此它的编号从零到九,十个员工,而学校总部呢,我只放了五个员工,因此它的编号是零到四就写完了。那同学们说,诶说老师,那你这个讲这个案例想干什么呢。我想干这样一件事情,同学们看啊,这段代码其实功能很简单,没有什么可说的,只要学过Java的同学都能看懂。那现在我们就来分析一下。在我们这一个类里面,哪一些是直接朋友,哪一些是陌生朋友,现在要要来做这件事情,来,我们以这个类,以school manager来分析出他的直接朋友是哪些,他的间接,他的陌生,陌生类又是哪些,来分析把那同学们看。
15:13
呃,首先同学们看到这个employee。我们来分析一下啊,分析就是school manager。Manager这个类它的直接朋友类。朋友类有哪些?来各位朋友聊一聊这个话题,首先我们看这个是不是他的直接朋友,显然是为什么,因为在刚才我已经讲过了。就说出现在方法参呃成员变量,方法参数和方法返回值都是类的直接朋友。因此这个家伙。他的直接朋友,这个就是。我们再来看。我们再来看。朋友们,我们接着继续往下看看这里。
16:00
College manager是不是他的直接朋友?是不是我们school manager的职业朋友?显然是为啥呀?是不是刚才已经讲过,如果出现在方法参数也是我们的直接朋友,没有问题吧?同学们好,这也是直接朋友,往下继续搂。往下继续揉,大家来看这个地方。再看这,哎,我们有没有发现一个问题。我们有没有发现问题?College manager?这个是他的职业朋友吗?不是他的知己朋友。为什么不知道,这边你看college employee它没有出现在school manager里面的,呃,这个成员变量,它不是它的成员变量,也不是他的一个方法参数传进来的,也不是返回值,因此这个地方就出现问题了,来分析到这里来了。他的职业朋友有employee,还有college manager。但是我们这个college。College。
17:01
College。Manager不是他的职业朋友,呃,这个employee不是他职业朋友。好,往这写。哦,我们分析出来就是这个呢,这个不是。不是什么呢?不是我们的直接朋友。那么这样就这样就干什么呢?就违反了或者违背了。违背什么呢?违背了我们的迪米特这个原则。奥丁米特。第一。迪米特法则。对不对?他违反了这个迪米特法则。为什么违反地,因为我们刚才在讲过了,就是呃,陌生类不要以局部变量出形式存在的,因为你这儿不是职业朋,而相当于是个陌生类了,不是职职业朋友,而是什么呢?而是一个陌生类。陌生类,因此他就,而且这个它不但嗯是陌生类,它是直接出现在我们,出现在我们局部变量的,它是以局部变量的形式出现在我们这个地方的,是不是,所以说这个地方呢,要改进。
18:13
哦,要改进,所以说我们把这整理一下啊,分析问题。分析问题,分析一下第一点。第一点,我们发现这里的。College manager干什么呢?他不是。不是我们这个school manager的。什么呀,直接朋友。直接朋友。那么第二点我们刚才又分析到了,但是他不是直接朋友呢,College college college employ干什么呢?是以。它是以这个局部变量的。这个形式形式。呃,它是以局部变量的这个方式出现在出现在哪里呢?出现在我们这个school manager的。
19:02
好,第三点,第三点我们可以就违反了,违反了什么呢?违反了我们的迪米特法则。好,现在问题已经分析出来了,那下面呢,自然我们要对这个代码进行一个改进,看怎样去修改就能够满足我们迪米特法则。好,关于这段代码的改进,我们放在下一个视频为大家讲解。
我来说两句