各位同学大家好。下面呢,我们开始我们这个课程的最后一讲,轻叩面向对象之门。 那大家都知道,我们在这个课程上所学的编程语言呢,是 C 语言。 那么 C 语言呢,是一种结构化程序设计语言。那么作为对 C 语言的一个发展呢, C++ 语言是一门面向对象语言。那么为什么要从结构化程序设计语言 发展到面向对象语言呢?什么是面向对象?为什么要面向对象呢? 那么这一次课我们就来讨论一下这个问题。那么在讨论为什么要 面向对象这个问题之前啊,我们先再来讨论一下,什么是计算机程序? 因为啊,只有搞清楚了计算机程序的本质, 才能够理解为什么要面向对象。 那么接下来啊,我们就从我们上次课,刚刚讲过的一个例子 开始。那么在上次课中啊,我们曾经举过这么一个例子。 我们使用了一个结构体来描述啊,有一个学生相关的一系列信息。 那么之所以这么做呢,是因为我们希望啊,与学生相关的这 一系列的信息啊,在程序中展现为一个整体。 从而使得呢,我们的程序表现起来更加的直观,更加的贴近现实世界中的事物。 其实呢,像这一种在程序中描述事物的方法是具有普遍意义的。比方说, 在这儿啊,我们用 student 这个结构体来描述了一个学生。那么同理,我们也可以用这个方法 来描述一个老师。当然,我也可以用它来描述一个教务。那有的同学说, 嗳,老师你怎么举的都是人物啊?没问题。其他的东西也可以。比方说老师啊, 在开课之前都会给出一个课程计划。这个课程计划也是可以用结构体来描述的。 那么学生呢,会根据这个课程计划,看到这个课程计划以后,觉得这个课,嗳,适合我。 于是呢,他会向教务提交一份选课单。啊,来准备来选这个课程。这个选课单啊,也可以 用这个结构体来描述。那么教务老师在处理完所有同学的选课单以后啊, 会给任课的这个老师提供一份选课名单。这一份选课名单 也是可以用这个结构体来描述的。那么我们讲到这儿啊,可能有的同学就发现了, 嗳,老师你举的这六个例子不错,因为这六个例子凑在一块啊, 还真就是我们在学校里面选课的时候, 经常碰到的一些事物和人物。 其实在我们的现实世界里啊,有了这一些事物以后, 然后呢,我们再制定一份选课的 规章制度,那么这个学校的选课流程啊, 就可以运转起来了。也就是说啊,在这个图上所出现的这些东西,我们都可以 在现实世界里头找到跟它相对应的事物。而且呢,根据刚才我们给的这些分析, 对于这样的一些事物啊,我们都可以把它描述成 程序。比方说,对于这个学生, 我们就可以利用一个结构体来描述它。 那么同理,对这个老师,我也可以采用一个结构体来描述。 那么对教务呢,我也可以采用一个结构体来描述。 不仅如此,课程计划,选课单,选课名单, 我都可以用结构体来描述它。说到这儿,有的同学可能问了。 这个选课的流程这个规章制度能用程序来描述吗?能呀!因为, 当你定义好这一些结构体以后啊,我就可以写一段程序。 啊,这一段程序就会描述清楚这一些结构体之间的 关系。就会描述清楚对这样的一些数据,应该如何进行审核,如何进行 处理,如何进行传输。那么说到这儿,可能有的同学意识到了,嗳,还真是的, 现实世界中的这些事物啊,都可以用计算机程序来描述它。 也就是说啊,现实世界里头的这些事物到了计算机里头啊, 都变成了一些程序了。 那么说到这儿啊,我就想让大家思考一下刚才我们提出的那个问题。 到底什么是计算机程序呢?我们可不可以啊,这么来理解。 那么这个呢,是现实世界中的那些事物。它呢,代表了现实世界啊, 处理某个问题的一种解决方案。比方说,这一些事物, 就是人们处理如何选课这件事情的一个解决方案。这一个呢,就是我们根据 现实世界里的这个选课的解决方案所构造出来的 计算机程序。也就是说,上面对应着现实世界中的解决方案, 下面对应着计算机系统中的程序。它们两个之间是存在一个 对应关系的。 Ok, 那么说到这儿,大家可能有点感觉了。什么是计算机程序呢? 对计算机程序应该如何理解呢?其实啊,我们可以这样来理解计算机程序。什么是计算机程序啊? 它是现实世界的解决方案 在计算机系统中的映射。 也就是说,什么叫程序开发呀?从本质上讲, 其实它所作的事情就是把现实世界中的解决方案 映射成计算机系统中的程序。其实这就是程序设计要做的事情。 那么程序设计所依赖的工具是什么呢?是编程语言。 那说到这儿我们就来整理一下我们的思路。什么是计算机程序呢?计算机程序可以看作 现实世界中的解决方案在计算机系统中的映射。 也就是说,如果我们想要开发程序的话,那我们要做的事情 就是要把现实世界的解决方案,把它描述为计算机程序。现实世界是什么样子的, 我就应该把程序描述成什么样子。那么我靠什么来描述它呢? 靠编程语言。就是说为什么编程语言它重要啊? 因为编程语言是在计算机系统中描述那个解决方案的工具。 Ok, 那么说到这儿啊,那么关于我们提出的第一个问题,啊,我们找到一种合理的理解方法了。 那么现在呢,我们来回答第二个问题。那么为什么人们要提出 面向对象的程序设计语言呢?现在我们来思考一下这个问题。 那么既然啊,编程语言的作用,就是要对现实世界中存在的这个 解决方案进行描述,那么要讨论什么样的编程语言更为先进, 我们就必须要去看一下,这个现实世界中的解决方案,它到底是个 什么样子?Ok, 那么要讨论这个问题啊,我们就回到刚才我们所举过的那个例子。 现在啊,我们重新来观察一下这个例子。那么说到观察,我就回想起来 一句我很喜欢的话。那么这句话的原始出处呢来爱因斯坦。啊这个话的大意是这样的。 如果你客观的观察这个世界,你就会发现它是如此的简单,以至于 像我们所想象的那样。Ok, 那么现在呢,我们来观察一下这个教务系统。 那么其实啊,在现实世界中的这样一个教务系统啊,其实是由各种不同的 事物来组成的。那么有的事物呢,表现为一些数据。比方说, 课程计划,选课单,以及选课名单,等等。那么有些事物呢,表现为数据和 动作的组合。比方说,这个学生,那么我们可以定义一个结构体来描述与这个学生相关的数据。 同时呢,这个学生啊,还会执行一系列的动作。比方说,提交选课单,提交作业, 等等等等。再比如对这个老师,也是一样的。我们可以定义一个结构体来描述与老师相关的数据, 那么同时呢,老师也具有一系列的动作。比方说,制订课程计划, 阅读选课名单,等等等等。那么同理,教务也是这样的。 那么按照这样的一种理解,我们再来观察这个选课的流程和规章制度。 这个选课的流程和规章制度啊,其实可以完全拆分为 这一些事物的数据关连及其行为规则的描述。 也就是说啊,我们可以按照这样一种观点来描述这个系统。 以系统中的各种事物为核心,把整个系统的行为描述为 各种事物所具有的数据,以及各种事物对这些 数据进行操作的各个动作的一个集合。 那么其实呢,在面向对象的方法中,我们就把系统中的各个事物称作对象。 那么任何一个对象呢,既可以包含数据,也可以执行某些动作。 从而呢,我们就把整个的现实世界中的解决方案, 分解为各个对象所具有的数据,以及动作的一个集合。 那么按照这种方法所设计的,用于描述这个解决方案的语言, 就被称为面向对象语言。那么正是因为利用面向对象语言所编写的程序, 更加贴近于现实世界的解决方案的存在方式,因此人们才感觉到, 面向对象语言,比其他的语言更加地先进。那么其实呢,如果我们回顾一下, 计算机程序设计语言的发展历史,我们也能够看出,相同的趋势。我们来看这一张图。 那么这张图呢,引自北京大学邵维忠教授和杨芙清教授所撰写的一本专著, 《面向对象的分析与设计》。那么通过这张图呢,我们就可以看到,那么计算机系统中运行的程序啊,是现 实世界的解决方案在计算机系统中的映射。那么计 算机编程语言呢,就是帮助我们实现这个映射的 工具。那么早期的程序设计语言,例如机器语言, 汇编语言,甚至于非面向对象的结构化程序设计语言, 它们更多的呢,是站在对计算机程序进行描述的这样一个角度, 更多地考虑了计算机程序的存在方式和运行方式。 而,面向对象语言呢,则更多地考虑了现实世界中的解决方案的 存在方式和运行方式。因此呢,我们会感觉到面向对象语言比其他的语言, 更加地先进。那么透过这个图啊,我们也可以感受到计算机程序设计语言 发展的一种趋势。Ok,那么说到这儿啊,跟我们这个课程相关的内容啊,我们就介绍完了。 那么当然同学们在计算机程序设计这个分支上的学习,才刚刚开始。 那么,在接下来的学习过程中呢,同学们还会继续遇到很多的问题, 需要大家去思考和解决。比方说,在程序设计的领域, 如何去理解软件的本质, 又如何去理解对象?如何呢,以面向对象的视角来观察这个世界? 那在现有的面向对象语言中,各种技术成分作用应该是什么? 如何去正确地运用这些成分进行程序设计? 如何进行面向对象的分析?如何进行面向对象的设计?以及, 如何才能设计出更加具有生命力的软件? 等等等等。那这样的一些问题呢,就需要同学们, 通过不断地努力学习去慢慢解决。 我也希望呢,在未来,我们会有更多的机会,去交流和探讨。最后呢, 非常感谢各位同学一路的陪伴。 希望呢,各位同学能够从这个课程里面,获得自己需要的东西,获得成长。 那么在这个课程的推出的过程中啊,由于各方面条件的限制, 特别是来自于时间的限制,使得呢,我们这个课程还有很多需要改进的地方。 比方说我们的确需要更多的时间,来整理和发布计算机基础知识概论部分的内容,啊, 使得这些部分呢,变得更有意思。也的确需要更多的时间来从新规划 计算机程序设计部分的内容。并且呢补充更多有意思的例题,而且呢, 也的确需要更多的时间、经验和勇气来把课堂 上面很多有意思的环节搬到课程中来。我希望 啊,在各位同学的鼓励之下,我们可以在不久的将来 完成这些事情。使得,我们这个课更加地有意思。 这也是我们这个课程成长的一个方向。我们 接下来的目标,就是要把这个课,变得 更加地有意思。ok,最后呢,祝大家圣诞快乐,新年快乐,春节快乐,谢谢大家。