下面我们来看一下,面向对象的设计到底跟分析有什么样的区别,它到底要做一些什么样的事情
我们带着这样的问题来看,设计整个它的这个 发展的历史以及目前对面向对象设计的一个定位
那么,提到面向对象的设计,不得不提的就是面向对象的设计实际上
是分为早期和九十年代,这个相当于两个这样的一个阶段 那么早期的面向对象的设计是从面向对象的编程
发展到面向对象的设计的,这个 D 实际上很多情况下是指开发呀,也有
Design,也有这个 Development 的这两方面的这样的一个
D ,都包含在内 那么提到面向对象的设计,不得不提的软工里面的一大牛人就是
Booch,Grady Booch 那么,他是 1982
年提出了面向对象的设计这样的一个方法 那么在 1986 年,他又提了面向对象的这样一个开发
也阐述了面向对象的这样的一个设计和面向对象的开发的整体的这样的一个思想 所以这个 D
实际上是双 D 啊整个 因为从第二篇的他的文章里面来看说,说跟第一篇没有特别多的差别
都是很多体现了从 OOP 的一些思想到设计中这样的一些引用
那么,还有就是 Abbott 相当于他在 1983
年提出了正文分析方法 那么在这里面呢,他给出了说如何用
规范的英语对问题进行陈述,进而抽取对象 及对象的特征这样的一种方式。
比如说名词 就认为可以抽取成对象,动词抽取成操作,所以,它的这样的一个雏形
可以作为面向对象这个设计里面很多思想的这样的一个来源。
所以它有它的这样的一个前瞻性 那
1986 年之后相当于又出现了一些面向对象
的设计方法,所以,大家看,这些是一些通用的,这个就说 有一定的影响力的。
比如说 Booch 提出了面向对象的开发方法 那么通用的面向对象开发
GOOD 的方法,还有 HOOD 的方法,层次 式的面向对象的这样的一个设计方法,还有
OOSD 这样的面向对象的结构设计方法等等 这些呢我们不需要过多地去了解它
那么早期的面向对象的设计,它的特点就是说 一般都不是基于面向对象分析给出来。
因为它从编程中,对吧,来的,编写程序的过程中可能我把一些 一些东西封装起来,我认为是对象,对吧,一些操作
它对外提供它的操作的这样的一个接口,内部实现它的体现它的 实现的过程。
所以,这个过程中相当于来初步体现了面向对象的一些思想而已 所以,它大多还是基于结构化分析的结果,数据流图来做的。
另一个 是面向对象编程方法的这样的一个延伸,所以
很多情况都是与编程语言直接相关的,特别是 受 Ada 语言影响很大。
Ada 相当于是 也是被这个很多欧美的,这个相当于
这个人是很推崇的一种语言,被称为一种特别完美的语言,整个 就是很多情况一种语言过于完美了,它肯定使用上就会什么
就会受限,对吧,所以这个 Ada 语言也是也是这样。
那么还有不是纯 OO 也就说,那个时候 OO 的概念还不成形,所以它仅用了一些
OO 的 一些一些少的一些 OO 的概念,同时
它还融入一些非 OO 的一些概念,两者混淆在一起使用。
比如说 在用继承的关系的时候同时还掺杂数据流、
模块等等这样一些概念 还有一个就是不是只针对软件生存周期的设计阶段,这个
D 很多情况下体现了开发呀 有的时候呢也体现它的一些设计思想,所以两者不是一个彻底的分离
所以不管怎么说,前期的 OOD 呢可以看做是现在 OOA,OOD
的这样的一个发展的雏形 所以第二个阶段,也就面向对象的分析的设计
已经逐步地成形,那这个时候呢 我们发现 OO
的方法从设计 来发展到分析,出现了 OOA 的这样的一个方法,同时呢
OOA 和 OOD 相当于不在原来的时候只是依赖于什么
就是结构化的文档,分析文档,希望的是能够形成 自己的一套完整的 OOA、 OOD 的这样的一个开发方法体系
那么,面向对象的设计也是基于 OOA 的,也就是 识别对象是由
OOA 完成,那么 OOD 更多是定义对象是如何来实现的 是这样来去定义的。
所以这个阶段下 大家看比较有名的就是 Booch 方法、 Coad-Yourdon 方法,尤其 Coad-Yourdon
方法整个 被很多人所推崇,那绍老师的这本书呢相当于也是 Coad-Yourdon
方法相当于 这个基于它进一步来延伸的。
那么 这个年代的面向对象的分析基本上是不依赖于结构化的这个分析的一些结果
那么另一点就是说,它是与面向对象的分析是能一脉相承的 而且它能全面地体现了面向对象的方法的一些概念和原则
而且面向对象的分析和设计开始独立于编程 语言,对吧,就说在这个过程中希望的是在设计中的时候
更多地考虑编程语言的这样一些特点,那么分析的时候可以只以 问题一个系统责任所体现的客体和客体之间的关系来去刻画
所以,这个过程,我们就可以去认知面向对象的设计到比较成熟的阶段的时候
它体现了在面向对象分析模型的基础上,运用面向对象的方法进行系统地设计
它的目的是产生一个符合实现要求的面相对象的设计模型
所以这里面呢,也希望大家能够知道,就是面向对象开发中
用得比较普遍的开发过程,比如说有统一软件开发过程,对吧,就是那个
USDP,有的时候也称为 RUP。
那么基于特定活动开发的 这个开发过程,比如说我们这里面提到的 Coad-Yourdon
方法,还有面向特征的开发过程等 那么,这些开发过程都可以分为面向对象的分析、
面向对象的设计以及面向对象的编程等 几个阶段。
我们这个里面就是基于特定活动的 Coad-Yourdon
方法的开发过程的延续 所以这个里面首先来给一下,Coad-Yourdon
方法它对于面向对象设计的一些目标,希望的是 提高软件的生产率。
也就希望在设计的时候相当于能够去考虑一些可复用性 能够做到这个设计结果的这样的一个复用
同时相当于对于设计能够尽量地去 去能够去屏蔽一些功能的这样的一些需求的
这样的一些变化,对吧,就是能够把一些变化性控制在一个可 控的一个范围内。
所以,这个设计是希望能够起到这样的一个作用 另一个就是说提高质量。
因为当今的软件的这种 开发的质量的观点是指全生命周期的观点
这是戴明博士提出来的,美国的质量专家戴明博士提出来的。
也就说希望的是通过全开发生命周期 去控制软件的开发质量,而不是事后的去什么?
去排错对吧,就像我们生产了一个,一个模具对吧,最终 一看说,哦,这个轮具不符合,OK,这个相当于扔掉了,或者返工
软件大家知道,这个返工所付出的代价是相当昂贵的。
所以这个里面大家知道希望软件开发的各个步骤 去能够控制这个质量。
所以这个质量大家知道 如果我们能够去复用已经被证实可行的,同时
这个它的质量已经得到保证的 软件分析的设计文档的话,大家说它的软件,开发的软件本身的质量就是什么?
就是能够进一步地提高它的什么?质量保证 那么还有一个就是加强可维护性。
因为需求在不断 地变化,所以设计整个,如何相当于应对
这种一些变化,同时把这个易变的部分和较稳定的部分进行有效地隔离,这是面向对象设计里面 要特别考虑的几个方面。
所以大家也会看到,为什么我们 OOD 的设计是这样来划分成那四个部分的
那么从易变性的角度,我们大家来看,也就说一个
这个类对外提供的这样的一个服务而言,相当于它的这样的一个易变
性,跟它的接口,它的这个变化性大于它的接口的变化性
那么这个接口的变化性又大于它的属性的变化性,以及跟这个事物的本身而言 所以大家看,事物的本身而言是最不可变的,对吧,但是它的服务是
最对外提供的这样的一些功能服务是最易变的。
所以 由于我们封装大千世界中客观事物类来去刻画这个
系统本身,所以,它的易变性本身以及某种程度上得到了一定的控制 那么这是 OOA 和 OOD 的这样的一个分工。
但是,对于这样的一个分工 不同的人持有不同的观点。
目前有两大这个 这个分歧。
第一种观点称为 面相对象的分析就是考虑做什么,而面向对象的设计 考虑怎么做。
那么另一类呢,就是第二种观点就认为面向对象的分析是考虑 这个问题域和系统责任。
那么,面向对象的设计进一步考虑与实现有关的这样的一些 因素。
那么,邵老师的整个的这样的一种 面向对象的分析设计的这样的一个观点呢,他是以第二种观点为,为依据的。
就是说 希望的是,面向对象的分析
和设计之中不是一个严格的说,是做什么和怎么做的这样的一个划分,而是通过一个自然- 的说分析
只是考虑问题域和系统责任中的这样的一些事物,刻画它们之间的关系。
进而呢对于问题 这个本身给出一个很好的这样的一个描述
另外呢,在设计的时候再去考虑与实现相关的一些要素 形成一个更好的这样的一个解决方案。
所以这个过程,相当于,是第二种观点 更优一些。
所以这个是 面向对象方法,设计方法里面,Coad/Yourdon 方法基础上 给出的这样的一些改进。
就是说,希望呢,能够尽量 OOA 和 OOD 的表示法是一致,同时呢
它们所解决的问题能尽量采用第二种观点,也就是说,面向对象的分析 去分析系统的问题域和系统责任。
那么设计的时候考虑一些实现要素对于前期的分析结果的这样的一个影响 对于 OOA
的这样的一个结果进一步地调整和完善 所以大家来看
那么面向对象的设计,就是把实现的条件,对于 OOA 的这个模型,相当于造成的影响呢
进行分析,进一步呢相当于来补充调整 面向对象的这样的一个分析结果。
所以中间,我们可以把,看做是 OOA 的这样的一个模型拿下来
但是我们在设计的时候呢,是按照实现条件 相当于调整了这样的一个
OOA 的这样一个模型,形成了这个系统的问题域的部分
那么进而呢新增了以下这三个部分,分别是这个
图形的用户界面部分啊,数据管理部分,还有这个 这个任务管理部分,就是并发的部分。
这样的话就使得,中间的 这样的一个部分跟实现条件之间,是一个比较好的这样的一个隔离 那么
OOD 从模型上我们来看,它分成了问题域部分 人机交互部分,就是我们说的图形用户界面部分
那么控制驱动部分,就是说我们说的,这个系统中的并发的,这样的一些主动类的这样的一些- 设计部分 那么还有数据管理部分。
这是从我们面向对象 的设计的时候,要考虑这四个部分。
但同时从另一个侧面而言 它也是采用了跟 OOA 一样的模型表达工具。
也就是说,它还是分为 基本的类图对吧?那进一步的相当于可以需求模型
use case 啊,还有那个其他的描述动态的一些模型啊 比如顺序图啊、
活动图等等,对于这个里面 这个问题域部分以及这其他这三类
三类部分呢相当于进行相应的这样的一个进一步地刻画,并且给出详细的说明来 所以这是
OOD 部分从,一个表示上面来说 它跟 OOA
是一样的,采用相同的这样的一个图形表达的这样的一个工具 那么 OOA 和
OOD 这样的一个关系,我们要来看,它不是一个简单的转换
也不是一个简单的细化,它更多的是一个调整和增补 调整大家知道,是有的时候是一个大调对吧?
如果是一个细化就是可能有的时候,我只是把原来粗的很多 东西,把它补细了。
所以这个啊,不是一个简单的细化关系 所以在这个过程中,我们需要更多地去考虑,哪些的实现条件
对系统的这个未来的实现是有影响的 所以这个里面就要对
OOA 进行进一步的分析 那么 OOA 和 OOD 这个过程中大家可以看到,就是说
可以采用不同的模型的这个表达工具,比如说我用瀑布模型 也可以用喷泉模型。
不同的模型表达工具呢相当于去 模型的这个组织方式,相当于去,来去组织分析和设计的 这个活动。
所以这个是指,你分析和设计活动的这个不同的组织方式啊 那么,大家说更多的是喷泉模型,对吧?
那么面向对象的分析和设计之间是一个什么,迭代的关系,融合的关系。
所以 这个无缝的迭代的关系是更适合面向对象分析设计的
那也就是说,大家在进行课程实践的时候,就会体会到 如果你采用的喷泉模型,对吧?你实际上是一个迭代的,也就是说
在做分析的时候相当于,结束之后去做设计。
设计相当于回来可能 又对某些的东西进行补充和调整,形成分析。
所以这个过程中,两者之间是一个交叠的过程 但是可能有的组呢,相当于就是,我直接进行分析,分析
完了,我按照这个相当于再进行设计。
这个过程中,可能会 有一些这个偏差。
所以这个里面我们,我是提倡用喷泉模型的,就是这种迭代的这样的一些模型 那么
OOD 的这个设计相当于
不强调,就是说这种次序关系 但是呢,每一部分,它都是与
OOA 一致的概念、 表示法和活动,有自己各自的这样的一个策略