软件开发与设计模式—总结
1.软件开发简史
从莱布尼茨、Ada到图灵、冯诺伊曼这些现代计算机到开创者们试图创造的是一种通用型计算机,这种计算机不是做数值计算,而是读取数据进行计算,这些数据本身包含计算的逻辑,这个数据就是程序。
最开始程序员需要将电线编来编去来控制计算机,这也是编程的来源。这种效率太低下,也不方便操作,接着就出现来汇编语言,汇编语言更方便人阅读,但是不同的cpu有不同的指令集也就有不同汇编语言,使得程序跨平台能力弱,不同机器要重新用对应的汇编在次编写代码。然后就设计了更高抽象的程序语言Basic、Perl、C、C++、Java等。高级语言抽象层次更高,代码屏蔽了机器的差异,差异由编译器、虚拟机等去处理。
2.程序语言的本质
编程的目的是:解决现实中的问题。
编程的过程是:在计算机能理解的模型与现实世界建立联系。
编程语言是一种“抽象”机制:领域问题抽象为模型,将模型抽象为软件系统。
3.编程范式之面向对象
3.1 面向对象概述
万物皆对象
程序是对象的集合,它们通过发送消息告知彼此所要做的
每个对象都有自己的由其它对象所构成的存储
每个对象都拥有其类型
某一特定类型的所有对象都可以接收同样的消息
3.2 什么是对象
Booch对对象的描述:对象有状态、行为、标识
状态:表明每个对象可以有自己的数据
行为:表明每个对象可以产生行为
标识:表明每个对象都可以区别与其它对象(唯一地址)
3.3 面向对象编程三要素(特征)
封装性(Encapsulation)
隐藏实现细节
定义接口
继承性(Inheritance)
IS-A 关系
HAS-A 关系(组合)
多态性(Polymorphism)
后期绑定(虚函数)
向上转形
3.4 面向对象分析
面向对象分析是将客观世界,即编程的业务领域进行对象分析
充血模型与贫血模型
领域驱动设计DDD
3.5 面向对象设计的目的
目的:
强内聚、低耦合,从而使系统
易扩展 - 易于增加新功能
更强壮 - 不容易被破坏
可移植 - 能够在多样的环境下运行
更简单 - 容易理解,容易维护
3.6 OOP 原则
为了达到上诉目的,有人总结出了多种指导原则
3.6.1 OCP - Open/closed Principle 开/闭原则
对于扩展开放(Open for extension)
对于更改封闭(Closed for modification)
简言之:不需要修改软件实体(类、模块、函数等)就应该能实现功能的扩展
3.6.2 DIP - Dependency Inversion Principle 依赖倒置原则
高层模块不能依赖底层模块,而是大家都依赖于抽象
抽象不能依赖与实现,而是实现依赖于抽象
DIP 倒置了什么
模块或包的依赖关系
开发顺序与职责
软件的层次化
高层决定底层
高层并重用
好莱坞规则:Don't call me, I'll call you.
3.6.3 Liskov 替换原则(LSP)
OCP原则的关键在于抽象,而抽象的威力在于多态与继承。而继承要复合的规则就是 Liskov替换原则。
简言之:子类型(subtype)必须能够替换到它们的基类型(base type)
3.6.4 SRP- 单一职责原则
SRP - Single Responsibility Principle
又被称为“内聚性原则”:
一个模块的组成元素之间的功能相关性
将它与引起一个模块改变的作用力相联,就形成:
一个类,只有一个引起它的变化的原因。
什么是职责:
一个职责是一个变化的原因。
3.6.5 接口分离原则(ISP)
ISP - Interface Segregation Principle
不应该强迫客户程序依赖它不需要的方法
评论