软件设计7大原则学习之——开闭原则,以及开闭原则coding

软件设计7大原则学习之——开闭原则,以及开闭原则coding_第1张图片生活中的例子:

很多互联网公司都是弹性质工作:每天工作8小时,对每天工作8小时这个制度修改是关闭的,但是对于什么时候来,什么时候走制度是开放的,早点来早点走,晚点来晚点走,前提是干嘛8小时工作。

软件开发最重要的原则:对修改关闭,对扩展开放,开闭原则是其他原则的基础

下面使用代码来讲解:

使用慕课网的例子来讲解

1、先定义一个课程的接口:
软件设计7大原则学习之——开闭原则,以及开闭原则coding_第2张图片2、再定义一个Java课程JavaCourse类,实现课程接口ICourse
软件设计7大原则学习之——开闭原则,以及开闭原则coding_第3张图片3、测试类:
软件设计7大原则学习之——开闭原则,以及开闭原则coding_第4张图片软件设计7大原则学习之——开闭原则,以及开闭原则coding_第5张图片下面是UML类图(IDEA真神器也):
软件设计7大原则学习之——开闭原则,以及开闭原则coding_第6张图片假设1024这一天,慕课网有活动了,需要给课程进行打折,怎么来开发这个需求呢?

我们是不是可以在ICouse这个接口中增加这样一个打折的方法呢?
软件设计7大原则学习之——开闭原则,以及开闭原则coding_第7张图片如果我们这样增加,那么JavaCouse这个类也要进行修改
软件设计7大原则学习之——开闭原则,以及开闭原则coding_第8张图片虽然可以修改,但是有没有想过一个,就是接口一改,那么实现这个接口的所有类都需要修改,我们知道有的课程是不需要打折的,而且修改接口一定要慎重又慎重的,因为它是稳定可靠的一个标准,一个协议。

所以我們換另外一種思路:
软件设计7大原则学习之——开闭原则,以及开闭原则coding_第9张图片我们不是1024要打折课程吗?那我们给打折的课程返回价格的方法这样修改就行了,但是这样确实可以获取打折的价格,但是原来的价格怎么办呢?如果课程多岂不是我们要修改很多的类。
解决:

我们可以这样:定义一个打折的类JavaDiscountCourse去继承我们要打折的那个类JavaCourse
软件设计7大原则学习之——开闭原则,以及开闭原则coding_第10张图片软件设计7大原则学习之——开闭原则,以及开闭原则coding_第11张图片我们来看现在UML的关系图:
软件设计7大原则学习之——开闭原则,以及开闭原则coding_第12张图片我们可以看到我们的接口ICourse没有改变,JavaCourse也没有改变,我们修改的是应用层的代码,底层的代码我们是并没有修改的,这样可以很好的防止风险的扩散,因为在开发中的接口是有很多的方法,类中也是有很多的方法,我们轻易修改可能会造成系统的混乱的,越底层的模块影响越大,越高层的变化影响越小。
使用一个类去继承原有的类,很好的满足了设计原则的开闭原则,对
修改的关闭,对扩展的开放。
这里让我联想到,使用MyBatis-逆向工程生成的pojo、mapper文件,因为只能对单表操作,当我们需要多表联查的时候,就需要自己写条件,特别是Pojo实体类中,还可能包含其他实体类,这时候我们不建议直接修改MyBatis-逆向工程直接生成的那个Pojo实体类,而是使用一个类去继承它,去扩展它就行了。

软件设计7大原则学习之——开闭原则,以及开闭原则coding_第13张图片当然了,可能有人会说,我们关联查询需要自己手写Mapper映射文件里面的查询操作,这也涉及到了接口绑定对应的接口,不是也涉及到修改接口了吗?
软件设计7大原则学习之——开闭原则,以及开闭原则coding_第14张图片软件设计7大原则学习之——开闭原则,以及开闭原则coding_第15张图片不是说开闭原则不能进行修改吗?
是的,没错,但是我们知道规则是人定的,我们一味的遵守规则那也是不好的,要得懂得灵活的变通,这里接口和映射文件是绑定在一起的,除了它俩就没有其他的关联,我们也是可以违反一下规则的嘛,就和现实生活中一样。

总结:关于开闭原则,我现在理解还是不够全灭,还是得多实践,多思考,以后有扩充内容再补充吧。
————小白成长之路

你可能感兴趣的:(软件设计7大原则学习之——开闭原则,以及开闭原则coding)