架构师训练营作业:第二周
作业任务
作业一:
1. 请描述什么是依赖倒置原则,为什么有时候依赖倒置原则又被称为好莱坞原则?
2. 请用接口隔离原则优化 Cache 类的设计,画出优化后的类图。
提示:cache 实现类中有四个方法,其中 put get delete 方法是需要暴露给应用程序的,rebuild 方法是需要暴露给系统进行远程调用的。如果将 rebuild 暴露给应用程序,应用程序可能会错误调用 rebuild 方法,导致 cache 服务失效。按照接口隔离原则:不应该强迫客户程序依赖它们不需要的方法。也就是说,应该使 cache 类实现两个接口,一个接口包含 get put delete 暴露给应用程序,一个接口包含 rebuild 暴露给系统远程调用。从而实现接口隔离,使应用程序看不到 rebuild 方法。
作业二:根据当周学习情况,完成一篇学习总结
作业提交:
作业提交地址: https://jinshuju.net/f/e4YFAo
作业 1
依赖倒置原则
高层模块不能依赖低层模块,而是共同依赖于抽象。
抽象不依赖于实现,而是实现依赖于抽象。
好莱坞原则,起源源于好莱坞,艺人将简历投递给演艺公司后,只能回家等待电话,如果有需要,演艺公司会打电话给演员,即 Don't call me, we'll call you.
对比软件设计,演艺公司就像上一个高层模块或框架,而艺人就像是低层模块,艺人具有某些特点(比如喜剧、动作、偶像)就类似实现了框架对抽象接口,而演艺公司在制作影视作品时就像是一个框架,决定了整个影视作品对整体架构,会根据需要调用实现。而艺人通过实现演艺公司的抽象接口,被演艺公司调用。
依赖倒置原则改变了开发的顺序,高层模块不需低层模块的首先开发,比如 tomcat 不需要具体的应用实现即可完成开发。相应的,影视公司不依赖于某个特定的演员就可以完成剧本的创作。
接口隔离原则优化 Cache
学习总结
面向对象的本质
面向对象的编程范式是在历史中不断总结出来的,符合绝大多数软件开发的方法。
面向对象的三大特性是:继承、封装、多态;但这些特性并不是面向对象语言的独有特点,在非面向对象语言中,也能实现,但更为复杂和不安全。
三大特性中中,多态又是面向对象设计但最重要的特点,也是许多设计原则和设计模式的实现方式。
面向对象设计的原则
接下来对,介绍了面向对象设计对 5 个原则:
开闭原则(OCP)
依赖倒置原则(DIP)
里氏替换原则(LSP)
单一职责原则(SRP)
接口隔离原则(ISP)
这些原则,也简称为 OOP 的 SOLID 原则。
有些地方,也补充了迪米特法则(即最小只是原则)。
开闭原则
定义:件设计实现模块对扩展开闭,对修改封闭的,
开闭原则,可以说既是设计原则,也是软件设计对目标。某种角度看,我们通过其他原则,最终也是为了软从而实现软件对高内聚、低耦合。
所谓修改关闭,并不是软件不能应对需求变化。而是通过设计,使得软件模块相对稳定,在需求变更时,几乎不需要修改模块模块,而是扩展已有对接口。
实现开闭原则对重要手段就是多态。
依赖倒置原则
定义:
高层模块不依赖于低层模块,而是都依赖于抽象。
抽象不依赖于实现,而是实现依赖于抽象。
依赖倒置原则,并不是说形式上的依赖某个接口,就是依赖倒置。比如 Business 依赖于某个 Dao 的接口并不符合依赖倒置原则,因为 dao 的接口是属于低层模块的。
相反的,高层模块应该依赖于高层模块定义的接口;低层模块的接口实现高层模块定义的接口。
依赖倒置原则,可以说是框架开发的基本原则和实现原理,它是的高层模块必要等待低层模块完成才能开发,高层模块只需要定义接口(即高层模块给出的规范),低层模块实现该接口,就能被高层模块调用,从而加入到高层模块提供的运行架构中。比如 tomcat 面向的 servlet 接口,spring 框架定义的 annotation,都是依赖倒置原则都体现。
从另一个角度看:高层面向接口/抽象进行设计,低层遵守接口/抽象进行编程。
里氏替换原则
需要注意的是,里氏替换原则并不是静态的看两个类是否有继承关系,而是放到场景中,看替换后程序能否合理的运行。反过来,里氏替换原则可以用来判断继承的设计是否合理。
符合 is-a 的原则,不一定是符合 liskov 替换原则;但不符合 is-a 原则,肯定不符合 liskov 替换原则。
可能违反里氏替换原则的征兆
退化函数
子类抛出基类中不回抛出的异常
单一职责原则
定义:
单一职责原则,也称“内聚性原则”,指一个模块的组成元素之间的功能相关性。
从变化角度看,指一个类只能有一个引起其变化的原因。
思考:
单一职责原则和 Unix 哲学不谋而合(做一件事,做好它)。
符合原则的设计,通常更简洁和容易理解;相反的,难以理解的设计通常是糟糕的设计。
接口隔离原则
定义:
不应该强迫客户端程序依赖它们不需要的方法。
思考:
接口隔离原则,也是符合迪米特法则的,即最小知识原则。
接口隔离原则,从客户端代码的角度考虑,仅暴露需要关心的内容给客户端代码;既降低了客户端代码的认知复杂度;从服务端代码的角度看,也提高了模块的内聚性。
接口隔离,可以将一个紧密的类,实现不同的接口,使得不同的调用者只需要看到自己关心的视图。
扩展阅读
《敏捷软件开发:原则/模式与实现》,敏捷软件开发不仅仅依赖于敏捷软件过程保证,更重要的是软件设计是敏捷的,可以支撑快速的变更的迭代。
反应式编程
反应式编程
异步 io,多路复用。
Flower 框架以及 Akka 的 actor
FLower 类似于 Spark 的 DAG
版权声明: 本文为 InfoQ 作者【m】的原创文章。
原文链接:【http://xie.infoq.cn/article/26cead203a42870dd24a126a9】。文章转载请联系作者。
评论