架构师训练营 2 期第二周总结
编程历史看面向对象的本质与未来
从莱布尼兹的奇思怪想、人类第一位程序媛。那时人类已经开始探索编程了。从莱布尼兹、Ada,到图灵、冯诺依曼这些现代计算机的开创者们试图创造的是一种通用的计算机。
当冯诺依曼在 ENIAC 计算机上输入第一个程序的时候,标志着现代计算机的诞生,也意味着软件编程这一新兴的行业即将出现。
然后就出现了各种计算机语言:汇编语言, 早期 Basic 语言, Perl, C, C++, Java
编程的目的是:用计算机来解决现实世界的问题。
编程的核心要素: 人(劳动者)、计算机(劳动工具)、客观业务领域(劳动对象)
什么是面向对象编程?
第一个成功的面向对象的语言 Smalltalk 描述:
万物皆为对象
程序是对象的集合,它们通过发送消息来告知彼此所要做的。
每个对象都有自己的由其他对象所构成的存储。
每个对象都拥有其类型。
某一特定类型的所有对象都可以接收同样的消息。
C++ 和 Java 等后期的面向对象语言,都是在这个定义的基础上设计的。
什么是对象?
Booch 对于对象的描述:对象具有状态、行为和标识。
状态:表明每个对象可以有自己的数据。
行为:表明每个对象可以产生行为。
标识:表明每个对象都区别于其它的对象。(唯一的地址)
面向对象编程的三要素(特征)
封装性(Encapsulation)
隐藏实现细节(访问控制)
定义接口
继承性(Inheritance)
IS-A 关系
HAS-A 关系(组合)
多态性(Polymorphism)
后期绑定(虚函数)
向上转形(Up Casting)
面向对象编程的三要素
No. 1:封装性 – 隐藏实现
No. 2:继承性 – 接口的重用
No. 3:多态性 – 对象互换的魔法
以上也不是面向对象独有的。
面向对象设计的目的和原则
面向对象设计的目的
强内聚、低耦合,从而使系统
易扩展 - 易于增加新的功能
更强壮 - 不容易被粗心的程序员破坏
可移植 - 能够在多样的环境下运行
更简单 - 容易理解、容易维护
面向对象设计的原则
为了达到上述设计目标,有人总结出了多种指导原则
原则”是独立于编程语言的,甚至也可以用于非面向对象的编程语言中。
设计模式(design patterns)
设计模式是用于解决某一种问题的通用的解决方案。
设计模式也是语言中立的。
设计模式贯彻了设计原则。
Gang of Four(Erich Gamma, Richard Helm, Ralph Johnson and John Vlissides)提出了三大类 23 种基本的设计模式:
创建模式
行为模式
结构模式
在更细分的领域当中还可以总结出许多设计模式:
并发编程模式
Java EE 模式
etc
框架(frameworks)
框架是用来实现某一类应用的结构性的程序, 是对某一类架构方案可复用的设计与实现
如同框架结构的大厦的框架
简化应用开发者的工作
实现了多种设计模式,使应用开发者不需要花太大的力气,就能设计出结构良好的程序来
不同领域的框架
微软公司为 Windows 编程开发了 MFC 框架。
Java 为它的 GUI(图形用户界面)开发了 AWT 框架。
还有许多开源的框架:MyBatis,Spring 等。
Web 服务器也是框架:Tomcat
框架 VS 工具
框架调用应用程序代码
应用程序代码调用工具
架构师用框架保证架构的落地
架构师用工具提高开发效率
设计臭味
软件设计的最终目的,是使软件达到“强内聚、松耦合”,从而使软件:
易扩展 - 易于增加新的功能
更强壮 - 不容易被粗心的程序员破坏
可移植 - 能够在多样的环境下运行
更简单 - 容易理解、容易维护
与之相反,一个“不好的”软件,会发出如下“臭味”:
僵硬 - 不易改变。
脆弱 - 只想改 A,结果 B 被意外破坏。
不可移植 - 不能适应环境的变化。
导致误用的陷阱 - 做错误的事比做正确的事更容易,引诱程序员破坏原有的设计。
晦涩 - 代码难以理解。
过度设计、copy-paste 代码
设计原则
开闭原则
对象行为的变更只能基于扩展而不是修改源代码。
对修改关闭,对扩展开放。
依赖倒置原则
高层不能依赖底层模块,而是都依于抽象。
抽象不能依赖实现,而是 实现 依赖的抽象。
倒置了那些?
依赖倒置:高层调用开发好的高层定义抽象接口,而底层就实现这些高层抽象出来的接口、从而依赖都是依赖这个接口。
于此同时的非依赖倒置:高层调用底层接口,底层实现这些接口,然而高层模块还是依赖底层模块。虽然没依赖实现,但是依赖底层的接口。
接口要属于高层模块的
软件的层次化
高层决定底层
高层被重用
Liskov 替换原则(LSP)里式替换原则
当所有的子类均能替换父类并且程序运行没有出错的情况下,我们认为这种类继承是满足里氏替换原则。
单一职责原则
一个模块的组成元素之间的功能相关性。
一个类的职责必须是单一的,只能有一个引起它的变化的原因。
违反 SRP 原则的后果
后果
脆弱性
不可移植性
案例:反应式编程框架 Flower 的设计
为什么选择 Flower
Flower 与 WebFlux、RxJava 的比较优势
开发工程师无需学习函数式编程即可开发反应式系统
纯消息驱动,可以实现更灵活的扩展(事件溯源、分布式事务,限流)
更好的性能与更低的成本
更好的性能意味着用更少的机器就可以满足系统的并发压力
更高的可用性
消息驱动天然限流特性使系统在过高并发和部分组件失效的情况下保障系统不会崩溃
评论