00:00
那么接下来呢,我们来看看多肽的一个,呃,一个在实际开发中的一个作用。啊,在这个位置上,我点右键啊,新建一个什么呀文件,这个文件呢,我们叫D1088的课堂笔记啊来我们写上第18课堂笔记。嗯。好了,那么接下来呢,咱们来。看一下啊,叫做多肽啊,在在开发中有什么作用。这个非常重要啊,五颗星,各位啊,五颗星。来,那么这边呢,咱们看一下啊,在这个地方,我们把这个。我们先把这个文件打开吧,啊,这个PDF文件啊,早晚我们可能用得上。现在是在这个位置上啊,在这儿多肽这块啊,一个多肽在开发中的一个作用啊,这块的内容。
01:08
然后呢,我们把这个。打开把这个打开啊,还是第13章没问题啊,多肽在开发中的作用。那么这个呢,我们再把谁打开呢?我们把昨天的那个作业打开,我们来分析一下那个作业应该怎么做,然后基于这个作业呢,我给大家讲一讲多肽在开发中的一个作用啊,这个时期的一个作业,这个作业有一个叫什么多肽的练习题,说编写程序,模拟主人去喂养宠物的场景。那以面向对象的一个思想去看的话,大家想主人它应该是一个对象对不对,然后宠物呢,它应该是一个对象吧,是不是,哎,主人是一个对象,宠物呢是一个对象,那要是对象的话,我们这边是不是得先先有类呀,所以得有个主人类是不是,哎,应该还有一个什么呀,叫做宠物类是不是,哎,宠物类。
02:03
那在这里呢,我还提醒了大家,要给宠物的一个此类,什么dog呀,什么cat呀,什么鹦鹉啊,是不是,哎,那么这是提示一提示二呢,主人你想一想,它应该有个什么动作,它喂养宠物,主人是不是应该有个喂养的动作呀,那主人喂养宠物的话,宠物是不是就是吃啊,这个说的没毛病啊,是不是只要主人喂宠物,宠物就吃,所以主人有一个feed的方法,宠物呢,应该有一个什么呀,叫做哎,Eat方法。E的方法啊。那行,那这样的程序我们就可以写一写,各位啊,我们可以写一下,首先呢,我们把这个位置啊,先给一个宠物。宠物啊,比如pet啊宠物。那假如说这样吧,同学们,咱们这样啊,假如没有宠物没有pet。没有这个宠物类,我们直接把这个副类给它删掉,直接给一些dog呀,Cat呀,鹦鹉啊,我们创建几个这样的类型不行。
03:05
来我们看一下啊,比如说我们先写个dog,我把那个副类删掉了啊。同学们,知道我现在在讲什么吧?我在讲一件什么事啊?多肽在开发中有什么用,对不对?我们昨天学了多肽的基础语法,今天我们好好认识一下多肽在开发中有什么用,好吧。仔细听,注意听,我说这个是五颗星啊,非常之重要,那现在我做的这个作业题,就是咱们这个昨天的这个作业题。这个啊,然后呢,接下来呢。接下来呢,我在这里呢,给大家通过这个案例啊,干什么呢啊,我就给大家讲解一下,多在在开发中有什么用,现在呢,我不按照我的提示去做啊,我的提示这边提示的很明显,其实基本上已经把程序提示出来了。然后呢,我这里呢,我先不给宠物pet这个类,我先直接给上dog public class dog,那么这个dog呢,这块啊,咱们提供一个方法是吧,叫做吃的方法对吧,然后public avoid eat,那么这个时候呢,我们。
04:15
打印输出,我们叫做狗狗,狗狗。喜欢喜欢。啃骨头。啃骨头。行吧,哎,狗狗喜欢啃骨头,吃的很香对吧,吃的很香。好,那这样的话,我呢,就把这个dog呢,这是一个宠物狗啊,叫做宠物狗狗。那么接下来我的这个宠物狗狗呢,写完之后啊,我在这里啊,我给一个什么呀。哎,叫做。Master人个打这样的一个类啊,Public class我们叫master是不是,那主人呢,它可以怎么着啊,哎,可以喂养宠物。
05:14
啊,狗狗,那这个主人起初的时候可能只喜欢养狗,明白吧,哎,主人假设啊,假设主人起初的时候。只是喜欢,喜欢养什么呀?哎,叫做宠物狗狗啊,不喜欢别的宠物,那么它应该有个方法对不对,哎,这个方法呢,叫做喂养feed。那你喂养狗狗的话,这个参数就应该是个狗对吧,那只要喂狗的话,狗是不是就吃啊。对吧,哎,这不。Dog是吧?然后dog d.eat啊d.eat d是什么?是dog吗?Dog它能不能。
06:02
Eat呀。可以吧,哎,干啥呀,这是。狗狗喜欢吃便便是吧?那么这个do呢,它有个it方法啊,然后呢,接下来我们来再来看啊,这个程序现在就是这样一个结构啊,这样一个结构,那么接下来我们做一个测试,我们写个测试程序,我们在这块呢,我们点右键,我们新建一个test。来。大家注意听啊,测试程序啊,测试多肽在开发中的作用,Public class现在有个test程序public staticman。好,那么接下来呢,我们在这里啊,这样做大家看好了啊,首先第一步我们要创建什么呀,主人对象出来,是不是我们在创建什么呀,宠物对象出来,然后呢,哎,主人什么呀喂。
07:08
就行了,对吧,主任对象master呗,张三。行吧,New一个什么master这个对象就有了,那么接下来通过张通过这个呃dog呢,哎,我们就叫做嗯dog啊new一个什么呀,哎,Dog。假如说我们叫黑贝吧,黑贝啊黑贝。德国黑贝张三啊,然后呢,黑贝接下来。张三或者藏獒对吧?喜欢问藏獒藏獒藏獒是这样写吧,藏獒,来张三点,诶,张三他是个master啊。Master呢,它是一个类嘛,是不是这是一个主人类,它有个成员方法,大家看,或者叫实例方法,这叫实例方法啊,哎,实例方法需要先把对象拗出来,再去调这个方法对不对?那行,那我们调这个方法,你有对象去调这个方法,怎么调feed的嘛,喂养为谁啊,为藏獒嘛,好,大家看这个程序呢,哎,也很经典啊,俩对象喂养哎谁呀,为藏獒,把藏獒传进去啊,为藏獒,那么藏獒这块怎么着啊,哎就在这吧拉吧拉吧拉吧拉吃是不是?哎,Eat,哎,Eat好了,那么接下来我们把这个程序呢,我们去编译一下啊。
08:31
编译下我们的所有的程序,Java去运行test。那对吧,狗狗呢,喜欢啃骨头,吃的很香啊,吃的很香行,那么这个程序就执行了,那过了一段时间啊,大家注意听我怎么说,各位啊,过了一段时间。这个主人啊,他不喜欢养狗了,或者说他不是不喜欢养狗了啊,它除了狗狗之外,他又又想又想干什么养别的宠物了。听我分析各位啊。
09:03
注意这里的分析,就主人啊,起初的时候。啊啊,只喜欢什么呢?只喜欢养宠物狗狗。对吧?哎,随着时间的推移,这个主人呢?哎,又喜欢什么呢?哎,又喜欢上养什么呢?养这个猫。啊,养猫咪。啊。这就表示什么呢?客户有了新的需求对吧?这就表示在实际的开发中。在实际的开发中,这就表示客户产生了吧新的什么需求?
10:00
作为什么呀,软件的开发人员来说。必须满足客户的需求。因为客户要给钱啊,对吧?哎,客户要给钱,作为软件的开发人员就必须得满足客户的需求啊,你你这边你比如说你这个项目是银行项目开发开发什么的,20002010年开发,现在都2020年了,对不对,那你想一想,我们这十年过去了,银行这块有没有业务进行升级啊。对吧,那业务进行升级,你这个软件就得改呀。对吧,软件面临着一个修改。啊,修改。你想一想,是不是这样的?起初的时候只喜欢养宠物狗,随着时间推移,主人又喜欢上养猫咪了。在实际开发中,这就表示客户产生新的需求,作为软件的开发人员来说,必须满足客户的需求。那么我们怎么去满足客户的需求呢?
11:00
在不使用什么呀,多肽机制的前提下。啊,目前我们只能在什么呀,Master类中添加一个新的方法。你想是不是这样?当然这个宠物的猫咪肯定怎么着啊,我们得给一个,因为他要养这个猫咪了,所以这个猫咪肯定得给一个呀。这个是在所难免的。对不对,哎,这是新加的一个类,无所谓了,Cat是不是,哎也有一个方法叫什么呀,叫eat啊,来system.out打印输出,猫咪喜欢吃。嗯。嗯。吃的很香。啊,吃的很香,那这个是也是一个吃的行为,吃的方法,那么这个时候呢,加上这个类之后。
12:01
我们在我们的程序当中。是不是需要再去修改我们的master这个类?对吧,所以由于什么呀,由于新的需求产生,导致我们不得不,你看用这个字啊,叫不得不去修改,谁去修改master这个类的代码,只能在这里再加一个方法参数的类型,我们叫什么呀?叫做cat。啊,你喜欢喂养猫嘛,所以呢,喂猫猫就吃嘛,是不是,哎,喂猫猫就吃stay eat对不对,那么这个时候呢,这个时候我们再去编写我们的测试程序,测试程序这块应该怎么写呀,那无非就是说我们创建宠物对象,我们可以再创建一个什么呀,创建宠物对象,然后紧接着怎么着啊,就是主人喂就行了,那这个宠物对象是cat c对吧?或者叫小花。
13:03
是不是,哎小花new一个什么呀?Cat,那么接下来我们张三怎么着呢?哎,点feed为谁呀,为小花就行了,你看那么这个程序我们再去编译,我们再去执行,大家看是不是就是哎,我们猫咪喜欢吃鱼,吃的很香是不是?对吧。哎,这是我们的需求进行了一个什么呀,扩展啊,需求进行了扩展,就客户提出的新的需求,那么这个时候就面临着我们程序的一个什么呀,叫修改啊各位面临我们程序修改。我改了一下master人类。啊,那么现在大家思考一个问题,思考一个问题啊,修改这个类有什么问题。就软件在扩展过程当中,软件在扩展新需求过程当中,修改master这个类有什么问题?
14:05
不小心断网了啊。每次都要调试修改后的代码是这样的啊,在我们这个软件的扩展过程当中啊。你修改的代码越少越好。明白吧,大家一定要记住啊,一定要记住,就是软件在扩展过程当中修改的越少越好。啊,修改的越多,你的系统的稳定性啊,就会难以难以保证啊,修改的越多,你的系统当前的稳定性。就越差。啊,未知的风险就越多,我不知道这个大家理解不理,假如说你2010年的时候,你开发了农行的。
15:03
农行的内部系统是吧,那么紧接着2020年的时候。对吧,十年过去了,农行的系统需要升级,对吧,农行内部系统需要什么呀升级。那你是不是应该在2010年基础之上进行修改,对吧?那你修改的地方是不是越少就越好。你如果动的越多,因为它跑了十年了,它很稳定啊,这个系统跑了十年很稳定,对吧,因为你的系统的这个这个升级,导致你2010年这个代码啊,哎,你改了,说白了改了很多很多地方,那么这个时候呢,就相当于你这个系统啊,嗯,未知的风险就会特别的多。对吧,你所有的系统都需要重新在干什么呀,进行测试。所有的东西都需要重新测试。明白吗?主人类里边每次修改都要增加方法,对,彪说的对啊。你看一定要记住啊,软件在扩展过程当中,修改的越少越好,修改的越多,你的系统当前的稳定性就越差,位置的风险就越多。
16:04
对吧,其实啊,其实这里涉及到一个软件的开发原则。啊,软件开发原则有七大原则。各位啊和Java就不属于Java,各位啊,属于Java。这个原则呀,这个开发原则啊,属于整个。软件业。明白吧,软件开发有七大原则,其中有一条最基本的原则。就是OCP。我们叫做开be open close open close啊开B,开B原则。什么是开闭原则?我简单在这聊一聊啊,什么是开闭原则呢?
17:01
就是对什么呀,对扩展。开放。对修改干什么呀,关闭。他的意思就是说在软件的什么呀,扩展过程当中修改的越少。好啊,你可以添加对吧,比如说大家看我们在这里是不是额外又加了一个cat类。这个无所谓,没有问题,没有问题,你加东西我我我没有意见,但是如果说由于你后期扩展,把我原先运行的非常非常之稳定的这个程序,你进行了修改,我觉得这个我是不同意的啊,我是不同的各位啊,这就是开闭原则。啊,这是开辟原则,它为什么有这么一个原则,各位大家思考一下。就现在我们这个符合符合不符合OCP啊。我们现在这个程序是不符合OCP对不对,因为我们这个软件扩展的话,我们是不是需要在master这个主人类当中加一个方法呀。
18:04
每加一个宠物,我们是不是得加一个方法,每加一个宠物,我们是不是得修改一下主人这个类啊。每一次都去修改,去修改,去修改,去修改,那我说了,我们在软件扩展过程当中是不是。是不是修改的地方越少越好?你修的地方越多,你软件的稳定性就越差。对吧,你存在的未知的风险就会越多。而我这里呢,哎,又给大家说了软件啊,其实开发有七大原则,这七大原则呢,其实我在这重要提了提了一下啊,不属于Java这个开发原则,属于整个软件页的,比如C语言C加加呀,C加加这块也也也适合的,也适合的啊,就是软件的设计啊,你都要考虑一个什么问题呢?就是说后期的扩展性。啊,后期的扩展性啊,那么其中一套规则叫OCP开原则,对什么开呢?对扩展是开放什么意思,就是说你可以额外干什么呀。添加。没问题,最好很少的什么呀,修改最好很少的修改现有程序,因为你修改现有程序,它存在很多未知的风险,我说了这个代码运行十年了,可能很正常,没有任何风险,也许你改了之后,你这块啊就会产生很大的风险。
19:19
啊,你需要全方位的进行重新测试,在软件的扩展过程当中,修改的越少就越好啊。高手啊,开发项目。不是仅仅为了什么呀,实现客户的需求还需要干什么呀,考虑软件的什么扩展性啊,这才是高手,这才是高手啊,你比如说我们这个打麻将各位。打麻将呢,这个对于小白初学者来说,只是想着,诶,这个拿到什么招自己就打什么招,是不是?哎,凑合着打下去就行,你像高手的话,他会猜猜你的手里的牌呀,你出了多少对不对,就像还有斗地主。
20:01
是不是,哎,你出了多少,嗯,咱们这个这个这个这个这个每个人手里还剩什么,基本上心里很清楚,这就是高手玩法都是软件开发也是一样的,你们现在可能只是一味想着一件事,就是哦,我把这功能实现就行,我把功能实现就行,就任何扩展性你不考虑。那这个呢,其实就是比较比较什么呢?比较小白的一种方式啊,就慢慢的大家以后经历的东西越来越多,实现的功能越来越多,那么这个时候你就会思考一个问题,就是诶,我今天写这个程序,我是可以把功能实现,我怎么考虑我软件的扩展性。我软件将来五年六年十年之后,我在扩展的时候,我这个软件的扩展性非常的强,比如说好比说吧各位。我问大家问题,我们买了一个笔记本电脑,笔记本电脑里面内存条坏了,对吧?我们可以很轻松的把内存条拔下来,从京东上买一个插上去,我们的电脑仍然可以用,这就叫非常好的扩展性,对吧?是不是很好的扩展性啊。你想想什么叫什么是软件扩展,什么是软件扩展性。
21:03
就是说哎,假设电脑中的什么呀,内存条部件坏了。对吧,哎,坏了,我们可以买一个新的插上,对吧,直接使用啊直接使用。这个电脑的设计啊,就是非常就是嗯,电脑的设计就考虑什,考虑了这个扩展啊,考虑扩展。对吧,内存条的扩展性很好,就是内存条的扩展性很好,就这意思。啊,你别的地方都不用动,只要把内存条拔下来,换个内存条就行了。这叫扩展性。啊,那你现在这个程序你就不行。对吧,你这个程序的扩展力就很差,为什么呀,因为你将来在这儿啊,你有有新的需求是吧,新的需求来了之后呢,你还得在这再加个方法,你比如说你喜欢。
22:00
养什么呀,宠物了,宠物叫什么呀?叫做鹦鹉是不是?哎,叫做鹦鹉,那你是不是应该在这儿再写一个新的类型叫鹦鹉啊是不是,哎,鹦鹉,那鹦鹉吃呗,是不是,那这个的话你还得再改,就是我们能不能让我们的master这个类当中的程序以后不改了呢?就是能不能让怎么样让master主人这个类以后不再修改了,即使即使主人啊,又喜欢什么,又喜欢养其他宠物了。啊,Master也不改,也不需要什么呀。修改,那么这个时候就需要使用什么呀?哎,多肽机制。那么也就是说,实际上你这个主人类啊,你应该这样去做。
23:04
怎么做呢?你不应该写上你具体的宠物,你应该在这里写上一个副类型。你不要写K,也不要写dog,你写成cat和dog就写死了。写死了之后,就就相当于内存条跟主板焊接在一块儿了,你将来扩展就不好扩展了,你现在啊在这块啊,你要你要写一个什么呀,诶写一个这个这个dog和cat的上层抽象类型。就最好在这个地方写个抽象,更加抽象的类型。啊,这个最最好啊,最好不要不要写具体的宠物类型。对吧,你看我写到这儿吧,我写到上边吧,啊最好不要写具体的宠物类型,这样会影响什么呀,会影响程序的扩展性啊,会影响程序的扩展性,明白吗?啊扩展性在这块。
24:01
那这块写谁呢?哎,此时此刻你就应该能够想到,你需要写一个负类,叫pet。对吧,那你派这块你就可以写啊,Public class pet对吧,然后呢,我们写一个方法,这个方法你可以不给任何实现,你只给一个只给一个空的空的大括号行不行啊,没问题吧,是不是,哎,空大框对吧?那这个其实你就可以认为它是一个,哎,所有宠物的什么哎,负类是不是,那这样的话,这个就是一个吃呗。吃的行为是不是行为,那这样的话,我们这个方法可以不给具体的实现啊,这个方法可以不给什么呀,哎,这个具体的实现来具体的实现,只给一个大括号就完事了,对不对?哎,那我们接下来呢,我们在我们的程序当中,你想一想,是不是你不能写K,你也不能写dog对吧,你应该让你的K去继承K。
25:01
让你的。让你的这个叫做dog也去继承谁,也就是说重写了吗?是不是重写类方法?对不对,都是重写eat,呃,Eat方法,然后呢,Dog它是一个啊,宠物猫呢,它也是一个什么呀,宠物,那么既然都是宠物,我们在这个feed的方法当中,是不是就不需要传这个pet,也不需要传dog,我们只需要传一个pet,对对吧,是不是就可以了,那我们喂养宠物的话,我问大家宠物这个类里面有没有方法叫eat呀?有没有的方法,有吧,好,大家想,这里是不是就是多肽?有同学老师,我怎么没看见多肽呢?我怎么没见多肽呢?大家看这个肺的方法啊,你在这个位置上是不是会调用我们的这个先关掉啊。来找一找这个刺儿程序。
26:01
就先关了。这个测试程序啊,你是不是在这里拗了一个宠物啊。那么你把这个dog。藏獒是不是就传给了肺的方法?是不是把藏獒传过去了,就等于new了一个dog,是不是直接就传到这个肺的方法上了?对吧,这个new,这个dog。他给了谁呢?他给了他呀。肺的方法的参数是不是这样一个参数啊。大家好好看看,这是不是负类型的引用指向子类型对象。这是不是负类型的引用指向了一个子类型对象?这是不是多肽?对吧,编译的时候,编译的时候。器哪?发现什么?发现这个pet是哪个类啊?Pet类会去什么pet类中找什么方法?结果找到了,编译通过。
27:17
对不对,那么运行的时候呢。运行的时候,这个地方的对象也许是new了一个dog,也也也许是new了个cat。对吧,哎,这块传过来那个东西,他不知道是什么,但是我肯定知道你是一传过来是个宠物。那运行的时候怎么着呢?哎,底层实际的对象是什么,就自动调用到该际对象对应的什么方法上。这就是。多肽的使用,你好好想想,你将来往这儿调这个肺的方法,你有可能给我传过来是一个dog对不对,哎,你也有可能你给我传过来的是一个什么呀,诶猫。
28:09
总之呢,我不管你是dog还是猫,总之你都是宠物。对吧,都是宠物,宠物都有吃的行为。那么这个it方法它就涉及到多态,编译的时候,这个it跟运行的it不一样,你编译的时候这个it方法是谁的it方法呀,是派这个类当中的it方法,如果运行的时候,那底层你这个对象是什么对象呢?哎,你如果是个dog对象。Dog对吧,哎,那么我们这块自然会调到dog的意方法,因为你dog已经怎么着啊,哎在这里怎么着啊,哎已经重写了吧,是不是已经重写了。对吧,Dog已经重写it了呀。那个cat猫是不是也重写了E的方法,是不是将来会调用到子类重写之后的方法上啊?是不是好,那么现在我们再去编译,我们再去运行,大家看跟刚才的程序一模一样。
29:05
对不对,哎,这个有同学说了,老师我怎么还是没发现他有什么好处,各位我问大家,将来假如说客户又有新的需求,又有新的需求,他要养鹦鹉,我问大家,我们的主人类还需要修改吗?不需要改了,对吧,你只要在这个地方,你写一个什么呀,叫做public class,叫做鹦鹉,然后去继承派,你应一定让他,让他是一个宠物,明白吧,那么接下来你也在这里一定要到干什么呀?哎,重写什么呀,E的方法就重写E方法,那么public void it对吧?那这个it方法在重启的时候,哎,那比如system.out system.out.printline打印输出,比如说比如说鹦鹉喜欢吃小虫子。对吧,哎,吃的很香。
30:02
行了,那这块的话,我们呢,就把这个呢重写吧,哎,OCP还记得吧OCP。对扩展是开放的,对扩展开放,也就是你额外加这么一个鹦鹉类有没有问题,没问题啊,对修改关闭啊,对扩展开放,对修改。那么这一块呢,对修改是关闭的,大家看我其实并没有去修改任何程序,对吧。我没有修改任何程序,现在这个鹦鹉只是一个宠物,宠物呢,接下来这个主人这个类需不需要改动?Master,主人类不要不需要改动,还是只有这一个feed的方法,但是你的测试程序肯定得改啊,你的测试程序不改那肯定不行啊,你在这里还需要再去创建宠物对象是不是,怎么创建呀,就是鹦鹉呗,鹦鹉是不是,哎,鹦鹉鹦鹉,你一个鹦鹉对象,然后接下来主人。
31:02
喂,主人喂就行了,张三呢,这一下又为谁了呢?哎,又为这个鹦鹉了,明白吧,那么这个时候你再去编译这个程序,你再去运行这个程序,大家看。是不是就是鹦鹉喜欢吃小虫子,吃的很香啊,那这个软件就很好的扩展了啊,很好的扩展。这就是多肽在开发中的作用,各位,我不知道大家有没有理解啊,有没有理解,其实软件开发它是有有一个所谓的一个原则啊,原则叫OCP,对扩展式开放,对修改是关闭的,就是你以后软件开发最好不要给他写死,你写死就意味着你这个软件将来扩展力很差,如果你想让扩展力很强,你就写一个高层抽象的东西。啊,高层称象的东西,你比如pet对吧,你写个pet,那这样的一个pet好处是啥呢?就是这个pet既可以往这传一个,狗也可以往这传一个,什么呢?猫也可以往这传一个,诶别的东西都可以,我这个master这个类根本就不用动,我这个master类只有一个方法就行了。
32:04
只有一个方法就行了。啊,只有这一个方法,不用写这么多,写这么多,写这么你写这么多干啥呀,你写这么多以后要有新的需求,你这个方法还得再加一个,你再加一个方法,那扩展力就很差呀,为了增强扩展力,所以我们在这里要面向抽象编程。明白吧,M抽象编程啊。其实面向负类型编程,面向抽象编程,不要面向具体啊,就是面向什么呀,负类型编程啊,面向更加抽象,更加抽象进行编程啊,不建议面向什么呀,来具体编程。啊,因为什么呢?面向具体编程会让软件的扩展力很差。啊,软件的扩展力很差,行了,那今天大家之所以能听懂我这个程序,那是因为什么呢?昨天你们做作业了,就算你没有做出来,哎,你有疑问,那么今天我把这个题目啊,哎,给它列出来之后呢,你就知道哦,是这样的,其实这就是一种提升,我布置那个作业题,我没指望你能做出来啊,你不要以为说我布置的作业题你就能做出来啊,这个不一定能做出来。
33:14
昨天我看了一下啊,有的做的还可以,有的做的就是这个逻辑很乱啊,逻辑很乱,那么这块呢,我们就说到这儿啊,这个其实就是多肽在开发中的一个具体应用啊,具体应用。
我来说两句