架构设计 - 学习总结笔记
编程语言的实质
编程的目的是:用计算机来解决现实世界的问题
编程的过程即:在计算机所能理解的”模型“ (解空间)和现实世界(问题空间)之间,建立一种联系
编程语言是一种”抽象”的机制,问题是对“谁”来抽象
问题领域 ——分析、抽象———> 模型 ——> 设计、抽象 ——> 软件系统
模型 <—— 开发、实现 <—— 软件系统
如何理解、学习技术:
这项技术是如果走到现在这个样子的
这项技术是想解决什么问题
为什么过往的技术没有解决的更好的
是否把这项技术要解决的问题或要达成的目的真的实现了呢
问题领域:包含与系统所要解决的问题相关的实物和概念的空间
抽象种类:
机器代码和汇编语言:对基础机器进行抽象
非结构化的高级语言:对计算处理逻辑抽象
面向对象的程序设计:直接表达问题空间内的元素
什么是面向对象编程?
万物皆为对象
程序是对象的集合,它们通过发送消息来告知彼此所要做的
每个对象都有自己的有其他对象所构成的存储
每个对象都拥有其类型
某一特定类型的所有对象都可以接收同样的消息
面向对象三要素:封装性,继承性,多态性。
面向对象设计的目的:
强内聚,低耦合,从而使系统
易扩展 - 易于增加新的功能
更强壮 - 不容易被粗心的程序员破坏
可移植性 - 能够在多样的环境下运行
更简单 - 容易理解,容易维护
面向对象设计原则
为了达到上述设计目标,有人总结出来多种指导原则
"原则" 是独立编程语言的,甚至也可以用于非面向对象的编程语言中
框架是用来实现某一类应用的结构性的程序,是对某一类架构方案可复用的设计与实现
软件设计原则:
开闭原则
Ocp - open/close principle
对于扩展是开发的
对于更改是封闭的
简言之:不需要修改软件实体(类,模块,函数等),就应该能实现功能的扩展
关键是:抽象
适配器模式:
通过适配器完成相关功能的调用
观察者模式
通过 add 方法注册给被观察对象,被观察者循环遍历,通知所有观察者
依赖倒置原则 DIP :
高层模块不能依赖低层模块,而是大家都依赖于抽象
抽象不能依赖实现,而是实现依赖抽象
倒置了什么?
模块和包的依赖关系
开发顺序和职责
软件的层次化:
高层决定低层
高层被重用
里氏替换原则 LSP(解决继承问题)
若对每个类型 T1 的对象 o1,都存在一个类型 T2d 的对象 o2,使得在所有针对 T2 编写的程序 P 中,用 o1 替换 o2 后,程序 P 的行为功能不变,则 T1 是 T2 的子类型。
不符合 IS-A 关系的继承,一定不符合 LSP
子类型必须能够替换掉它们的基础类型。凡是使用基类的地方,一定也适用于子类。
违法 LSP 的征兆:
派生类中的退还函数
派生类中抛出基类不会产生的异常
当不满足 LSP 继承时,可以使用组合,将父类变成子类的成员变量。
继承优缺点:
优点:
比较容易
缺点:
继承破坏了封装
基类发生改变时,会层层影响其下的子类
继承是静态的,无法在运行时改变组合
类数量的爆炸
应该优先使用组合
单一职责接口隔离原则(SRP):
内聚性原则:一个模块的组成元素之间的功能相关性。
将它与引起一个模块改变的作用力相连,就形成如下描述:一个类,只能有一个引起它的变化原因。
什么是职责:
一个职责是一个变化的原因。
违反 SRP 原则的后果
脆弱性 - 把绘图和计算功能耦合在一起,当修改其中一个时,另一个功能可能会意外受损
不可移植性 - 计算几何应用只需要使用”计算面积“的功能,却不得不包含 GUI 的依赖
尽量使类变得更短小,职责更单一,代码量更小,更容易维护(一个类文件不应该超过 IDEA 的一屏)
接口分离原则 ISP
不应该强迫客户程序依赖它们不需要的方法
ISP 和 SRP 的关系
ISP 和 SRP 是相关的,都和“内聚性”有关
SRP 指出应该如果设计一个类 —— 只是有一种原因才能促使类发生改变
ISP 指出应该如果设计一个接口 —— 从客户的需要出发,强调不要让客户看到他们不需要的方法
Flower 反应式编程框架设计 学习笔记:
一个服务器的创建的线程数是有限,线程因为 IO 操作阻塞,当使用线程数多于限制时,就会出现请求超时的问题。用户角度看服务器不可用。
在开发层面上的解决办法就是 异步操作。
Flower 就是使用了异步消息调用的机制,有限的线程可以复用更多的用户请求,显著的提升了系统性能。
传统 web 框架执行流程
Flower 执行流程
Flower 实现异步的基础是 Akka 的 actor
使用步骤:
Flower 核心模块设计:
异步分布式微服务框架
课后作业
请描述什么是依赖倒置原则,为什么有时候依赖倒置原则又被称为好莱坞原则?
高层模块不要依赖低层模块,高层模块和低层模块应该通过抽象来互相依赖。除此之外,抽象不要依赖具体实现细节。开发瞬间可能变成先开发这个抽象,在基于抽象高层模块去调用接口,底层模块去实现这个接口。这个抽象接口要属于高层模块。
高层可以根据自己的使用场景进行模块接口设计或抽象设计,而低层模块按照高层的抽象和设计进行实现,而不是自己实现接口。
框架的核心被称为好莱坞原则: Don’t call me, I will call you. 倒转了层次依赖关系。
对于一个框架来说,我们应用程序是不应该去调用框架的,等待框架调用我们程序。
框架要定义一组接口,框架基于这组接口进行开发和调用我们的应用程序。
请用接口隔离原则优化 Cache 类的设计,画出优化后的类图。
评论 (1 条评论)