面向对象方法,如果从一个很这个 general 的角度,它就是一种特定的软件开发方法学。
实际上是面向对象方法有它自己的世界观,也就是说,它认为一切的系统都是由对象 来构成的。
那么对象之间的相互的作用,相互的影响
构成了大千世界中的各式各样的系统,所以我们要来去找对象。
那么,面向对象方法是什么呢?它是一种以对象,对象之间的关系
等来构造这个系统的,这个系统化的这样的一个方法。
那么对象,面向对象的这个方法啊,实际上它的这个发展
或者它的这个提出,是非常这个令人振奋的,也就是说,这个 Maurice
啊 这个是图灵奖的获得者,他对面向对象方法就给出了非常高的评价。
"对象是软件界 从 70 年代以来最激动人心的革新。
" 所以大家就可以看到 因为它整个改变了我们看待世界的,什么?方式,以及
去构造世界的这种方式。
那我们来看 一下,面向对象的这个方法,它的发展也是经历了不同的这个阶段。
首先,先提出来的就是,是支持 编程的面向对象语言的这样的一个不断地提出和发展,
那么为代表的是,1967 年啊 这两个人呢,开发出了第一个面向对象的语言
Simula-67,这两个是挪威的科学家,那么 Simula-67
是一个非常典型的,或者说最初被人们认 可的这样的一种面向对象的这种编程语言。
因为这种语言中 出现了类和对象的概念,
那其中呢,他用类呢,作为语言机制,来封装 数据和相关的操作。
所以,这样的一种概念,就使得人们 重新去构造这种编程语言,用这样的一种
概念,或者是这样一种机制,来去进行程序化的这样的一个设计。
那么在 70 年代中期啊,施乐公司的 A Kay 这个,这个研究员呢,相当于
设计出了 Smalltalk 语言,Smalltalk 在面向对象语言里面,是非常 这个出名的啊。
就是说那么 Smalltalk 80 也是就是说 1980 年提出来的。
Smalltalk 80 呢 它是被认为是面向对象,程序设计语言的这样的一个 巅峰。
也就是说,它已经到了一个非常成熟的一个阶段。
那么,从这以后呢,陆续又出现了,比如说 Objective C 啊,C++
啊,Eiffel 等,各种各样的 面向对象的编程语言。
那么这是从语言的角度说,我如何相当于从编程的
这样的一个,就程序化的这样的一个编程阶段的设计中,我们怎么引入了一些
跟面向对象相关的一些概念?
那么,这样的一个发展,促进了面向对象方法的 逐步地这样的一个成熟。
所以在 20 世纪 80 年代中期啊 陆续地出现了一批面向对象的分析设计,这个方法。
那么为代表的 1986 年的 Grady Booch 提出的,面向 OOD
方法,这个 D 不是像我们说的,就是一个 Design,这里面这个D
还有了,更多的是在 Development 实现的层次。
因为大家说,因为先出现的是面向对象的编程语言,对吧?这种语言的出现
犹如引入了一些,这个,能够推动面向对象发展的一些概念 一些机制。
所以陆续出现了方法,所以这个 D 还是从一个实践的角度 如何在往设计的角度去推的这样的一个 D。
所以它可以看做是 Design 和 Development 这样的一个融合体。
那么 1990 年,Coad 和 Yourdon 这两个人呢
提出了面向对象的分析,面向对象的设计,也是非常经典的。
那这个方法,也是陆续被后面的很多方法所使用, 包括后面,就是北京大学的杨芙清院士和
邵维忠教授,共同编写了《面向对象的分析与设计》,就是以 Coad
的方法为雏形,相当于在基础上融入了 UML 的一些方法, 最终形成的这样的一种分析设计方法。
那么 1991 年 那么 Rumbbaugh 相当于提出来
OMT 对象的建模技术,这个呢也是一个比较经典的方法。
后面我会提,为什么它有它的这个独特之处。
那么 1994 年,Embly 相当于提出了 OSA,那么这些 方法,是,实际上整个是,感觉到是百花齐放,对吧?
那么在上面的那么多的面向对象的 分析设计方法提出来之后,人们就想,能不能提出一种
融合了各种开发方法的这样的一种,这个统一的建模语言呢? 于是,OMG
面向对象的管理组织啊,就 提出了这个,或者说发布了统一的建模语言
这个 UML 就是 Unified Modeling Language 的缩写。
那么这个统一建模语言,是融合了以上提到的各种建模语言的长处。
它希望的是 这个,集重彩于一身呢
那么以及呢,它也给出来了,应用这样的统一建模语言 进行软件开发的这个过程。
也就是说,统一软件开发过程。
但这个统一软件开发过程特别得庞大,整个,所以我们后面相当于在书上, 这是后来 Rational
公司给出来的对吧?RUP 相当于实际上就 研习了 USDP 的这样的一个思想。
那么,在我们的课程这个学习中,可能这一部分会略讲啊。
那我们来看一下,UML 的这样的一个统一
建模语言,它的发展也是经历了很长的时期 1995
年的 Grady Booch,这也是软工的,一个非常知名的 这个专家啊。
那么,还有 Jim Rumbaugh 他们这两个人呢,在
OOPSA 这个会议上,公布了这个统一的
方法,这是一个国际上比较知名的,面向对象的编程的这样一个大会。
那么他们首先提出来了,统一建模语言的这样的一个框架,那么我们可以把它称为 0.8
版, 那么在 96 年的时候,Grady Booch 啊,还有
Jim Rumbaugh 还有 Ivar Jacobson,这个称为面向对象三友啊。
这三个牛人在一起 将他们各自以前提出来的一些建模语言呢,融合在了一起。
那么,统一命名为 UML。
那这个时候,应该说 96 年的这个 UML,还是 是一个雏形啊,就是比较全的这样的一个雏形。
那么97 年,Rational 公司呢,这个根据这个 UML 相当于
进一步发布了这个 UML 1.0 版,这是作为 OMG 的这样的一个建议的草案。
那么大家也知道,面向对象的这个管理组织啊,它实际上就是推动面向对象的
这样的一些概念,一些规范的这样的一些全球的制定和推行。
所以,UML 整个被 OMG 相当于作为建议
的草案,以及后来作为提案推出以后,相当于得到了热烈的 这个大量的响应。
所以目前来说,得到了广泛的应用,那么 98 年呢,相当于,就又出现了
UML 1.1,那么大家可以看到,03 年的时候 已经发布了 UML 2.0。
那我们来看,到底什么是面向对象呢? 因为这个词,Object
Oriented,大家在未来看各种的书籍 这个相当于包括一些英文的文档的时候,是比比皆是的。
那么它到底暗含了什么? 也就是面向对象它,不仅仅是一种程序开发方法。
比如说我们说的啊 这个 C++、 Java,这些对于面向对象语言提供支持的 编程语言,里面有了一些类啊,有了一些这样的一些概念。
我们可以去使用它, 所以,不仅局限于这样的一种,使用面向对象程序设计语言,来进行程序设计的
这样的一种方式,也不局限于说我们应用一些面向对象的这些概念,比如说对象、 类、
继承、 封装、 消息等,这样的一些面向对象经典的概念,来进行编程。
那么,更重要的,我们希望的是,培养大家一种 就从方法学的角度上来看待面向对象。
也就是说 这样的面向对象,应该从这样几个角度去来理解。
就是说,如果你真正学会面向对象方法的话, 你就知道如何去看待软件系统与现实世界的关系,以及你知道
用什么样的观点,来对软件进行求解,也就是进行分析和设计。
那么,你也知道,我应该如何对系统进行构造,用什么样的编程语言来去实现这样的一些
面向对象的这样的一些概念,方法。
所以在这个过程中,我们是希望是大家能够 去从这样一个角度来学习面向对象。
那这个图,我们大家来看一下,既然我们说了,
面向对象是希望培养大家一种 一种相当于真正认知现实世界,和
我们这个要去描述的这样的一个啊,就是软件世界之间的 这样两者之间的关系。
那我们来看现实世界,这是看到了一辆车对吧? 那这个车呢,如果反映到计算机这个
这个角度,也是我们用面向对象的方法去描述它,我可以对它进行抽象 但是首先,我把它看成是一个车,对吧?
那这个车里面,有一些什么样的静态的特点呢,或者有一些静态的这个属性呢?
比如说它有发动机,有底盘对吧? 还有什么?轮胎啊等等一系列,这些相当于你可以对它描述
那么这个车本身相当于,它会有一些自己的行为
比如说开关车门,那么我这个汽车启动,对吧?
汽车的这个紧急的这个相当于这个停滞对吧?有的紧急刹车
所以像这样的一些行为,我可以采用一些相应的 这个操作去描述它。
所以这样的一个抽象,就使得我们把 现实世界中的,这样的真实的对象
也就说,实际存在的事物,这个事物呢,可以是有形的,比如说我们这里面举的汽车
它也可以是无形的,比如说一个计划,那么我要去对它进行刻画
那在这里面,我们知道对象是构成世界的一个的独立的这样一个单位
所以,它有静态的特征和动态的特征,那么反映到我们这里面
就是到计算机里的这个属性,这是反映它的静态特征,那么反映它的动态特征就是我们的 给出来的操作啊。
所以这样的一个描述相当于 就使得我们能够用计算机的这样的一个方式
去重新去刻画它,进一步抽象它,那么呢,用来描述整个
的这样一个构成系统的基本单位,现实世界中的这个对象。
那我们在计算机中,是一种属性 和对这种属性进行操作的一组服务封装在一起,相当于去来对这个
现实世界的对象,进行刻画
那我们来看一下面向对象的这个方法,它有一些什么样的特点?
那我们从上面那张图也能看到,我们希望大家从 真实的问题域中,客观存在的事物出发
来去构造软件系统,或者去分析描述它。
所以 我们希望的是,用对象,也就系统中用来描述客观事物的一个实体 来对这些事物进行抽象的描述。
那么这个呢,作为系统的这样的一个基本构成单位 那么,现实世界中,事物的静态特征
我在面向对象方法里,是用对象的属性来描述 事物的动态特征。
也就是说什么叫动态特征,就是它的行为特征 用对象的操作去描述它。
这是 从问题域客观存在的事物出发来去认知它的
静态,动态的特征,进而呢, 来应用这个面向对象中的,对象的这个抽象的概念去描述它
那么第二点就是说,对象的属性和操作啊,它实际上是合为一体
这里面,它体现了一个独立的,这样一个 封装的概念,也就说对外,屏蔽,屏蔽了内部的什么?
细节,那也就是说,对外的话,相当于它提供的只是一个什么?
只是它的一个服务,对吧?它的一个对外的这样的一个操作的接口,对
外面是使用它,只需要去调用它的接口,请求它的这样的一个服务就可以了
那么,第三个方面呢,也就是说,面向对象方法里面
是对事物进行充分的分类,也就是把具有相同属性和操作的对象 我已经分为一类,这是一个简单的分类
那么这个类呢,是具有相同属性和相同操作的对象的这样一类集合
所以大家看,那就每个对象,我们可以看做是类的一个实例 这是一个例子。
比如说我们看到零件对吧?这个零件 实际上它是对于,各种各样的这个相当于事物的这样一个统称,对吧?
可以用到,那这里面,我们如果把它细致地分类的话,可以有螺钉对吧?再细致地分类的话- ,可以有 六角螺钉。
但是这里面,我一定会从某种的角度 把一类具有相同属性和操作的,这样的一个对象
给它封装在一起,构成了一类集合,称为类。
那这个商品也 是。
那我们最开始看到,比如说洗衣机对吧?洗衣机属于家用电器,它又属于
电器,那这里面电器相当于,也属于商品中的一类,所以这样的一个分类的原则,是帮助我们
去分清大千世界中的
这个复杂的各类形形色色的事物,是为了更好地去认知大千世界中的事物 降低认知事物的这样的一个复杂性。
所以,经常我们大家说 采用的分类的原则,这也是我们平时的时候,经常采用的一种机制
那么,通过不同抽象程度上,我们还可以利用一些抽象的原则
比如说,较多地,或者较少地去忽略事物 之间的一些差异,得到较一般的类,和较特殊的类,对吧?
那么,这个例子我们大家可以看一下,如果这个 我们现在所有的人,现在都属于这个人的这样的
这个,作为人这样的一个统类,最顶层的这样的一个一般类中的一个对象的话
那我们如果从,我们是作为服务的提供者,还是服务的这样的一个
享受者的话 ,我们可以分为顾客和服务者这样两大类,对吧?
那当然可能一个人,某种情况下,他是既是顾客,但是从另 一个角度,他也可能是服务者。
但是我们在划分这个时候,肯定会是说 如果你是作为一个服务的提供者,还是服务的这样的一个
使用者,那这个角度来划分,你会分为这样 那么这个顾客里面,实际上是形形色色的。
我们有,可以有普通的旅游者啊,学生啊等等 那这个服务者里面呢,我们又可以来去看说,哦,这个银行
人员相当还是作为一类服务者,那么如果这个餐馆的,对吧?这个厨师 他也是一类服务者。
那么还有普通的这个,相当于各种餐馆啊,这个,这个 相当于一些,一些场所的这样的一些侍者,那么他也是作为服务者,所以
服务者这个角度,我们可以进一步地这样的一个细分。
所以这样的一个过程,实际上是什么? 我们在高层进行抽象的时候
是把这个分为顾客和服务者,是较少地忽略了他们之间的什么?
差异,对吧?仅仅相当于从,你到底是一个服务
的提供者,还是服务的这个享受者,这样的一个角度去进行分类 那下面呢相当于,又进一步相当于从更多的
忽略他们就是去,把他们之间的一些差异,给它这个屏蔽,整个相当又进一步地去细分,所以-
在这个过程中 我们在逐步地相当于是,能够去认知整个,
从上到下的,这个层次中的,这个人 那
么还有一点就是说,复杂这个对象,可以用简单的对象作为其构成 成分,这里面举了一个简单的例子。
比如说大家看到,这是一个老爷车对吧? 上面这是一个老爷车,这是一个整体的这样的一个对象
那么,我可以说,把这个对象进一步地细分,对吧?它的轮胎,对吧?
它的这个相当于车,车的这样的一个轮的毂,轮毂,包括它的这个车身,车门,等等
那么大家就可以看到,也就说,我所有的这个部分,相当于这里面聚,聚集在一起,构成了整体
那么,每一,每一部分相当于都是作为整体中的一个什么?一个组成部分 那这个里面,有了一个概念,大家看到,这个车如果
我把它大卸八块之后,这个车还是一个车了吗? 或者是说,如果这个,因为中国
对吧?我估计世界上很多的地方,鉴定一个人死亡都是脑死亡,对吧?就说是
所以在这个里面,这个脑,相当于实际上是作为一个人,人身的 一个非常重要的一个器官。
那也就是说,这个人如果作为一个整体的话,这个脑 相当于是作为他的一个部分的话,那么这个脑如果不存在的话,这个人本身
也就不存在了,所以这个里面大家可以看到,这是一种紧密的什么?组合关系
部分的成分的,它的生命周期,跟整体的生命周期是 一样的,就像人的大脑和人。
那这个车也是啊,我觉得 实际上这个部件画下来之后,大家可以看到,如果我这个轮胎拿下了
我可不可以向大家说,这个车就没了? 我可不可以供其他的车向大家去使用,就是能不能两个
车共同应用一个轮胎,这是不可能的。
所以在这个里面,这是一种紧密的这样一种组合关系 那我们再看一下,对象之间,只能通过
消息进行通讯,所以这里面强调了一点就是说
一个对象不能直接使用另一个对象的属性,它只能通过消息去请求使用它的
另一个对象中的,比如说操作,所以这个过程中,是通过
消息来实现了对象之间的行为上的这样的一种依赖关系,或者说动态联系 另一点就是说,在面向对象的方法里面
它用关联这样的一个术语,来表达了类之间的静态的关系 比如说一个老师,指导这个学生论文,他们两者
之间存在着一个指导论文的这样的一个,一个静态的联系啊 所以面向对象的这个方法,它的基本概念,我们就可以看到,就是
这个从以上的这样的一些基本概念和它的特点,我们可以看到,面向对象的 基本思想,一个就是从现实世界
中客观存在的事物出发,来去认知和描述 这个现实世界中的事物。
第二个就是充分运用人类日常的这样一些思维啊 就是比如说我们,在这里面强调的抽象、 分类、 集成、
聚合 封装、 关联等等,实际上这样的一些原则,跟我们日常思维中采用的思想是 基本是一致的。
所以这样的话,我们能够更好地去认知和描述 或者是反映大千世界中的这个
要实现,或者就是用户的这样的一个需求。
同时用这个计算机 能够相关地这样术语,去刻画它的这样的一个解决方案
所以 软件工程这个百科全书啊,这里面给了非常重要的一段话,我希望 大家可以看。
也就是面向对象方法,它真正意义深远的目标是
它适合于解决分析和设计期间的复杂性,并实现分析和设计的复用
为什么这么说呢?大家想啊,因为我们是从
这个现实世界中存在的事物,以及事物之间的关系本身 去来刻画它,描述它。
所以,我们要反映的问题域中的问题 跟我们去给出的,它的这样的一个分析设计,这样一个解决方案
是采用的术语空间是一致的,对吧?所以这个,就很容易向大家去,能够去认知
同时这样的分析设计,更利于未来的相适的 应用系统的,在分析设计开发中的复用。
所以 这个过程,大家可以看到,是有它的这个非常好的 这样的一个,就是作用
那么面向对象的这个方法,这一部分的课,我们希望的是
一方面希望大家能够去灌输一些,面向对象的基本
知识,那这里面,希望对面向对象里面的一些基本 的概念呢,面向对象的分析设计的原则啊,大家有所了解
那另一个就是,面向对象的这个分析,我们要做 什么,怎么去做,给大家做详细的介绍。
面向对象的设计 要了解,就是分析和设计之间,到底有些什么的区别?我们到底在
面向对象的设计部分,我们着重,或者关注哪些事情? 那也会给大家介绍一点,就面向对象的程序设计,也就从
分析一下,目前典型流行的,这种各种的面向对象的编程 语言,看它们如何来支持,面向对象分析和设计的这项理念
如何去贯彻这样的一些分析设计的理念