2020-06-13- 第二周学习总结
1 设计文档编写
架构文档中,也可以使用其他视图进行一个功能的设计。最终的目的是为了将一个功能或者概念解释清楚。不同的项目,侧重点也有所不同,所以使用的视图也不一样,要注意孰轻孰重。
2 软件开发简史
从编程的历史看编程的本质和未来。
2.1 软件编程和计算机
2.1.1 莱布尼兹的奇思怪想
和牛顿一起发明了微积分,又探索了软件编程。
计算机是对逻辑的编程,依据莱布尼兹的思想,布尔对此做了实现。
2.1.2 人类第一位程序媛
先有了程序,才有的计算机的诞生。
2.1.3 什么是计算机?什么是程序?
2.1.4 现代计算机与计算机程序
2.2 形形色色的编程语言
汇编语言
汇编语言关注的是CPU指令,是面向机器的编程语言。
Basic语言
Basic语言,作为最初的高级语言,是按照逻辑进行编程的。高级语言是面向人的逻辑进行编程的。
3. 面向过程语言
面向对象语言
面向对象中的对象指的是问题领域中的对象。
3 面向对象的思考
3.1 编程语言的实质
为了解决领域问题
3.1.1 面向对象语言的诞生背景
编程是用现实世界的问题,在计算机中进行实现,面向对象中的对象是领域中的对象。对领域对象中的关系梳理清楚,并使用面向对象语言进行设计实现。
随着软件规模的越来越大,需要的人力也越来越多,不同的逻辑思维有所不同,面向过程语言已满足不了软件开发的现状,于是面向对象语言就诞生了。
3.1.2 我们用了面向对象的思维了吗?
用户对象去创建一个订单对象,但是我们并没有,而是按照当下MVC模式,一个订单创建请求过来,通过controller调取service,最终写入数据库,返回对象。这不是面向对象,是面向过程的思想,跟现实世界对象模型不一致的,只是我们使用了面向对象语言进行编程而已。
DDD就是面向对象编程,使用一定的手段将面向对象思想落地,是对面向对象的一种实践。
3.1.3 抽象的种类
机器语言和汇编语言:对基础机器机进行抽象
非结构化的高级语言(如Basic,Fortran等):对计算处理逻辑抽象
结构化的程序设计:开始对问题领域进行一定程度的抽象
面向对象的程序设计:直接表达问题空间内的元素
3.2 面向对象编程的核心要素
人(劳动者)
客观业务领域(劳动对象)
计算机(劳动工具)
函数式编程是面向数据编程的,属于面向对象编程的一种细分。
3.2.1 面向对象三大特征
封装(Encapsulation):隐藏实现细节(访问控制);定义接口
继承(Inheritance):IS-A关系;HAS-A关系(组合)
多态(Polymorphism):后期绑定(虚函数);向上转型(Up Casting)
4 软件设计原则
4.1 软件设计中的“臭味”
僵化性
脆弱性
牢固性
粘滞性
不必要的复杂性
不必要的重复
晦涩性
4.2 软件设计原则
开闭原则(OCP)
对扩展开放
对更改封闭
依赖倒置原则(DIP)
高层不能依赖底层,而是大家都依赖抽象
抽象不能依赖实现,而是实现依赖抽象
也被称为好莱坞原则
里氏替换原则(LSP)
优先使用组合,而不是继承
单一职责原则(SRP)
主张对象职责单一,可以将多个职责的类进行分解
类多一点没关系,通过类名/包名可以很简单找到对应的代码,否则代码很多的时候,维护和修改都需要成本。早期或者中间的时候将大类进行拆分,拆成一个个独立文件,注意这些代码之间的关系。代码开发需要注意,维护别人的代码时也是一样。
接口分离原则(ISP)
继承需要慎用,否则当父类发生变化时,子类可能也需要变化。
评论