写点什么

架构师训练营作业:第二周

用户头像
m
关注
发布于: 2020 年 09 月 27 日

作业任务

作业一:

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


学习总结

面向对象的本质

  1. 面向对象的编程范式是在历史中不断总结出来的,符合绝大多数软件开发的方法。

  2. 面向对象的三大特性是:继承、封装、多态;但这些特性并不是面向对象语言的独有特点,在非面向对象语言中,也能实现,但更为复杂和不安全。

  3. 三大特性中中,多态又是面向对象设计但最重要的特点,也是许多设计原则和设计模式的实现方式。


面向对象设计的原则

接下来对,介绍了面向对象设计对 5 个原则:

  1. 开闭原则(OCP)

  2. 依赖倒置原则(DIP)

  3. 里氏替换原则(LSP)

  4. 单一职责原则(SRP)

  5. 接口隔离原则(ISP)


这些原则,也简称为 OOP 的 SOLID 原则。



有些地方,也补充了迪米特法则(即最小只是原则)。


开闭原则

定义:件设计实现模块对扩展开闭,对修改封闭的,

开闭原则,可以说既是设计原则,也是软件设计对目标。某种角度看,我们通过其他原则,最终也是为了软从而实现软件对高内聚、低耦合。

所谓修改关闭,并不是软件不能应对需求变化。而是通过设计,使得软件模块相对稳定,在需求变更时,几乎不需要修改模块模块,而是扩展已有对接口。

实现开闭原则对重要手段就是多态。


依赖倒置原则

定义:

  • 高层模块不依赖于低层模块,而是都依赖于抽象。

  • 抽象不依赖于实现,而是实现依赖于抽象。


依赖倒置原则,并不是说形式上的依赖某个接口,就是依赖倒置。比如 Business 依赖于某个 Dao 的接口并不符合依赖倒置原则,因为 dao 的接口是属于低层模块的。

相反的,高层模块应该依赖于高层模块定义的接口;低层模块的接口实现高层模块定义的接口。


依赖倒置原则,可以说是框架开发的基本原则和实现原理,它是的高层模块必要等待低层模块完成才能开发,高层模块只需要定义接口(即高层模块给出的规范),低层模块实现该接口,就能被高层模块调用,从而加入到高层模块提供的运行架构中。比如 tomcat 面向的 servlet 接口,spring 框架定义的 annotation,都是依赖倒置原则都体现。


从另一个角度看:高层面向接口/抽象进行设计,低层遵守接口/抽象进行编程。


里氏替换原则

需要注意的是,里氏替换原则并不是静态的看两个类是否有继承关系,而是放到场景中,看替换后程序能否合理的运行。反过来,里氏替换原则可以用来判断继承的设计是否合理


符合 is-a 的原则,不一定是符合 liskov 替换原则;但不符合 is-a 原则,肯定不符合 liskov 替换原则。


可能违反里氏替换原则的征兆

  • 退化函数

  • 子类抛出基类中不回抛出的异常

单一职责原则

定义:

单一职责原则,也称“内聚性原则”,指一个模块的组成元素之间的功能相关性。

从变化角度看,指一个类只能有一个引起其变化的原因。


思考:

单一职责原则和 Unix 哲学不谋而合(做一件事,做好它)。

符合原则的设计,通常更简洁和容易理解;相反的,难以理解的设计通常是糟糕的设计。


接口隔离原则

定义:

不应该强迫客户端程序依赖它们不需要的方法。


思考:

  • 接口隔离原则,也是符合迪米特法则的,即最小知识原则。

  • 接口隔离原则,从客户端代码的角度考虑,仅暴露需要关心的内容给客户端代码;既降低了客户端代码的认知复杂度;从服务端代码的角度看,也提高了模块的内聚性。


接口隔离,可以将一个紧密的类,实现不同的接口,使得不同的调用者只需要看到自己关心的视图


扩展阅读


《敏捷软件开发:原则/模式与实现》,敏捷软件开发不仅仅依赖于敏捷软件过程保证,更重要的是软件设计是敏捷的,可以支撑快速的变更的迭代。


反应式编程

反应式编程

异步 io,多路复用。

Flower 框架以及 Akka 的 actor

FLower 类似于 Spark 的 DAG


发布于: 2020 年 09 月 27 日阅读数: 51
用户头像

m

关注

还未添加个人签名 2018.06.06 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营作业:第二周