<<架构师训练营>> 第二周学习总结
内容总结
软件开发简史
什么是软件编程 ?
软件编程的本质就是使用一种逻辑语言来描述现实中的各种问题。在计算机编程史的发展过程中,并不是先出现计算机后出现软件编程这门学科。
我个人理解,从本质上来讲,软件编程的发展推动了计算机的发展,因为我们解决的问题的规模越来越大,复杂度越来越高,也驱动了计算机的发展。
编程语言的实质
编程语言的实质是提供一种描述逻辑的方式来解决真实领域当中的问题。
编程的目的是: 用计算机来解决现实世界的问题。
编程的过程即:在计算机所能理解的 "模型" (解空间) 和现实世界 (问题空间) 之间建立一种联系。
编程语言是一种 "抽象" 的机制, 问题是对 "谁" 来抽象:
理解了编程语言的实质, 能帮助我们在思考问题的时候的明白思考的出发点在哪里, 找到解决问题的关键。实际上,在工作中随着工作经验的积累,可能没有这种思考方向上的指引,我们思考问题的出发点有可能是错的,身边遇到最多的人就是需求拿到了,思考该怎么实现,以实现的方式去设计数据库表,以至于像智慧老师课程中提到的使用面向对象的语言一直在写面向过程的代码!!! 正确的方式应该是理解编程语言的实质,从问题本身出发,使用面向对象分析的方法和过程,得到相应的产出物,来指导面向对象的设计。
什么是面向对象编程
第一个成功的面向对象的语言 Smalltalk 描述:
万物皆为对象
程序是对象的集合, 它们通过发送消息来告知彼此所要做的
每个对象都有自己的由其他对象所构成的存储
每个对象都拥有其类型
某一特定类型的所有对象都可以接收同样的消息
C++ 和 Java 等后期的面向对象语言, 都是在这个定义的基础上设计的。
Booch 对于对象的描述:对象具有状态、行为和标识。
状态:表明每个对象可以有自己的数据。
行为:表明每个对象可以产生行为。
标识:表明每个对象都区别于其他的对象。
面向对象的三要素:
封装性 (Encapsulation)
隐藏实现细节 (访问控制)
定义接口
继承性 (Inheritance)
IS-A 关系
HAS-A 关系(组合)
多态性 (Polymorphism)
运行时绑定
向上转型
如何进行面向对象编程实践
面向对象编程不是使用面向对象的编程语言进行编程, 而是利用多态特性进行编程。
要进行面向对象编程的实践,使用面向对象分析方法对问题进行分析是必不可少的。面向对象分析是将客观世界,即编程的业务领域进行对象分析。
面向对象设计的目的:
强内聚、低耦合,从而使系统
易扩展 - 易于增加新的功能
更强壮 - 不容易被粗心的程序员破坏
可移植
更简单
面向对象设计的原则
为了达到强内聚、松耦合的设计目标,有人总结出了多种指导原则
"原则" 是独立于编程语言的, 甚至也可以用于非面向对象的编程语言中
面向对象设计的基本原则
面向对象设计的原则是针对于面向对象设计的 "指导原则", 主要有:
开/闭原则 (OCP)
OCP - Open/Closed Principle
对于扩展是开放的
对于更改是封闭的
简而言之: 不需要修改软件实体 (类、模块、函数等), 就应该能实现功能的扩展
如何实现不修改而扩展?
关键是抽象
依赖倒置原则 (DIP)
DIP - Dependency Inversion Principle
高层模块不能依赖底层模块, 而是大家都依赖于抽象
抽象不能依赖实现, 而实现需要依赖抽象
DIP 倒置了什么?
软件或包的依赖关系
开发顺序和职责
软件的层次化
高层决定底层
高层被重用
Liskov 替换原则 (LSP)
在面向对象的程序中, 子类型 (subtype) 必须能够替换掉它们的基类型 (base type)。
单一职责原则 (SRP)
SRP - Single Responsibility Principle
又被称为 "内聚性原则": 一个模块的组成元素之间的功能相关性
一个类, 只能有一个引起它变化的原因。
接口隔离原则 (ISP)
ISP - Interface Segregation Principle
不应该强迫客户端程序依赖它们不需要的方法
ISP 和 SRP 的关系
ISP 和 SRP 是相关的, 都和 "内聚性" 有关
SRP 指出应该如何设计一个类
ISP 指出应该如何设计一个接口
学习总结
如何使用好设计模式?
设计模式是解决面向对象实践的一些解决方案,要用好设计模式,首先得领会到设计模式的美,然后才是落地。面向对象设计原则是 "内功心法", 设计模式是 "招式", 结合起来使用, 才能在面向对象设计领域产生巨大的威力。
如何做好面向对象实践?
分析好问题域,找出问题的对象模型
使用面向对象分析,抽象出对象的行为
使用面向对象设计的指导方法,设计对象之间的关系
评论