00:00
在这之前,我放一段小视频。你的徒弟大师,大师慈悲为怀,你就放了我一马吧,好吧,你知不知道,你知不知道什么是当当当当,什么当当什么当当当当当当当当当当,就是就是。红路蓝落去心的中撒叫捉风里有狼把珠叫放鲜火放进无法赐我,你本领最大就是好了好了好了好了好了,不放了,我是开个玩笑啊。
01:12
呃,那个我看已经有人开始那个接接接电影台词了,好,我不聊电影台词了啊,这个就是刚才这小段呢,呃,非常生动的展现了到底什么叫滴滴滴啊滴滴滴就是当当当,那到底什么是当当当当当呢?那就是only you是吧,能伴我取西经。Only能解决我关于设计方面的各种各样的方法论的问题啊,开个玩笑开个玩笑啊,呃,这课呢,我以前很少分享啊,主要的原因是什么呢?这个这个课分享起来太费劲。呃,当然。呃,最近呢,我们是在那个讲这个,呃。我们是在讲那个ddd的第二版了。
02:02
嗯。好,最近呢,我们是呃,开始在讲滴滴的第二版了,第一版呢,我们已经是大致讲过一版。呃,滴滴这玩意儿呢,我在公开课上一直不太愿意讲它,不太想讲它,原因是什么呀?主要因为它太简单了,其实我我估计我有个半个小时就能把滴滴D给你讲清楚。呃,当然那个。另外一方面不想讲的原因呢,其实因为是它太复杂了,因为他牵扯的因素太多了,他很难控制。呃,讲这个东西呢,很容易造成说我讲的人容易啊,我这写的很清楚,叫梅费色,我口若血啊,听的人容易是满头雾水,一脸懵逼。呃,我不知道在座的有多少同学以前是了解过一点关于ddd的东西的。那么了解过的同学,你给老师扣个一,我认识一下好不好,嗯。
03:00
用了半年啊,不错不错啊,这这这其实其实好多人我看还是做过落地的啊。听过老板说要用,最后没人会用过,但是不理解,你这个也很也很也很奇怪啊。老师声音大点,老师声音不可以吗?好,由于咱们讲的是公开课,我在这呢,我们节奏稍微放慢一点,照顾一点基础稍差的同学。大家听我说。老师,你的这个文档编辑器叫什么?枫叶云笔记。为it人士打造的专业学习笔记,呃,我他的他的好处就在于我他有一客户端,我一键分享大家伙给他给大伙链接就能看到老师的给的就能看到老老师的笔记了啊。嗯。声音没有吗?不能够啊。用在哪,你先别问那么多。
04:02
嗯。好呃,我那个在讲这个滴滴之前呢,我稍微的。讲一点小小的题外话,公开课吗?我讲一点点题外话,嗯,我不知道在座的小伙伴们听过多少,说我们的课程是为P8准备的,是讲给P8听的,其实我跟你说,呃,很多人呢,可能不太了解所谓的P5 P6 P7 P8 P9p10都是都是什么意思。呃,为了市场的这种。为了市场的这种这种这种。这种叫做叫做这种听上去特别震耳欲聋的这种感受啊,所以呢,把很多课呢都叫成叫P8,呃,但是我告诉你啊,我在这儿呢,想为P8的课程做一个证明,我们要开始我们的真P8计划。呃,首先呢,你首先要了解透彻,了解一点,听我说,呃,如果按照阿里的体系来讲呢,P7对于普通的工程技术你就已经到头了,听懂了吗?我再说一遍,如果是在业务层面上啊,去做相关的工程技术,呃,P7你就已经到头了,呃,P8呢,实际上和P7要求的技术没有区别。
05:19
我再说一遍,P8和P7要求的技术没有区别,而所以P8和P7的主要的区别在哪里呢?在于它的方法论,在于它的设计上,在于它的管理上,呃,所以呢,我们在嗯。九暂正式开始我们的真P8计划,真真正正的带大家进入P8的世界,当然P8的世界不太好进,原因是什么呢?他必须你得有一定的经验的积累,我讲课你才能听得懂,跟得上,理解得了,不然的话呢,我就相当于大学,大学教授讲给小学生听啊,你听着也听不懂,也感受不到,也没意思,所以呢,如果说在还没有技术水平一到的情况下呢,你听个听个故事,听个笑话就行了,别太较真。呃,那么作为匹八来讲呢,他的年薪,正常的年薪水平呢,是120万到200万。
06:16
呃,这是他的一个正常的水平,好吧,嗯,当然有部分的我了解到的琵琶的话呢,实际上是能到400万的。嗯,比如嗯啊啊,这个高德曾经去从去去去京东挖了一个架构师过去,呃,大概是给到了400万的薪资。所以你要好好考虑一件事情啊,就是说呃,如果说你就会一些工程上的技术,你比如说你不管你是什么高并发的架构啊,不管你是高可用啊,不管你是嗯大的数据量啊,不管你是其他的方方面面的底层啊源码,呃靠这个东西能给到400万的可能性相当的小。那么这里面就会牵扯到一个东西啊,这里呢,我我在我们的琵琶课程ddd里面呢,呃,也给大家强调过,这里面有很重要的事儿事情呢,呃,请你记住的,记住记住就行了,就是你要从技术架构师。
07:14
然后去拥抱业务架构师,就是你两方面可能哪个都不能差,呃,你到这个时候才是技业务架构师,技术架构师,所以这时候才是八,那么到P9P10水平呢。那么关于业务的这块的重要性就增加的更多了,另外呢,还需要呃设计管理啊,那我就在这呢,就不不在这展开了。那么关于P8呢,我们到目前为止呢,准准备了两门课了,已经。呃,这两门课呢,稍微的给他过一下。嗯。枫叶云,这个排序不太好排啊,呃,这是呃相关的管理上的111门课,这个呢,主要是从认知到落地,到难题到工具啊,到呃交流,做好管理上的认知,那么还有一个呢,就是ddd的这门课,那么这门课呢,我主要是从呃入门开始,然后到战术层面,到战略层面。
08:19
到嗯,站在ddd角度呢,我们来区分一下单体和微服务它的编证统一,那么到呃,落地ddd,那么到ddd呢,怎么改造老系统啊到我们对第一呢进行一些深深度的思考,呃,这个呢是目前已经确定为P8准备的两门课。好,嗯,哦,刚才那小姐姐通知了我一下,说咱们昨天是有一个七夕的活动,今天晚上结束,OK,我知道了,呃,对于课程有需求的你啥都。别犹豫啊,去找一下小姐姐。今晚正式结束七夕的活动。呃,这个事儿你去找小姐姐聊好吧。嗯。
09:02
我讲今天的课呢,我希望大家伙有一定的前置知识,呃,在座的诸位,如果说你没有这个前置知识了。我建议你就。要么你补亲。要么你撤。第一个呢,叫做没有一定的开发经验是无法理解架构的重要性的,没有一定的人生阅历无法学习的重要啊。我建议的是至少三到五年以上的开发经验,至少三年,最好五年。呃,你说你刚刚入行就写一个CD的小程序,你今天这课听着会相当的费劲啊,那么第二一个呢,我希望你了解设计模式。在设计模式基础之上,你了解通用性的设计原则。高内距调和。呃,这种单一职责啊等等,就是这方面的一些设计原则,我在设计模式这门课里头讲过。那么你需要理解分层架构,理解常见的m Mac Mac呢?大伙用的是最多的啊,这个先让你写个小程序上来,二话不说弄1CONTROLLER。
10:06
啊,弄一弄1DAO就开始玩,那好。呃,我这些个这几项,今天晚上听课的小伙伴,我希望你们具备。如果你不具备。那你就听当笑话听就行了。那么设计方面的,我是建议你要学习我讲的坦克的内容,学习我讲的抽丝剥茧的设计模式,呃,这两个东西之后呢,那么ddd的最基本的入门的基础你就掌握了啊。嗯。我跟大家伙也简单交代一下,我们将来的课程大概会怎么做交付,呃,像原来的话呢,我们讲课的话呢,多数是基于视频,那么后面的话呢,我们是。呃,大多数的课程啊,我们的交付将会基于文字加视频,文字加视频,并且呢,优先是使用文字先交付。
11:01
然后呢,再用直播和大家互动。也就是说,在后面学习课程的时候,你首先会阅读到我们的文字,在我们自己的APP上,好吧。然后我们会安排在这个文字基础之上的,你阅读的基础之上的,跟大家伙的互动,好吧。呃呃,不知道我大概说清楚没有,这个呢,也是我们试过好多次啊,这个应该是效果非常非常好的啊。好了。呃,我估计有好多同学对于滴滴滴一点入门都没有的,我想做一个给大家做一个简要的入门,关于ddd呢,如果你以前接触过,你可能会接触到一大堆的概念啊,什么叫领域,什么叫子域,什么叫核心域,什么叫通用域,什么叫支撑域?啊,像这些个呢,基本上都是基于战略层面的,那么什么叫实体,什么叫聚合,什么叫值对象啊,什么叫聚合根,什么叫工厂,什么叫仓库啊呃什么叫这种,呃实体服这个这个领域服务。
12:01
呃,像这些个的话呢,呃,基本上都是基于呃战术层面的,但是我上来跟你讲这些东西,我告诉你,你永远听不懂。所以呢,我建议你,我讲东西也不会先讲零件,我要给你讲辆车,我不会先给你讲,说这个螺丝是是是个什么东西啊,这个螺母是个什么东西,不会给你这么讲,我希望你学习的时候也不要先学零件。嗯。广告太多了,嗯。好。那么希望你学习的时候应该是先学脉络,后学细节。啊,这个东西永远比你学点小知识要重要的多,先学脉络,后学细节啊。OK,直奔主题。嗯。老师,老师的这个节奏还可以吗?听不太惯的可以撤啊,出门右转。
13:00
加油。首先说,听我说。嗯。广告时间太长了,好,我先帮你禁言,然后我再继续讲课。不开心,我看着你啊。好,为什么是右转公开课啊,那个大家伙,放轻松点,你也不要指望一堂公开课你能够学到什么深度。但是呢,我也向你保证,你这堂公开课一定不会白来。听我说滴滴到底是什么,我如果用枯燥的定义化的东西啊,给你讲的话,你是听不懂的,还有一个。呃,就这玩意儿啊,我毫不客气的讲,我十年前就讲过这玩意儿。嗯,因为它这个东西呢,BD这个概念的提出呢,是2003年啊,如果没记错的话,那么这个东西呢,呃,当时提出的时候微服务时间还没有流行,滴滴最近开始流行,它主要是。
14:01
借着微服务的东风,那么微服务出现了,为什么滴滴又会流行起来?原因是什么?这里面呢牵扯到一系列的整个软件工程的发展过程,这里面最核心的东西叫做业务快速的变化。驱动着你的软件系统越变越复杂,我再重复一遍。业务的快速变化,驱动着你的软件系统越变越复杂。为了应付这些越变越复杂的软件系统。软件工程也在跟随着整个复杂度不断的发展,那么到目前为止呢?Ddd。它的出现正是为了解决特别复杂而且快速变化的业务系统,这是它的设计目标。再重复一遍。Ddd就是为了解决。第一个叫快速变化。快速演进,第二个叫复杂系统,也就是意这个这个为什么要强调复杂系统,我跟你说简单系统,你用ddd反而用复杂了啊,它就好比是一套特别复杂的工具啊,你要说简单的事儿,切根黄瓜拿一小刀就可以了,你非得拿一一系列的鸡床过来,把这黄瓜给切好了,没有这个必要。
15:20
所以D呢,是为了解决快速变化复杂系统而设计的啊,这种设计问题的。呃,当然我讲到这儿你还是听不懂,我从最简单最简单的一个小案例给你讲,我讲完这个案例,你一定能理解ddd大概是什么,而且你会直呼说,我靠,原来就这么简单,一层窗户纸一捅就破。首先我们说。大家准备好了。给老师扣个一。嗯。刚刚被打断了一下啊,Sorry,嗯。想要为什么不用五笔输入法?别这样啊,你是,你是猴子派来搞笑的吗?
16:06
呃,另外呢,呃,关于设计课呢,大家一定脑子里有有个思想啊,我相信大家伙说,呃,灌输一点思想,就是关于设计课这件事,大家脑子里一定要有一个最基本的思想。呃,有很多人会把设计课学成死的,往死里学啊,学到死为止,你千万不要这样,听我说那个技术课,你说我们这个程序输出个A,输出个A,它肯定输出个B,但是设计课叫仁者见仁,智者见智,有各种各样的同样的问题,有各种各样的设计方案。你看着你的顺眼,我看着我的顺眼,互相之间还会都说服不了谁,大家来听我说,你们学习的时候一定不能把这东西当死东西来学,这就设计课难讲的地方,所以设计课很多很多时候我们是需要呃互动,需要探讨,这是这也是为什么,呃,我们在讲这个P8的课程的时候呢,首先为大家准备文字,大家伙最好在阅读完文字的基础之上,我们的直播课程在干嘛?
17:03
再互相探讨,互相讨论好吧。哦,Sorry,这个ddd是哪几个单词的缩写,都没跟大家说,这个叫知识的诅咒,我认为大家伙应该都知道才对啊,叫。Drive in。没没没敲错吧,Main drive design,呃,叫领域驱动设计,领域驱动设计,其实我告诉你,领域驱动设计才是真真正正的那种。最自然的设计,好吧?呃,听我说,我们先从一个最简单的选课系统开始讲,我再说一遍,第1D是为了解决复杂系统的,选课系统这种小玩意呢,除非你的业务超级复杂,而且不断变化,否则的话是用不着滴滴滴的,听懂了吧,但是没有关系啊,它不耽误我我拿它来,由于它业业务简单,我我不用跟你解释太多业务问题,所以呢,它不耽误我拿它来呢,用来给大家解释基滴滴的基本概念。
18:00
好听我说我们说一个选课系统,就是一个学生,然后呃,选了这门课,然后提交给后台,后台OK,把这个信息给大家存下来,就这么一简单的东西。然后这个业务。大家听懂了没问题吧,没问题给老师扣一啊。领域模型整洁架构,对整洁架构在落地的过程之中,多数都失败了啊。嗯,因为整洁架构,它因为它原来这个架构呢,呃,最早开始叫做叫做埃文斯架构啊,叫艾瑞克艾文斯。它的架构,呃,但是实践过程之中呢,嗯,有各种各样的问题,后来呢,就诞生了这个整洁架构,整洁架构在实间实践过程中也有一大堆的问题,后来才诞生了六边形架构啊,这个后这个我们后面再说啊,后面这个课课课课课程里都有,呃今天我们主要先讲D滴这个最基本的概念,滴滴最基本的概念呢,一个选课的系统,我如果我们用MVC的设计,用MVC的实现。呃,这个很简单,就是我们呃提供一个选课的controller,选课controller里面我们注入一个选课的service是吧,然后呢,调用它的。
19:09
选课方法在我们选课呃,这种service里面啊,就是因为我我今天备课的时候就快速的给大家写了一些伪码,伪伪代码。呃,选科的service呢,有一个具体的实现叫选service implementation,那么这里面呢?呃,我们可能需要这个student的DAO,然后course DAO就敲错了,Sorry。Course的D。嗯。然后呢,呃,我们在这个业务逻辑上呢,首先呢,我们是从数据库里面把student course这些信息啊读出来,这里我就不写了。就是访问数据库MYSQ。把student和课程相关的信息读出来,读出来之后呢,我们校验一些业务参数啊,比如说有的课程它已经超员了,说这课呢,我们总数已经到了多少了,已经到了30个人了,你不能再选了。
20:03
好判断一下,那么如果超员了,抛出我们的业务上的exception,呃,如果说我们检查通过,那么这时候我们更新数据库信息表示啊,这个小伙已经选了这门课了,最后呢,呃,我们通过邮件或者通过什么要通知这个学生,所以呢,我们生成一个。Message生成一个消息,然后呢,我们把它扔到MQ里面,至于说他将来有什么通知的话,由其他由由由这个消费者去决定就可以了,这是一个大体的简单的流程啊,嗯,当然这个时候我们一般来讲呢,会涉及到一个。贫血模型。就是我们实现这种。一个业务领域里面的一些实体的东西的时候啊,就是实体学生课程啊,这些都是实体,那这些实体的里面呢,我们一般使用贫血模型。评选模型呢,它就不涉及到任何的业务逻辑,所以我们对数据库的访问,对数据的访问要重要的多得多啊。
21:02
嗯。好。嗯,这呢是关于一个student的MVC模式的一个简单的实现。呃,我不知道我大概说清楚没有,其实还是那句话啊,如果你没有做过,我刚才这段怎么讲你都听不懂。如果你做过。一眼就清楚了。好,写过设计,写过MVC模式的,应该大多数人都在都在这么用,写过controller service DAO这种分层模式的,来给老师扣个一。对,贫血模型就是GA set嘛,嗯呃,严格来讲,我跟你说这种设计方式呢,我们把它称之为叫做面向数据的设计,面向数据的设计。因为我不知道你发现没有,呃,我们拿这个拿这个model来举例子啊,就是模型嘛,Model。
22:01
在这呢里面,因为一个一个知识的展开,会有很多很多的知识,我在这儿不展不展开说你怎么找到这个model这件事,这个我们放在VIP课里面慢慢说,大家听我说关于这个model这件事,一个model用贫血模型,这个呢是MVC模式诞生之后才开始的一种使用方式。呃,我个人在第一次接触贫血模型,但是这个好几十年以前了啊,十几十几年以前及20多年以前,第一次接触贫血模型的时候,我会觉得非常非常的别扭,我不知道大家伙有没有这种感觉,就是贫血模型是一个什么东西呢?贫血模型是拿斯六顿来说。它里面只有。成员变量。ID啦age啦,这个呃,年级名字地址。然后简单的get set方法。或者只读或者可写,对这个对它的属性进行一些简单修改,这个东西看上去就像一个结构体。
23:06
他根本就不是一个说包含任何业务的这样的一个对象,但是我们想一下,如果我们想这个学生选课,我们往往还需要提供一个student service。让这个学生啊,在里面方法有一个方法让他选课,但是。或者大家感觉到没有。作为我们一个学生来说。Student。一个学生按照面向对象的思维,他应该有一些业务方法,封装在这里会更爽。什么叫更爽呢?比如说study。我们说student s等于new student张三张三点study,你说他爽不爽?用起来会很爽。而不是说student service study把张三传进去,这个事其实是有有点别扭的。如果我们按照自然的设计。好了,这是。
24:00
M,但是m Mac为什么这么玩呢?是因为这个东西呢,和数据库打交道,那打交道打起来是最方便的。它往往。对应的数据库的一张表,或者几张表,再通过一个GPA啊,或者是这个MYMY啊,就相关的一个映射映射过来啊,把呃,数据的记录映射成我们实际当中的对象。好了,它就叫做OM嘛。呃,但是除了这种这种写法之外,你就记住啊,除了你们喜闻乐见的经常使用的这种写法之外啊,一般的来讲,这时候呢,我们会把包的组织包装包装成这样的方式啊,科目点码视频CONTROLLER1大堆controller科目点码视频SERVICE1大堆service科目点频DO1大堆do。好,除了这种方式之外,其实还有另外一种写法。呃,我呢,先把另外一种写法给大家讲出来,然后呢,我们再做一个对比,你就理解什么是ddd了,好吧。
25:01
我看有同学还跟那聊,有了蓝好一点点。嗯,各位大哥。今天咱们讲的设计课,你要是把你的脑筋还停留在这么细致的地方,我觉得你这个设计课是没法听的。呃,听我说,我再强调一遍,设计这东西,我希望你能有三到五年左右的工作经验,这是最好的。呃,优秀的三年左右够了,你平时要对你的设计进行思考。不优秀的,你没个五年经验,你想去在战略层面上理解设计,我觉得这个够呛,不太可行。嗯,关于DD来说呢,它实际上可以横跨P5到P10。同学说老师又跟我这吹牛逼,不跟你这吹牛逼啊,关于DB来说,他其实可以横跨P5到P10,呃呃,其实呢,你站在屁股角度呢,也能理解一部分。但是呢,关于地利这个东西呢,它是对于高层的影响会远远大于对于低层的影响,地利的推进往往需要高层的首肯和决心,如果你高层不能够首和决心,这件事我告诉你,第一你在你的实际当中很难落地的。
26:12
呃,原因是什么呢?后面我慢慢跟大家说啊,但我我现在继续呢,跟大家聊一聊这种。另外的一种写法啊,在你了解了MVC的这种写法之后呢,我们换另外一种写法。好,这种写法什么样呢?这种写法呢,OK,我们也有一个,嗯。选课的controller,但是啊,你注意看,在这个选课的这个流程里面。我呢,首先是怎么做呢,我第一步呢,做这个数据校验啊,做参数校验,这个每每每每一个前前面的,呃,UI过来的参数呢,它必须得做校验的,这个就不说了,第二一步呢,我做加载数据。加载数据,我把一个student从数据库里面加载出来啊repository,然后呢,我去进行业务检查,注意这个业务检查呢,你会发现我把它传递给了另外一个service。
27:03
在这呢,我并没有说,呃,我直接就写,我说判断啊,如果30已经到了人数已经,呃,大于这个总总人数了,怎么怎么样,没没这么写。接下来呢,我调用了选课这个service,然后调用选课把student的ID,把course ID传进去。然后我发送消息,发送消息的时候我并没有像上次似的这么写,我说message等于形成自己的一个message,而是我我定义了一个新的message。接下来呢,我就要用message把它send过去,有同学说了,老师这玩意儿和刚才那个有什么太大的区别吗?我在这一点一点一点讲给你听。听我说。这里面的首先第一点呢,在呃,另外的一种写法里面,我们往往使用充血模型。充血模型就是。刚才我讲的student,我们说贫血模型里边只有成员变量,充血模型里边是可以带业务逻辑的,比如说它可以有study方法。
28:10
他如果牵扯到体育课的话,还可以有run方法。它可以,呃,可以有什么upgrade升级,也可以说qui退学等等,只要是跟业务逻辑和student业务逻辑相关的,你完全可以完全封装在这个实体里面,这个edit里面,这个student。一般会使用充血模型。那么我一会儿跟你探讨充血模型和。贫血模型它的区别,我们现在主要探讨什么呢?主要探讨这种写法和刚才那种写法的一个区别到底在哪里?呃,像其实你学过设计模式,我都不用跟你讲,你一眼就能看出区别到底在哪里,那么像刚才MVC这种啊,比如说我说一个最简单的,我们现在的MQ是卡不卡。那么你在这里呢?应该是卡夫卡template send过去,那好,如果我的MQ不用卡夫卡了,那么我的message的标准格式是不是也得跟着变?
29:07
所以我用下面的写法,我完全可以做一个。标准的选课的message的一个类,你完全可以自己去构造这个类的具体的实现。甚至你可以定义一个父类,完全做他的子类的事情都可以。另外呢,我不会在我的。整个的。呃,我们的,呃,这个这个这个这个基基础的这种。基础的支撑层里面啊,我们不会说确定到底就是具体的哪种MQ。我在MQ的整个的上面,我还会封装一层,这层叫什么呢?这层呢叫做呃。他叫message sender。啊,Message的发送者,那message发送者呢,在具体实现的时候,完全可以用卡夫卡来实现,也可以用rocket MQ来实现,也可以用rabbit啊,也可以用你自己写的,也可以用service bus。
30:03
就是这个这个这个啊,也可以用这个这个message啊。我们可以用这个消息,呃,消息的这个这个面向消息的服务,消息队列来实现,各种各样的消息队列来实现等等都可以随便你。那么也就是说,假如我要换一种具体实现的话,我只需要实现另外一种message center就可以了。好,我这里的代码是不用变的。嗯,我想。这块大家是不是能听得懂,这块有没有问题。嗯,对,我看有同学开始开始聊设计模式了,没错,呃,从现在这个小例子来看,他和他和设计模式非常非常的像,所以好多时候你其实理解了设计模式之后啊,你来理解下一步的其他的各方面的这种设计思想的时候,就方便得多,所以这是为什么我要求大家伙在听滴滴课的时候,你至少要把我讲的设计设计模式两门课你先听了,大家听我说,呃,我一讲你就理解了,很简单。
31:03
然后我们说选课这个service这个事儿呢,比较复杂,我一会儿专门跟你说。呃,那个刚才我我相信我讲充血模型的时候,一定有同学会说说老师你student里面有个方法叫选课,把它一个呃选选课的这个这个这个课课程课程对象传进去不挺好吗?可以吗?可以的,完全没问题,这种呢也是带业务逻辑的。但是这个里面呢,就会涉及到领域的概念,我一会儿专门跟你说再说啊。好,我们先把这个放过,我们再回回回过头来再来看这个业务检查这块业务检查呢,我也是抽象了一层,注意,我把业务检查呢,抽象成了专门的check service。它可以是一个微服务,也可以是一个模块,就是你的业务检查,很可能随着你业务的变化,你检查的东西是不一样的,我们说二年级的不能选三年级课,这可能是你今年的策略,明年策略可能变成二年级可以选三年级课。
32:00
我们说今年我们选了音乐课,不能选体育课,这是我们今年策略,也许明年策略,我们选了游泳课就可以选音乐课等等,所以他的这个具体的业务逻辑的,业务上的。啊,这种业务的检查,它有可能会产生变化,那么这时候怎么办呢?我把它封装到一个专门的service里面,今年的你可以是做一个今年的实现,明年可以做一个明年的实现。这样的话,我这段代码又不用变了,这块来能get到的给老师扣个一。有没有问题,嗯。这个没问题啊,很简单。好,嗯,其他的呢,有两个概念,因为这里面会牵扯到滴滴的概念,叫仓库repository,那么还有一个概念呢,实际上叫做领域服务啊,叫选service,选service我在这先不展开。我给你讲完,讲完这两个方面之后呢,你会发现下面的代码比上面代码好在哪。同学们思考一下,所以像上面代码是MVC的模式啊。
33:04
说我要挑时间的时候,我这段代码是不是得改啊,就是我这段业务代码是不是得改。这是这是他的就是MVC来说啊,那么而下面的代码呢,是我的业务发生变化的时候,注意我这段代码不用改,我再说一遍,我这段代码不用改,我只要换具体实现就可以了,这是他们两个非常重大的一个区别。有同学说,老师你讲来讲去和设计模式没啥太大区别呀,其实没错。我们说D是一种放大了的设计模式。当然我说的是在战术层面,是在落地层面,但是对战略层面其实是有很大的区别,好,大家听我讲。一般来讲呢,我们如果使用了第二种写法,我们的包的组织就不像原来那种那么组织了,那么新的这种包的组织一般来说会是什么样子的呢?包的组织?
34:08
空点买视频点儿的啊。有一个预模型是吧,然后com点。啊,是0.service,当然还有什么posy一些个,呃,系统的支撑服务,我在这先不说,我们说。这种这种方式和这种方式和上面这种包的组织方式有什么区别呢?同学们,你们好好思考一下,仔细思考。好,你好好听。呃。我想问你啊,在第二种这种写法里面。所有的业务逻辑是不是我全扔到这个service里面,是不是就可以了,业务就全集中到一起了。然后呢?
35:01
嗯。是不是流程编排,是的那个,呃,作为我的主要的我们的业务的实体来说,我只要扔到里面啊,你一下就能全读到了。呃,可能有同学会说,那和上面也差不多呀,呃,我这我我这这样来给你解释啊,嗯,听我说。我们拿这个实体来举例子。嗯,你比如说。比如说呃,比如说呢,我有一个student service student service,那么我的选课系统可能会用到这个service。我的。选课系统啊,我的,呃,这种请假系统。啊,我的图书馆的借书系统。都有可能用到,不知道我说清楚没有。
36:01
那也就是说,当你的随着你的业务逻辑不断的扩展,随着用到这个service不断的增多,我想问你的是,假如。有一天。你需要重构你这个student service这个代码,你好好想想,你敢动他吗?你敢不敢动它?一大堆的其他的service全部都绑到了它上面,甚至这个人啊,要改个代码的时候。你要想完善的改怎么办?把用把它把用到它的地方全部读一遍,你再如果说再把这个东西想成微服务。说这个微服务被其他服务用到了太多太多次了。同学们,你们好好想一下,你动这个微服务,你敢随便动吗?是吧?嗯。听我说啊,我讲课呢,我还是习惯先从最基本的概念讲给大家听,我看我同学说感觉这些还是偏战术的,再给你说一遍,我先是讲战术层面,再来讲战略层面。
37:10
好吧。所以大多数人啊,实际上是动完跑路,对,说的没错,很多人真的是这样,他动完跑路。呃,我先凑合给他吧,功能完成了。然后呢,嗯。我先凑合把功能完成对吧。完成之后,哎,下一步就这个后人该怎么处理呢?再说吧,啊跟我没关系了,嗯,他基本上是这样啊,嗯,所以他一般会面临什么呢?就是这个系统呢,就是越来越腐化,我们把它叫腐化,叫膨胀啊,叫崩溃啊,叫一大堆屎尿混合在一起一大坨。嗯,对,还还有就是写新的service没错啊,重写service旧的不动说的很对,但是你这个新的service也会慢慢变旧。他一定是这样的。嗯,那么如果说我们把这些你的所有的service都写成这个样子。
38:04
喜欢这个样子有什么好处啊?同学们,你们好好想想。就是你的业务不动,这段代码是不用动的。想过没有,就是你的业务代码,你的业务不动,这个代码不用动,你说我东西换了。我的具体的时限换了没有关系,不影响你的业务代码。只要你的业务不动,这段都不动。这个呢,其实是一个简简单单的。怎么说呢,就是呃,简简单单的这种这种设计思想,我告诉你啊,从。软件开发诞生到现在。有有有,有一个词叫做永远不变,这个词叫。复用。我告诉你很多很多的设计思想都在完成这个词啊,为了落地,这个词叫复用,从最开始的封装成方法。
39:06
然后附中复用代码到面向对象,方程类和对象到复用什么呢?现在人们想复用的是什么?复用的是业务上的很多已经实现了的东西。如果你是在阿里,在京东,那么这个时候你会发现很多重复的业务代码。他为什么要做中台?原因就是能不能把这些重复性的东西统一在一起,我们想调用的时候随时调用,当然任重而道远,目前还远远没有实现。呃,我们一般把这个称之为第二次软件危机,呃,DD呢,是为了解决这个危机来使用的。呃,复用这个词请大家记在脑子里,就是为了围绕复用的落地,各种各样的软件工程才可以诞生。在这个里面呢,有一个著名的设计方案,或者叫著名的设计思想,叫做封装变化。
40:02
同学们,你们仔细想我刚才讲的这一小段的代码的实现。我每一个对于可以预计到的业务变化部分,注意我说的是业务。如果你是设计设计设计模式上的一些变化,那个是更低层面的一个变化嘛,这里指的是业务变化,是更高级层面的。一个看法。站在。市场的角度的,站在公司管理层的角度的。说我们的客户发生了变化了,我们的形式发生变化,我们的业务要赶快的跟着变,所以在这里呢,就是我们要怎么样封装出来这个业务的变化。封装变化,你会发现刚才那个代码。业务发生了变化。它是部分是不变的,除非你业务流程都变了。所以封装变化往往使用的,呃,我们抽象出一个接口来,或者抽象出一个API来啊,按照贝索斯的说法就是六边形,只要是他能怼得上就可以,至于你内部怎么实现的关系不大,这叫做。
41:05
Domain之间的API的稳定性,这个我们后面再探讨。好风装变化。往往。是我们采用的一个对于复用的一个落地方案。只要你封装了变化,我们能复用的是什么东西呢?就是我们刚才这段的业务流程。流程不变。其他的中间的各种实现随你便。还有一个。李丽不是说四层吗?对呀,是的,好听我说还有一个,还有一个是什么呢?如果站在站在一个。更高的这种。呃,我们说和业务层面来对齐的角度啊,当然这个这个呢,你就需要理解,呃,软件开发之中特别恶心的一个问题,就是往往技术人员说的话和业务人员说的话。它不是一回事儿啊,就是这个,这俩哥们呢,往往是鸡通鸭脚。
42:01
说我说这个东西你没理解,你说的东西我也理解不了。呃,凡是做过项目的应该都能理解这句话。那么。DD呢?想解决的还是这种问题。这种问题在滴滴这里是能是能是能得到解决,有答案的同学们,你们想一下啊,我我作为一个业务人员,我不懂技术,如果我想了解我整个系统的业务,假如在Mac这种情况下。你想象一下好吧。我再说一遍。如果说在MVC这种设计的情况下,我是一个业务人员,我不懂技术。我要想通过,我要想了解这个这个。我们整个的业务的已经完成这个业务的发展,我读代码我是读不通的,你想过没有,我根本就没办法读通它。因为我要想了解整个业务,我得把所有的service全得读一遍。然后我还得顺着各种各样的那个业务的流程捋一遍,我才能知道我整个系统大概的发展。
43:08
但是呢,同学们,你们想一下啊,如果我们采用这样的写法。呃,这里面呢,实际上叫做没有任何的。没有任何的具体的技术实现,你不信你仔细看这段代码。我们整个全是对于接口的调用。如果你一个业务人员。稍微理解一点技术名词,其实这段代码你是能读懂的。能不能理解?也就是说,它在某种程度上。
我来说两句