第二周 框架设计 学习笔记
1. 从编程历史看面向对象编程的本质和未来
编程语言的实质
编程的目的:用计算机来解决现实世界的问题
编程的过程:在计算机所能理解的『模型』(解空间)和现实世界(问题空间)之间,建立一种联系
编程语言:一种『抽象』的机制,通过编程语言将问题抽象为模型,进而设计出软件系统以解决现实世界问题
问题领域
包含与系统所要解决的问题相关的实物和概念的空间
抽象的种类
机器代码和汇编语言:对基础机器进行抽象
非结构化的高级语言:对计算处理逻辑抽象
结构化的程序设计:开始对问题领域进行一定程度的抽象
面向对象的程序设计:直接表达问题空间内的元素
编程方法的演进
什么是对象
状态:表明每个对象可以有自己的数据
行为:表明每个对象可以产生行为
标识:表明每个对象都区别于其它的对象(唯一的地址)
什么是面向对象编程
万物皆为对象
程序是对象的集合,它们通过发送消息来告知彼此所要做的
每个对象都有自己的由其他对象所构成的存储
每个对象都拥有其类型
某一特定类型的所有对象都可以接收同样的消息
面向对象编程的特征
封装性:隐藏实现细节(访问控制)、定义接口
继承性:is-a 关系、has-a 组合关系
多态性:后期绑定(虚函数)、向上转形
面向对象设计的目的
强内聚、低耦合,从而使系统易扩展、更强壮、可移植、更简单
易扩展:易于增加新的功能
更强壮:不容易被粗心的程序员破坏
可移植:能够在多样的环境下运行
更简单:容易理解、容易维护
面向对象设计的原则
为了达到上述设计目的而总结出的多种指导原则
『原则』与编程语言无关
包括:单一职责原则、开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则、合成复用原则
设计模式
贯彻了上述设计原则
『模式』与编程语言无关
用于解决某一种问题的通用的解决方案
包括创建模式:单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式
包括行为模式:观察者模式、模板方法模式、命令模式、状态模式、职责链模式、解释器模式、中介者模式、访问者模式、策略模式、备忘录模式、迭代器模式
包括结构模式:适配器模式、装饰模式、桥接模式、组合模式、享元模式、代理模式、外观模式
框架和工具
框架是用来实现某一类应用的结构性的程序,是对某一类架构方案可复用的设计与实现
框架本身实现了多种设计模式,使应用开发者不需要花太大的力气,就能设计出结构良好的程序来,简化应用开发者的工作
框架可以调用应用程序实现的代码,而应用程序代码可以调用工具,提高开发效率
2. 设计臭味:糟糕的代码有哪些特点
软件设计的『臭味』
僵化性:很难对系统进行改动,因为每个改动都会迫使许多对系统其他部分的改动
脆弱性:对系统的改动会导致系统中和改动的地方无关的许多地方出现问题
牢固性:很难解开系统的纠结,使之成为一些可在其他系统中重用的组件(不可移植性)
粘滞性:做正确的事情比做错误的事情要困难,容易引起程序员误用,破坏原有的设计
不必要的复杂性:设计中包含有不具任何直接好处的基础结构
不必要的重复:设计中包含有重复的结构,而该重复的结构本可以使用单一的抽象进行统一
晦涩性:很难阅读、理解。没有很好的表现出意图
3. 开闭原则介绍及代码分析
开闭原则
对于扩展是开放的
对于更改是封闭的
不需要修改软件实体(类、模块、函数等),就能实现功能的扩展
通过策略模式、适配器模式、观察者模式等可以实现开闭原则
4. 依赖倒置原则介绍及代码案例分析
依赖倒置原则
高层模块不能依赖低层模块,而是大家都依赖于抽象
抽象不能依赖实现,而是实现依赖抽象
倒置什么
模块或包的依赖关系
开发顺序和职责
软件层次化
高层决定低层
高层被重用
框架的核心
倒转的层次依赖关系,好莱坞规则:Don't call me, I'll call you
5. 里氏替换原则
里氏契约
一个正确的继承要符合里氏替换原则
凡是使用基类的地方,一定也适用于其子类
子类一定得拥有基类的整个接口
子类的访问控制不能比基类更严格
继承和组合
继承的优点
比较容易,因为基类的大部分功能可以通过继承直接进入子类
继承的缺点
继承破坏了封装,因为继承将基类更多的细节暴露给子类。因而继承被称为“白盒复用”
当基类发生改变时,可能会层层影响其下的子类
继承是静态的,无法在运行时改变组合
类数量的爆炸
因此优先使用组合
6. 单一职责接口隔离
什么事职责
一个职责是一个变化的原因
单一职责原则
内聚性:一个模块的组成元素之间的功能相关性
作用力:一个类,只能有一个引起它的变化的原因
接口分离原则
一个接口,需要从客户的需要出发,不要让客户看到他们不需要的方法
7. 案例:反应式编程框架 Flower 的设计
反应式编程
用于构建非阻塞的、异步的应用程序
Flower 优势
无需学习函数式编程即可开发反应式系统
纯消息驱动,可以实现更灵活的扩展(事件溯源、分布式事务、限流)
更好的性能,更低的成本
更高可用性:消息驱动天然限流特性使系统在过高并发和部分组件失效的情况下保障系统不会崩溃
申明:本文图片部分来自网络和李智慧老师课件
版权声明: 本文为 InfoQ 作者【应鹏】的原创文章。
原文链接:【http://xie.infoq.cn/article/bc0f0feb4ce82dbfd89303bde】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论