写点什么

架构设计 - 学习总结笔记

用户头像
Xuenqlve
关注
发布于: 2020 年 11 月 02 日

编程语言的实质

编程的目的是:用计算机来解决现实世界的问题

编程的过程即:在计算机所能理解的”模型“ (解空间)和现实世界(问题空间)之间,建立一种联系

编程语言是一种”抽象”的机制,问题是对“谁”来抽象


问题领域 ——分析、抽象———> 模型 ——> 设计、抽象 ——> 软件系统

                                              模型 <—— 开发、实现 <—— 软件系统

如何理解、学习技术:

  1. 这项技术是如果走到现在这个样子的

  2. 这项技术是想解决什么问题

  3. 为什么过往的技术没有解决的更好的

  4. 是否把这项技术要解决的问题或要达成的目的真的实现了呢


问题领域:包含与系统所要解决的问题相关的实物和概念的空间

抽象种类:

机器代码和汇编语言:对基础机器进行抽象

非结构化的高级语言:对计算处理逻辑抽象

面向对象的程序设计:直接表达问题空间内的元素


什么是面向对象编程?

  • 万物皆为对象

  • 程序是对象的集合,它们通过发送消息来告知彼此所要做的

  • 每个对象都有自己的有其他对象所构成的存储

  • 每个对象都拥有其类型

  • 某一特定类型的所有对象都可以接收同样的消息

面向对象三要素:封装性,继承性,多态性。

面向对象设计的目的:

强内聚,低耦合,从而使系统

  • 易扩展 - 易于增加新的功能

  • 更强壮 - 不容易被粗心的程序员破坏

  • 可移植性 - 能够在多样的环境下运行

  • 更简单 - 容易理解,容易维护


面向对象设计原则

  • 为了达到上述设计目标,有人总结出来多种指导原则

  • "原则" 是独立编程语言的,甚至也可以用于非面向对象的编程语言中

框架是用来实现某一类应用的结构性的程序,是对某一类架构方案可复用的设计与实现


软件设计原则:

开闭原则

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 核心模块设计:

异步分布式微服务框架

课后作业

  1. 请描述什么是依赖倒置原则,为什么有时候依赖倒置原则又被称为好莱坞原则?

高层模块不要依赖低层模块,高层模块和低层模块应该通过抽象来互相依赖。除此之外,抽象不要依赖具体实现细节。开发瞬间可能变成先开发这个抽象,在基于抽象高层模块去调用接口,底层模块去实现这个接口。这个抽象接口要属于高层模块。

高层可以根据自己的使用场景进行模块接口设计或抽象设计,而低层模块按照高层的抽象和设计进行实现,而不是自己实现接口。

框架的核心被称为好莱坞原则: Don’t call me, I will call you. 倒转了层次依赖关系。

对于一个框架来说,我们应用程序是不应该去调用框架的,等待框架调用我们程序。

框架要定义一组接口,框架基于这组接口进行开发和调用我们的应用程序。

  1. 请用接口隔离原则优化 Cache 类的设计,画出优化后的类图。



用户头像

Xuenqlve

关注

还未添加个人签名 2018.05.03 加入

还未添加个人简介

评论 (1 条评论)

发布
用户头像
总结细节很丰富,赞~记得思维导图~
2020 年 11 月 08 日 22:49
回复
没有更多了
架构设计-学习总结笔记