第二周学习总结

用户头像
熊桂平
关注
发布于: 2020 年 09 月 28 日

本次学习通过提问式问题引导学习,老师提出以下问题:

  • 如何进行优雅的程序设计

  • 程序如何设计,程序的架构怎么做

  • 今天的编程方式,编程语言的应用,软件编程是怎么样一步步走到今天的样子的

  • 程序设计软件编程的本质是什么

  • 大多数面向对象编程语言,其本质是什么

  • 什么是软件框架,软件框架的作用是什么

  • 如何设计软件框架

1 软件开发简史

从编程的历史看编程的本质和未来,最早1700年代莱布尼茨逻辑语言的想法,1800年代的雅卡尔发明可编程的织布机,19世纪中叶英国人Ada写出第一个软件程序,现代计算机是冯诺依曼输入第一个程序时开始的。

1.1 什么是计算机?什么是程序?

人类发明制造计算机器有非常悠久的历史,但是这些计算机器都是专门进行数值计算的,

加减乘除、微分积分等等。而从莱布尼兹、Ada,到图灵、冯诺依曼,这些现代计算机

的开创者们试图创造的是一种通用的计算机,这种计算机不是读取数值进行计算,而是

读取数据进行计算,这些数据本身包含着计算的逻辑,这个数据就是程序。

1.2 编程语言的实质

  • 编程的目的是:用计算机来解决现实世界的问题。

  • 编程的过程即:在计算机所能理解的“模型”(解空间)和现实世界(问题空间)之间,

建立一种联系。

  • 编程语言是一种“抽象”的机制,问题是对“谁”来抽象:

编程语言抽象

1.3 问题领域(Problem Domain)

包含与系统所要解决的问题相关的实物和概念的空间。

  • 对基础机器进行抽象:机器代码和汇编语言

  • 对计算处理逻辑抽象:非结构化的高级语言

  • 对问题领域进行一定程度的抽象:结构化的程序设计

  • 直接表达问题空间内的元素:面象对象的程序设计

2 面向对象

2.1 什么是面向对象编程?

  • 万物皆为对象

  • 程序是对象的集合,它们通过发送消息来告知彼此所要做的。

  • 每个对象都有自己的由其他对象所构成的存储。

  • 每个对象都拥有其类型。

  • 某一特定类型的所有对象都可以接收同样的消息。

2.2 什么是对象?

Booch 对于对象的描述:对象具有状态、行为和标识。

  • 状态:表明每个对象可以有自己的数据。

  • 行为:表明每个对象可以产生行为。

  • 标识:表明每个对象都区别于其它的对象。(唯一的地址)

2.3 面向对象编程的三要素

封装性(Encapsulation)

  • 隐藏实现细节(访问控制)

  • 定义接口

继承性(Inheritance)

  • IS-A关系

  • HAS-A关系(组合)

多态性(Polymorphism)

  • 后期绑定(虚函数)

  • 向上转形(Up Casting)

2.4 面向对象编程与面向对象分析

面向对象编程不是使用面向对象的编程语言进行编程,而是利用多态特性进行编程。

面向对象分析是将客观世界,即编程的业务领域进行对象分析。

  • 充血模型与贫血模型

  • 领域驱动设计DDD

2.5 面向对象设计的目的

面向对象设计的目的

  • 强内聚、低耦合,从而使系统

  • 易扩展- 易于增加新的功能

  • 更强壮- 不容易被粗心的程序员破坏

  • 可移植- 能够在多样的环境下运行

  • 更简单- 容易理解、容易维护

2.6 框架(frameworks)

框架是用来实现某一类应用的结构性的程序, 是对某一类架构方案可复用的设计与实现

  • 如同框架结构的大厦的框架

  • 简化应用开发者的工作

  • 实现了多种设计模式,使应用开发者不需要花太大的力气,就能设计出结构良好的程序来

不同领域的框架

  • 微软公司为Windows编程开发了MFC框架。

  • Java为它的GUI(图形用户界面)开发了AWT框架。

  • 还有许多开源的框架:MyBatis,Spring等。

  • Web服务器也是框架:Tomcat

3.面向对象设计原则

3.1 开/闭原则(OCP)

  • 对于扩展是开放的(Open for extension)

  • 对于更改是封闭的(Closed for modification)

  • 简言之:不需要修改软件实体(类、模块、函数等),就应该能实现功能的扩展。

3.2 依赖倒置原则(DIP)

DIP - Dependency Inversion Principle

  • 高层模块不能依赖低层模块,而是大家都依赖于抽象;

  • 抽象不能依赖实现,而是实现依赖抽象。

DIP 倒置了什么?

  • 模块或包的依赖关系

  • 开发顺序和职责

软件的层次化

  • 高层决定低层

  • 高层被重用

3.3 Liskov替换原则(LSP)

里氏替换原则主要阐述了有关继承的一些原则,也就是什么时候应该使用继承,什么时候不应该使用继承,以及其中蕴含的原理。里氏替换原是继承复用的基础,它反映了基类与子类之间的关系,是对开闭原则的补充,是对实现抽象化的具体步骤的规范。里氏替换原则的主要作用如下。

  1. 里氏替换原则是实现开闭原则的重要方式之一。

  2. 它克服了继承中重写父类造成的可复用性变差的缺点。

  3. 它是动作正确性的保证。即类的扩展不会给已有的系统引入新的错误,降低了代码出错的可能性。

  4. 加强程序的健壮性,同时变更时可以做到非常好的兼容性,提高程序的维护性、可扩展性,降低需求变更时引入的风险。

3.4 单一职责原则(SRP)

SRP - Single Responsibility Principle

  • 又被称为“内聚性原则(Cohesion)”,意为:一个模块的组成元素之间的功能相关性。

  • 将它与引起一个模块改变的作用力相联,就形成了如下描述:一个类,只能有一个引起它的变化的原因。

单一职责原则的核心就是控制类的粒度大小、将对象解耦、提高其内聚性。如果遵循单一职责原则将有以下优点。

  • 降低类的复杂度。一个类只负责一项职责,其逻辑肯定要比负责多项职责简单得多。

  • 提高类的可读性。复杂性降低,自然其可读性会提高。

  • 提高系统的可维护性。可读性提高,那自然更容易维护了。

  • 变更引起的风险降低。变更是必然的,如果单一职责原则遵守得好,当修改一个功能时,可以显著降低对其他功能的影响。





用户头像

熊桂平

关注

还未添加个人签名 2020.09.14 加入

还未添加个人简介

评论

发布
暂无评论
第二周学习总结