第二周课程总结
一、从编程的历史看编程的本质和未来
莱布尼兹对编程的想法:期望将各种事物都通过一种逻辑语言进行描述,然后用一种可执行演算规则的机器进行计算,即可以计算出事物的各种结果。
Ada利用打孔纸带写出人类第一个软件程序。这个程序已经包含了循环和子程序;
总结:先有了软件的想法,才有了计算机的诞生;
计算机是通过读取数据进行计算,这些数据本身包含了计算的逻辑,这个数据就是程序,这个数据包含输入的数据和执行的逻辑;
每一种CPU都有独特的机器语言,因而需要不同的汇编语言
二、编程语言的本质
目的:用计算机来解决现实世界的问题
过程:在计算机所能理解的“模型“(解空间)和现实世界(问题空间)之间,建立一种联系;
语言:抽象机制,对领域问题进行抽象;
编程的要素:
三、面向对象编程
3.1对象的定义:对象具有状态、行为和标识
状态:表明么个对象可以有自己的数据
行为:表明每个对象可以产生行为
标识:表明每个对象都区别于其他的对象
3.2面向对象编程的三要素(特征):
封装性
隐藏实现细节
定义接口
继承性
is-a关系
has-a(组合)
多态性
后期绑定(虚函数)
向上转型(Up Casting)
3.3本质:我们的业务领域本身就是对象,抽象为编程语言之中的对象,就可以直接投入开发;
四、面向对象实践与分析
面向对象编程是利用多态特性进行编程;
面向对象分析就是将客户世界,即编程的业务领域进行对象分析
充血模型与贫血模型
领域驱动设计DDD
面向对象编程实践
面向对象设计
设计模式
五、软件设计
概念:框架是用来实现一类应用的结构性的程序,是对某一类架构方案可复用的设计与设计
特征:
如同框架结构的大厦的框架
简化应用开发的工作
实现了多种设计模式,使应用开发者不需要花太大的力气,就能设计出结构良好的程序
软件设计的最终目的,使软件达到“强内聚、松耦合”,从而使软件具备以下te's
易扩展 --- 易于增加新的功能
更强壮 --- 不容易被粗心的程序员破坏
可移植 --- 能够在多样的环境下运行
更简单 --- 容易理解、容易维护
相反,一个不好的软件,会发出以下“臭味”:
僵硬 --- 如果单一的改动会导致依赖关系的模块中的连锁改动,那么设计就是僵化的
脆弱性 --- 对系统的改动会导致与改动无概念上关联的许多地方出现问题
牢固性
粘滞性
不必要的复杂性
不必要的重复
晦涩性
OOD软件设计原则
1、开/闭原则(OCP)--- Open/Closed Principle
对于扩展是开放的(Open for extension)
对于更改是封闭的 (Closed for modification)
简言之:不需要修改软件实体(类、模块、函数等),就应该能实现功能的扩展
如何实现 —— 关键是进行抽象设计
2、依赖倒置原则(DIP) — Dependency Inversion Principle
特征
高层模块不能依赖底层模块,而是大家都依赖于抽象
抽象不能依赖实现,而是实现依赖于抽象
倒置
模块或包的依赖关系
开发顺序和职责
软件层次化
高层决定底层
高层被重新
3、Liskov替换原则(LSP)
若对每个类型T1的对象o1,都存在雷霆T2的对象o2,使得在所有针对T2编程的程序P中,用o1替换o2后,程序P的行为功能不变,则T1是T2的子类型
简而言之:子类型(subtype)必须能够替换掉他们的父类型(base type)
4、单一职责原则(SRP) — Single Responsibility Principle
内聚性原则 --- 一个模块的组成元素之间的功能相关性
一个类,只能有一个引起它变化的原因
5、接口分离原则(ISP) — interface Segregation Principle
不应该强迫客户程序依赖它们不需要的方法
评论