week2 框架设计 作业和学习总结
作业一:
1. 请描述什么是依赖倒置原则,为什么有时候依赖倒置原则又被称为好莱坞原则?
答:依赖倒置原则是指高层模块不要依赖低层模块。高层模块和低层模块应该通过抽象来互相依赖。除此之外,抽象不要依赖具体实现细节,具体实现细节依赖抽象。
总结起来主要有以下两点:
高层模块不应该依赖底层模块,二者都应该依赖抽象
抽象不应该依赖具体实现,具体实现应该依赖抽象。
"don‘t call us, we‘ll call you)”这就是著名的好莱坞原则。应用程序(底层)不需要调用Tomcat或者Spring(高层)这样的框架,而是框架调用应用程序。
2. 请用接口隔离原则优化 Cache 类的设计,画出优化后的类图。

提示:cache 实现类中有四个方法,其中 put get delete 方法是需要暴露给应用程序的,rebuild 方法是需要暴露给系统进行远程调用的。如果将 rebuild 暴露给应用程序,应用程序可能会错误调用 rebuild 方法,导致 cache 服务失效。按照接口隔离原则:不应该强迫客户程序依赖它们不需要的方法。也就是说,应该使 cache 类实现两个接口,一个接口包含 get put delete 暴露给应用程序,一个接口包含 rebuild 暴露给系统远程调用。从而实现接口隔离,使应用程序看不到 rebuild 方法。

作业二:
根据当周学习情况,完成一篇学习总结
2.1 从编程历史看面向对象编程的本质与未来
汇编语言
Baic语言
Perl语言:正则表达式
C++语言

领域驱动设计DDD,中台化
编程的核心要素

什么是面向对象编程
万物皆对象
面向对象三要素:封装性,继承性,多态
框架
框架 VS 工具
2.2 设计臭味:糟糕的代码有哪些特点?
设计一个控制电话拨号的软件

软件的上下文
需求变更
面向对象基本原则:
强内聚,松耦合
易扩展
更强壮
可移植
更简单
臭味的软件
僵化性
脆弱性
牢固性
粘滞性
不必要的复杂性
不必要的重复性
晦涩性
遵循OOD原则的设计
2.3 开闭原则介绍及代码分析
OOD原则一:
软件向扩展是开放的,向修改是关闭的
一个类、模块写完了,不应该再被修改
不修改类,不修改代码,就能实现扩展,就是用抽象
抽象类
接口类
改进button:方法一

改进button:方法二:策略模式

改进button:方法三:适配器模式

改进button:方法四:观察者模式

2.4 依赖倒置原则介绍及代码案例分析
OOD原则二:依赖倒置原则(DIP)
高层模块不能依赖低层模块,而是大家都依赖抽象
抽象不能依赖实现、而实现依赖抽象
DIP倒置了什么
模块或包的依赖关系
先开发抽象,接口。接口属于高层模块 ,低层模块实现接口
开发顺序和职责
软件的层次化:
高层决定低层
高层被复用



框架的核心
好莱坞规则:
don't call me,I'll call you.
倒转的层次依赖关系
反应式编程
2.5 里氏替换原则
OOD原则三:Liskov替换原则(LSP)
若对每个类型T1的对象o1,都存在一个类型T2的对象o2,使得所有针对T2编写的程序P中,用o1替换o2后,程序P的行为和功能不变,则T1使T2的子类型。
简言之:子类行(subtype)必须能够替换掉他们的基类型(base type)

好的工程师,用更少的代码实现相同的功能
不符合IS-A关系的继承,一定不符合LSP
LSP要求:凡事使用基类的地方,一定也适用其子类
从Java语言看:
子类一定拥有基类的整个接口
子类的访问控制不能比基类更严格
从更广泛的意义看,子类的契约不能比基类更严格
如何重构代码,以解决LSP问题?
最简单的方式:提供共性到基类
将继承改成组合


继承 vs 组合
继承和组合是OOP两种扩展手段
继承的优点
比较容易,因为基类的大部分功能可以通过继承直接进入子类
继承的确定
继承破坏了封装,因为继承将更多的细节报漏给子类
当基类发生改变时,可能会层层影响其下的子类
继承是静态的,无法在运行时候改变组合
类数量的爆炸
应优先适用组合
何时检测LSP?
2.6 单一职责接口隔离
OOD原则四:单一职责原则(SRP)
又称为“内聚性原则”
一个模块的组成元素之间的相关性
将它与引起一个模块改变的作用力相联,就形成了如下描述
一个类,只能有一个引起它变化的原因
什么是职责?
一个职责是一个变化的原因
违反SRP原则的后果:
脆弱性
不可移植
区分类的方法:分清职责
职责:变化的原因
OOD原则五:接口分离原则(ISP)
不应该强迫客户程序依赖他们的不需要的方法
ISP和SRP的关系
都和“内聚性”有关
SRP指出应该如何设计一个类——只能有一种原因才能促使类发生改变
ISP指出应该如何设计一个接口——从客户的需要触发,强调让不要让客户看到他们不需要的方法
单一职责接口隔离
适配器
多继承,通过接口进程隔离
《敏捷软件开发》
2.7 案例:反应式编程框架Flower的设计
程序是如何运行又是如何崩溃的?

同步调用可能产生阻塞
异步消息机制
并发,线程
响应时间

为什么Flower可以显著提升系统性能?

Flower核心模块设计


Flower的分布式异步微服务解决方案

貌似视频中说的 Flower 的 GitHub 地址:https://github.com/zhihuili/flower
评论