00:00
OK,我们来看一个关于单一职责原则的应用实例,我们以什么为例呢?我们以交通工具案例来进行讲解,那么我现在直接先写代码,大家看我的代码有什么问题没有,好不好?来打开我们这个eclipse,我们新建。一个Java项目,取个名字叫design。Sig design pattern。什么呢?设计模式往下走。Finish,然后呢,我们在这里建包。对吧,我们建包来走一个com.at硅谷点。Principle。什么这个就叫原则这个单词我们先讲哪一个原则呢?先讲单一职责原则,叫single responsibility啊,就这么写啊,叫单一职责写到这里来,那现在呢,我们先写一个类来测一下,我们先写第一。
01:01
第一个案例叫single。POSSIBILITY1,这是我们第一个小案例,我们来看看这里有什么问题没有。好,现在呢,我先写一个工具,呃,叫做交通工具,交通。对,交通工具类。那么V。靠。贝壳,那这里面呢,我们先写这么一个方法啊,叫public。方法,这些代码都很简单,并不难VO,我写个run,然后呢使俊。这有一个工具,交通工具,我们收到vehicle。那在这里面我说出一句话,说出一句怎样的话呢?你看我这样写。我说有一个交通工具,把这个名字打出来干什么呢?在公路上跑,在。公路,比如说写个叫公路,公路上跑。
02:00
啊,公路上运行吧,公路上运行,OK,这就写完了,那现在呢,我们来测试一下,我六一个口。对吧,我另一个交通工具的对象实例。又一个交通工具的对象实例。好,然后这边呢,我们等于V格。好,拿到一个对象实例,我们格式化一下。诶,这个格式化。我们格式化,在这个地方来隔一下。格式化在这有个快捷键,我们把它配一下哈,我们需要配一下,把这个配的更好看一点。S。啊格式化,那我我我把这个快捷键也配一配。我把这个快捷键配一下。在哪里呢,我。对吧。好,这边有个format这个快捷键是这个我把它。
03:01
改一改啊,把它改一改。我们改成LF这个,我这个键能有问题。好改好了,改好我们再试一下这个好不好用。诶,这个地方好像没有改成功是吧。看一下。来,我再重新改一下form mind对吧?Form在哪里呢?这边edit,诶,哦,Java哦,刚才我记改错了,改这应该是Java的。源码在这儿,这改。If。我改的原因是因为我那个键呢有问题。好,再来试一下,好,这个就好使了,那现在呢,我们来用一用呗。这个交通工具类。这个交通工具类点。我写一个名字,这叫什么呢,摩托。摩托车。摩托车,我们再写一个汽车。汽车。小汽车对不对?我们再写一个工具类,这个工具工具类呢,我这样写的,飞机好,同学们我运行值当我运行过后,你会发现这个有小问题,看他说摩托车在公路上跑,汽车也在公路上跑,没问题,但是他这写了飞机也在公路上跑,这是不对的。
04:18
显然这就违反了一个什么呢?单一职责原则,你现在把这个交通工具干什么呀,你这个run。他既管公路上跑的交通工具,他又管水里面的,还有天上的,那这个就不合理了。因此在这里我们就分析它的方式一的问题。对我们对方式一呢进行一个分析,方式一。OK,我们方式一这个run方法,在方式一的这个方法中run。对run方法中违反。违反了单一单一职责。
05:02
职责原则。那怎么办呢?哎,那怎么办呢?解决的方案很简单,我们可以把它分成多个类,对吧?解决的方案非常的简单,干什么呢?根据根据交通工具运行的方式不同。啊干什么呢?分解成分解成不同的类即可,是不是这个就叫单一职责原则,那我第二个方案我就来开始写了,那我们来看第二个方案,第二个方案呢,我怎么改呢。大家可以看到我在这个基础上我做一个调整就可以了,来我新建第二个文件。跟上我的思路啊,代码都不难,SINGLEB2。二。
06:01
我把它写到一来。那这个时候呢,我要这样去写了,来,Class,我说路上跑的。对吧,路上跑的这个交通工具。这个CVCL,对,好,这是一个路上跑的交通工具。那路上跑的交通工具呢?我们写个run方法。Run。好让方法呢,我们写上这个交通工具的。的一个对象,接收他的一个对象,我们这用一下。好,跑起来,我这样写干什么呢?我们说谁谁谁在公路上运行。对不对,加上这句话在公路公路运行。公路。公路运行对吧,那其他的我想同学们也知道我要怎么去写了,下一个改这个改成什么呢?L。这个呢,我们叫做在天空运行,对不对,在天空。
07:03
天空运行,还有一个呢,在水里面跑的一种交通工具。我们叫water吧,简单这样写哈,Water要在哪里运行呢?在水中。对吧,在水中运行。水中运行。好这就写完,那这个时候我们还把刚才这个拿过来用,你会发现呢。他这一个跑起来就有区别了,你比方说。我这儿先建一个road。Road。我写个road的交通工具。那这边呢,我们把它改一下。取个名字对吧?R如果是路上跑的,那么我们就用这个方法来调用,比如说我们知道汽车和摩托车它是在路上跑的,我就这样写,把它分开,再比如说现在有个天上,这个飞机在天上跑,那我怎么办呢?OK,我你有一个这样的交通工具对象实力。
08:06
对不对,这样的交通工具,那写到这来。等于什么呢?二。这时我调用的是它来跑来我们运行一把。这是我们运行。这时我们允许,我们发现呢,他就分开了说。摩托车在公路上跑,汽车在公路上运行,飞机在天空运行,这样子我们就把它分开了。那现在呢,这个方案二他就遵守了单一职责原则,那有没有什么其他问题呢?我们再来看对方案二的方案。对方案二的一个分析,注意听。那我的分析是这样子的,他首先第一个遵守了,遵守了单一职责原则,这是肯定的。第二点呢,我们来看有没有这个必要,但是朱婷但是这样做,这样做他的花销很大。
09:06
他的花销或者说改动很大。改动很大。对不对,改动很大,即干什么呢,要将这个类分解,同时同时要修改我们客户端,就这边呢,我们也要修改,是这样子的吧,所以说我们来看第三点,第三点改进,我们还可以在这个基础上再改进一下。怎么改进呢?大家看我的改进方案是这样子的,直接修改我们原先的这个类VI。这个累。会干什么呢?改动的代码,改动的代码。哎,代码会比较少。比较少,那这样就提出我们的方案三。就是方案三就来了,那同学们再来看我第三种写法,来,我们第三种写法来写个class。
10:05
Single。POSSIBILITY3。哦。RESPONSIBILITY3。好,把它写到这里来。那第三种写法我就要这样去改了,大家看。我第三种写法呢,我是直接在这边修改。你看我怎么改方法拿过来。把这个类拿过来。OK,这没有粘好哈,把这个类vehicle交通工具类我拿过来把这地方改成二。改成二,因为它是同一个包,下面不能有同名的,那我这怎么跑呢,我这样写啊。嗯,你这个run方法我要分开了,第一个是run就在工商跑,我不动。但是我知道还有一种工具呢,它不是在这个公路上跑的,于是我写个run。
11:04
这个地方我就改成在。天空运行。能理解,然后呢,我再写一个方法叫run water。对吧,Water我简写的啊,同学们在哪里呢?在水中。在水中。水中运行。这时我再来写一下这个类,就改成这个了,六那二。对,然后呢,我创建一个这样的对象实例。创建V2这样对应实例,那我写的时候就用这样写了。vehicle2.run。如果是在地上跑的,比如说汽车,我们调用的就是run方法。对,如果你是在水里面跑的,大家看run water,我这里就写上水里跑的。
12:03
比如说轮船。对不对,轮船。那我调用的是run water,这个方法分开了吗?如果你这个交通工具它是在天上飞的,那我就写run air飞机。飞机。诶,飞机。可以了,那同学们我们来运行一下,大家看到它有没有分开,那么看这里。汽车在公路上,轮载在水中,飞机在天空。诶,你们有没有发现这里?虽然我没有用泪的分解,我仍然把它分开了。那么我们对方式三做一个分析。方式三的分析。OK。我们来看看方式三它是怎么一个理解啊,第一点,第一点就说这种修饰,这种修改方法,修方法没有对,没有对原来的类做大的修改做。
13:07
哎,做大大的修改,只是只是在什么呢,只是。增加了,增加了方法,这是它的优越之处,第二点我们再来看,那么你方式三有没有违反单一原则呢?它在一定程度上确实他没他在一定程度上呢,没有完全的遵守单一职责原则,但是他这方法级别上仍然是符合单一职责的,也就是说这里虽然。对,虽然没有在内。这个级别上遵守遵守单一职责原则。但是在哪里呢?在方法这个级别上,级别上仍然。啊,仍然是遵守了,遵守单一职责。
14:01
单一职责原则,好,这个就是我们这三种方式的写法。所以你得出一个结论,你会发现呢,我们单一职责其实主要体现的是什么一个特点呢?就是各行其职。你干你的,我干我的,只是我们第二种这个方法呢,它的这种分解成本比较高。对,我把它分成三种工具。路上跑的交通工具,水里啊,在天空中飞行的交通工具,还有水里面。运行的这种交通工具这种呢,改动它是比较大。而我们改中三种呢,他虽然没有在类这个级别上遵守单一,但是他在方法这个级别仍然是遵守单一值原则,好,这就是我们对这个单一职责原则的一个应用实例的讲解。应用实例的讲解。好,那关于单一职子的应用实例,一个说法我们就说到这里,最后我们做一个小结。
15:04
那么这个单一职责原则,呃,我们做一个小结,来说明一下单一职责原则的注意事项和细节。第一个单一职责原则主要是降低类的复杂度,大家看见没有?说老师你这个类本身也不复杂呀,我讲了我们讲的是原则,所以说我举的例子比较简单。如果你将来这个vehicle就是这个交通工具,这个类很很复杂,你就要分解。明白。所以说单一职责原则,它的核心思想就是要降低类的复杂度。达到一个类只负责一项职责。OK,那么这个单一职责原则呢?它还可以提高我们可读性,因为你一个类只负责一件事情了吗?那当然可读性就会很高,而且可维护性也变得比较强了,那一个类就管就管一类事情。
16:01
OK,那么降低变更带来的风险。你比如说我打个比方,假如我们用的是方式二这种方,这种单一职责的分解,那你想如果你将来要改。陆地上跑的交通工具,你只会在这儿改,绝对不会影响到这个类,是不是这个道理啊,诶这个我们就说降低变更带来的风险。同样的道理,我们刚才方式三虽然没有在类这个级别上遵守单一,但是我在方法这个级别遵守了。那如果说我们将来在这个陆地上跑的时候,我们还有一些其他的代码要处理。这是有可能的,对不对,你可能前面输出一句话说,诶,呃,现在这个路,比如说在什么什么情况下,三点到五点可以在陆地上跑,否则就不能通行,你是不是就在这儿写代码,不要在上面去写了。打个比方,你这写的这样子,如果对吧,太猛大于。
17:00
十点。并且太猛。小于12点,在这个情况下可以在公路上跑,否则S就不能,是不是我们就我们就可以在这这个方法里面改,而你这边的改动就不会影响到这个方法。那如果按照以前我们方式一的这种改动,那都在这里面一写,我在陆地上,在公上跑的时候,我会有条件在水里面跑的,有条件,那你都在这一个方法里面改,是不是很容易出现一个什么呢。就是交叉。对不对,代码就会变得比较臃肿,而且呢。可维护,可维护性也会降低,好吧,所以说我在这呢,举举了一个小例子说明这个事情,好,我先把它删掉。删掉,OK,这是我们所说的第三点,第四一点,通常情况下注意听这句话,通常情况下我们应该遵守单一职责,严格的遵守,只有在逻辑足够简单。
18:01
才可以在代码级别上违反单一职责。说老师你这什么叫违反单一职责呢,你比如说。你比如说刚才同学们看到我的第三个写法,其实第三个写法呢,没有完全的遵守单一职责,因为单一职责它的核心思想就是要把一个类,比如你这有一个类,他负责了多件事情,就把它分成A1。和A2。是这样子的吧,这个才是标准的单一职责原则,但是我刚才也讲了呀。只有那种方法数量足够少,就是我这个这里面虽然它。怎么样呢,他这个负责的事情有两件,但是呢,方法并不多。那这个时候我们就会以在方法级别上保持单一职责原则也是可以的。明白这意思吧,就好像。刚才老师写的这个三个方法run分开,但是有一个问题,假如听我说啊,听我说,假如我们这个微二里面不但有跑运行,还有很多其他的方法很多,而且每一种方法呢。
19:10
跟这个交通工具的运行方式也有关系,那还得把它分开。知道我在说什么,比如说你这个方法,我这儿还有方法。还有很多方法啊,方法这个删一系列的方法。一系列的很多很多方法。很多。很多很多方法,而且这个方法呢,又跟它的运行方式有关,那你还得把它拆拆拆分成。这个多个类来进行这个处理,这才是标准的单一职责,我这样做是有一个前提的。什么前提呢?就是目前我这个类的方法其实是比较少的,所以说我用在方法级别上,方法这个级别保持单一原则也是过得去的,但方法如果变得很多很臃肿了,你还得把它分解成多类。
20:03
好的,同学们,那关于单一职责原则呢,我们就先给同学们介绍到这里。介绍到这里。
我来说两句