同学们好,现在我来讲解面向对象技术高级课程的一部分内容。
我叫邵维忠,是北京大学信息学院的讲师。
我们的教材呢是我跟杨芙清院士合写的一本书,叫做《面向对象的分析与设计》。
我自己本单元讲的内容 对应的书上第二章到第四章。
为了便于同学们回去这个复习阅读, 那么在这个课件当中尽可能采用跟书上
一致的这样的章节编号。
今天这个单元要讲的是 不同的分析与设计方法。
在 软件工程领域,
那么在历史上呢曾经出现过多种分析与设计方法。
我们讲的目的呢,是要回顾这些方法
然后来加深对面向对象方法它的认识,通过比较呢看出面向对象方法的 优势。
最早出现的是功能分解法, 那么它的基本思想呢,是以功能为中心
来组织系统。
你要开发一个系统, 总是要让它提供某些功能。
好,那我们就认识这些功能。
这些功能比较大,所以要把它分解,分解成子功能,如果子功能还是比较大,
再进一步分解,一直到所有在这里每一项功能 都能够比较清楚的定义出来。
由这些功能呢 来构成这个功能模块,
那么进一步的工作就是定义每一个功能模块内部,
需要什么样的数据结构以及呢它的处理过程。
那么模块与模块之间呢,是通过接口来相互连接。
那么由模块的接口来形成了一个模型,模型图。
那么那个时候呢,对这个分析和设计呢
还不太区分啊,所以这个这是又一个比较早出现的一种方法。
那么功能分解法最后得到的系统模型呢,
就是这样一些功能模块跟模块之间的接口 所构成的这样一个模型。
那么看一下 这个功能分解法它的优点和缺点。
它的优点呢 能够直接的反应用户的需求,把这些需求呢都定义成一些功能模块。
所以工作呢也很容易开始,但是呢它有很多问题。
一个问题呢,它不能够直接映射问题域,就说这些模块实现概率
问题域中的不是真的事物,只是把它的功能给它抽出来。
因此呢那就很难检验这个
就是得到的模型,是不是能够正确的刻画这个问题域。
另外一个问题,它的需求变化的适应能力很差。
当需求发生变化的时候,那么 模型模块就需要修改。
它一修改 发现有接口的这些模块呢都需要面临修改。
因为它那里模块之间有接口不加任何限制,
有些模块的接口四通八达,这样一来一个模块的修改 引起周边的很多模块的修改。
而周边一些模块的修改呢, 又引起更多的模块需要修改。
所以它这个 问题呢就使得呢,有的一个模块发生了错误,
会不加限制的影响到其它一些模块。
因为它的接口不加任何限制, 那么后来呢就出现了结构化方法。
结构化方法呢包括结构化分析, 和结构化设计两个部分内容。
先讲结构化分析, 结构化分析呢,又称作是数据流法,它的基本思想
就是跟踪数据流,就是研究问题域中 数据是如何流动以及
它在流动的各个环节上要进行何种处理, 从而呢就发现了这个加工。
那么有数据流有加工这两种概念,
那么得到了分析模型这个数据流图。
那么主要的元素是数据流、 加工,
另外呢还有文件以及端点这样的一些元素。
此外呢,还通过处理说明 来对于加工进行了什么样的操作?
以及数据流,它的数据是如何通过这个数据字典 来加以描述。
这是一个数据流图的举例, 这里面有椭圆呢就是需要加工,直线的时候就是数据流。
从零起点开始,我们 流向了加工,对于加工
过程中对这个数据呢进行了一些修改,产生了新的数据流。
有了地方新的加工,那么一直到流到终点。
那么文件是用来干嘛? 它就是用来存储数据的,它跟加工的不同是
它只是负责数据的保存和读取, 不对数据做任何修改。
那么数据字典呢是用来 对数据流进行详细描述。
那么数据说明呢是对这个加工来进行详细描述。
结构化设计
跟功能分解法呢概念基本相同, 也是用模块来构成系统。
那么但是在结构化方法当中呢, 有一定的发展,就是它分为概要设计和详细设计。
概要设计呢,是确定系统中包含哪些模块,
以及模块之间的这种调用关系, 从而呢得到一个模块结构图。
而详细设计呢,是对每一个模块内部来进行设计,
它包括它的数据结构,以及它的操作流程。
那么总结一下结构化方法的优点和缺点:
它的优点是比较强调研究问题域,
就是对问题域中的数据流来进行分析研究。
而且呢这个数据流图呢它有一些严格的法则,
它的缺点呢,它仍然是 间接映射问题域,不是直接的。
问题域中涵盖了这样那样的事物, 到了这个系统半球中呢,就对数据流进行加工。
那么另一个很明显的问题呢,
就是这个对结构化方法中,分析与设计 所采用的概念是不一致的。
结构化分析所采用的概念 是数据流加工,而到了设计阶段所采用的概念就是模块。
这二者之间呢,并不能够 有一些很好的规律能够进行转换。
两条不同的概念, 那么因此呢,从分析到设计的这个过渡呢就比较困难。
另一个问题,这个数据流和加工往往 数量很多,会
引起这个分析文档的膨胀,这个我们可以通过后面的例子可以看到这个问题。
那么再后来呢,就出现了这个信息建模法。
在信息建模法的早期呢,就说实体与关系法, 也叫作 E-R
法,E 就是实体,R 就是 关系,探索实体与关系方法呢发展而来的。
那么这种方法它的核心概念呢是实体和关系。
实体描述了问题域中的一个事物, 关系呢描述了事物之间在数据方面的一些联系,
那么实体和关系呢都可以用属性来做进一步的描述。
那么后来发展了以后呢,
就把这个实体呢它叫做对象, 把实体叫做对象,并且呢
使用了类型和子类型这样的概念, 用来对这个实体呢进行抽象描述。
那么这个方法呢,后来就得到了信息建模法, 下面这两个图,一个是这个
E-R 图, 就是这个实体-关系法是得到了系统关系图,你看这个方块是实体
这个菱形是关系,椭圆呢是这个实体和这关系的属性。
那么发展以后,它把实体呢兑现了,应用对象 可以用一些属性来描述。
那么对象之间的关系, 也可以用属性来描述。
那么 大家看到,信息建模法呢,已经有点接近面向对象方法了
因此呢有些文献呢,也把这种方法也称作是一种面向对象方法
但是实际上呢,它跟面向对象方法呢,还有一定的差距 主要是以下几点,第一个,它强调的重点呢
不是对象建模,而是信息建模和状态建模 出来的就是信息模型,也就是实体
那么你就是状态模型,就是状态转换图 那么再一点呢,这个实体当中,只有属性
没有操作,也就是说,描述某个事物的 属性和操作没有结合在一起,它没有面向对象的封装的概念
那么,也就是实体呢只有属性没有操作
它也有继承的概念,但是这个继承呢,就只能 这个子类型把父类型的这个属性继承下来
它不能继承操作,因为它就本来就没有,实体里面就没有操作 那么由于它没有封装的概念
所以呢它也就不采用消息通讯机制 这是它跟,这个这是这种信息建模法
那么它跟面向对象方法的一些区别 那么到了这个
作为建模方法来说,到了这个上个世纪 80
年代 就出现了面向对象方法,那么面向对象方法呢包括面向对象的分析
简称能就是 OOA ,和面向对象的设计,简称呢是 OOD
那么面向对象方法,它是运用对象、 类
继承、 封装、 聚合、 关联、 消息、 多态性等等这样些概念
由这些概念来构造系统。
它把问题域中的事物 抽象成对象,由对象
作为系统的基本构成单位,对象的属性刻画了事物的静态特征
对象的操作呢就刻画了事物的动态特征,也就是事物的行为
因此呢,一个对象可以比较完整的刻画了
现实世界中某个事物的特征
那么面向对象方法呢运用类 作为对象的抽象描述。
具有相同属性和相同操作的对象 把它归结成一个类,一个类
那么在类跟类之间,建立继承关系 聚合关系,关联、
消息等等,这样一些关系 这些关系呢又恰好如实地表达了问题域中实际
iii 事物之间的 这种关系。
那么 面向对象方法,它的一些概念,像封装、 继承、 聚合、
关联、 消息 等等,这样一些概念呢,它非常符合人类日常的思维方式
这就使得这个系统呢它的复杂性呢就得到控制,也便于交流
这些优点呢后边我们还可以仔细地讲一讲
那么现在我们回顾了有这四种方法,四种方法
那么不同的方法体现在哪了呢?体现在几个方面,一个呢
它们是用不同的概念来认识问题域
当我们分析问题域的时候,我们是从什么概念出发 像功能分解法,就是我看看这里边都有什么功能
那么结构法分析呢,就是看里边一些什么数据流 是吧,那么面向对象方法就是在里边有一些什么对象
啊,那么信息建模法里面有一些什么实体。
再一个呢 就是说不同的方法体现了 系统对现实世界它的映射方式不同
我们通过下边的图来看,这个图里这个红色的表明是现实世界
这里边有一些客观存在的事物,比方这里面有卡车,有吊车
有货物,那么我们把它映射到系统中来,看看不同的方法怎么映射的
功能分解法,把这些事物映射的系统中 都看不见了,也没有卡车,也没有吊车了,都是些功能
或者子功能,以及这些功能之间的接口 数据流法呢,它是映射到
系统中的就是写数据流,一些加工 这样就是,也看不到现实世界中是些什么事物了
信息建模法呢,具有一定的进步 那么它把这些东西呢映射到系统中呢,是一些实体
这个起重机是一个实体,卡车是一个实体,这货物是一个实体
那么比较,比较在一定程度上
能够反映了现实世界中的实物,但是呢,还不够完善 不够完整,因为这些实体呢只是描述了这些事物的属性
没有描述操作,这些属性呢也就是可以用
通过一些数据来表示的,这样一些特征 那么这个事物的行为,它没有把它放到实体当中去
面向对象方法呢就是比较完整的直接的映射 那么现实世界中的某一个事物,到了系统中就是某一个对象
这些事物有静态特征,是吧,那么 对象呢它有属性,这些事物有它的动态特征,这对象有它的操作
这就是对这些事物呢,是一个,是一种直接的映射,那么相比之下
功能分析解法,结构化方法都是间接映射,而这个信息建模法呢
是半直接的映射
现在我们通过一个例子来看,不同的方法对同样的,同样一个应用系统 是吧,它是代表的不同效果。
这个例子呢,是一个 电话安装业务系统,那么在若干年之前
那么我们要安装一个电话的时候,要到电话局去申请
营业员呢给你登记一个用户登记表 不是想安装就能安装的,要到领导那去批去
批了以后呢那么然后由这个施工队去安装,然后有这个 机房来给你开通电话。
那么对这样一个系统,那么用结构化分析 我们得到了什么样的模型呢?看看数据流,用户提供了自己的信息
那么经过登记,就产生了用户登记表
用户登记表要拿到领导那里去审批去 审批呢,领导在那个登记表上签个字,是同意还是不同意
就下一步就拿到了这个安装队,如果同意拿到安装,那个施工队
去安装去,施工队安装了以后,把钱 iii 有关的信息
经费呀,什么这个有那个电话的型号呀,什么 填了以后,那么把这个登记表呢又拿到了这个
这个这个机房,去开通这个业务,开通业务 所有这些过程中所传递的都是数据流
在各个环节上都是些加工,看来这个呢跟日常业务呢 好像就顺理成章的 iii 模型
但是它的问题是什么呢?第一 这样一些数据流,这样一些加工,跟现实,跟这个问题域中的事物
反映不出来,这里边有些什么事物 这个这个这些模型反映不出来,这里边有用户,有营业员
有这个主管领导,有这个施工队,有机房等等反映不出来 那么它不是个直接的映射
那么描述这些事物的这些数据
跟这些操作,它不是围绕着事物来组织的
而是分散在各个数据流跟加工当中,这是一个问题 那么再看看这个信息膨胀问题。
咱们看看这几个数据流 从登记到审批到安装到开通,是吧
这些数据流所传递的数据啊,实际上我们在实现的时候 就是一个表格,是吧
就是一个登记表,就是一项 [听不清]
数据,如此而已 可是在这个分析模型当中呢,就出现这么多的数据流
每一个加工环节上对它做一点修改就是另外一个数据流啦
所以这就是引起了这个信息的膨胀,往往这个模型呢做的很庞大
实际上说,是包含的信息量呢是有限的
好,那么现在我们看,由面向对象方法 来给它建立模型是个什么样。
面向对象方法是指 我到这问题域,我要观察,这里面有哪些事物
跟我的业务有关,这里边有哪些实物跟我业务有关呢?
有用户对吧,有营业员 有主管人,有施工队,有机房,这都是一些
问题域中现实存在的事物,这些事物呢都是有型的,还有些无形的,或者是逻辑上的事物
就是这个用户登记表,就是这样几个事物 那么好,我们就用对象来描述这些事物。
营业员是一类对象 主管人是一类对象,用户是一类对象,施工队是一类对象,机房是一类对象
用户登记表是一类对象,在这个系统模型当中呢 把这些对象用类来表示出来
然后建立这些类之间的各种关系,啊,建立各种关系 那么进一步的划分这个用户呢,它可以分为
个人用户跟团体用户,这也是一种关系,这是一种一般特殊关系
那么得到这样的关系,那么进一步完善呢 那么将来的营业的时候,还会有账单,账单由若干的项目来构成
看来建立这样一个模型,它就跟问题域中的事物呢产生了一个很好的对应
我们来检查一下,说这个模型建的怎么样,有没有如实的反映了我们这个
这些这个问题域呢?很容易对照,很容易对照。
再一个 这样在模型上去编程的时候,那么每一个对象
恰好就对应着编程语言中的一个类,由类把它写出来就是了
像原先那个模型当中一些数据流一些加工,那么到了这个程序当中对应的什么数据结构啊?
是吧,看不出来,看不出来,是吧 所以这是从这可以看到呢,那么面向对象方法的
它的优点,那么一方面它直接映射了问题域 另一方面呢给这个程序能形成很良好的对应
好,这一单元 就讲到这里,谢谢大家