资源预览内容
第1页 / 共144页
第2页 / 共144页
第3页 / 共144页
第4页 / 共144页
第5页 / 共144页
第6页 / 共144页
第7页 / 共144页
第8页 / 共144页
第9页 / 共144页
第10页 / 共144页
亲,该文档总共144页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
硕士课程面向对象程序设计硕士课程面向对象程序设计主要内容第一部分:面向对象分析第一部分:面向对象分析Object-Oriented Analysis,OOA第二部分:面向对象设计第二部分:面向对象设计Object-Oriented Design,OOD第三部分:面向对象程序设计第三部分:面向对象程序设计Object-Oriented Programming,OOP 第一部分第一部分 面向对象分析面向对象分析Object-Oriented Analysis系统的复杂性 根据信息论的观点,复杂度可以定义为系统表明自身方式数目的对数,或是系统可能状态数目的对数:K=logN,式中K是复杂度,N是不同的可能状态数。一般来说,一个系统越复杂,它所携带的信息越多。若两个系统各自有M个和N个可能状态,那么,组合系统的状态数目是两者之积MN,其复杂度为,K=logMN。 从可操作性的角度,复杂性可以定义为:寻找最小的程序寻找最小的程序或指令集来描述给定的或指令集来描述给定的“结构结构”,即一个数字序列。若用比特,即一个数字序列。若用比特计算的话,这个程序的大小相对于数字序列的大小就是其复杂计算的话,这个程序的大小相对于数字序列的大小就是其复杂性的量度性的量度。克拉默在其经典著作混沌与秩序生物系统的复杂结构(Chaos and Order: The Complex Structure of Living Systems)一书中,给了几个简单例子,用于分析相应程序的复杂性。系统的复杂性例1:序列aaaaaaa 这是一个亚(准)复杂性系统,相应的程序为:在每一个a后续写a。这个短程序使得这个序列得以随意复制到无穷。例2:序列aabaabaabaab 与第1个例子相比,该例要复杂一些,但仍可以很容易地写出程序:在两个a后续写b并重复这一操作。例3:aabaababbaabaababb 这个例子与例2相似,也可以用很短的程序来描述:在两个a后续写b并重复。每当第三次重写b时,将第二个a替换为b。这样的序列具有可定义的结构,有对应的程序来表示。例4:aababbababbbabaaababbab 这个例子,无结构,若想编程,则必须将字符串全部列出。结论: 一旦一个程序的大小与试图描述的系统相提并论时,则无法编程。或者说,当系统的结构不能被描述,或描述它的最小算法与系统本身具有相同的信息比特数时,则称该系统为根本复杂系统。在达到根本复杂之前,人们仍可以编写出能够执行的程序,否则,做不到。软件的复杂性 在计算机中,软件系统的状态又比硬件系统的状态往往要多若干数量级。另外,由于软件系统中的实体,其扩展不像硬件系统那样,可以由相同元素重复添加,从而使计算机中软件的复杂度呈非线性增长。因此,找到控制和降低软件复杂性的方法,也就找到了控制和降低计算机系统复杂性最根本的方法。于是,我们可以将问题的焦点放在计算机软件上。 关于软件的复杂性,布鲁克斯(Frederick P.Brooks)在其著作人月神话(The Mythical Man-month)一书中,从复杂度、一致性、可变性、不可见性等方面作了系统地分析,揭示了软件所固有的困难。下面,简述之:软件的复杂性(1)复杂度)复杂度 布鲁克斯认为,没有两个软件部分是相同的(至少在语句级别上),若有相同的,人们会把它们合并成一个供调用的子函数,因此,认为复杂是软件的根本属性。 软件开发面对的是客观世界模型的构建问题,相对于物理学,物理学家可以忽视大量实体内容的描述,仅仅关注诸如力、时间、质量、速度等非常有限内容的描述,从而大大降低问题的复杂度,而软件工程师却不能这样做。 构成软件复杂度的实体及其关系的描述不仅引发了大量学习和理解上的负担,而且随着软件规模的增长,使得团队成员之间的沟通以及管理变得越来越困难,从而使软件的开发逐渐地演变成一场灾难。要避免这场灾难,其关键就在于能否控制和降低该软件系统的复杂性。软件的复杂性(2)一致性)一致性 大型软件开发中,为保持各子系统之间的一致性,软件必须随接口的不同、时间的推移而变化。增加了软件的复杂性。(3)易变性)易变性 与计算机硬件、建筑、汽车等实体相比,软件实体经常会软件实体经常会面对持续的变更压力面对持续的变更压力。人们一般认为,已购买的计算机硬件、建筑、汽车等实体修改起来成本太高,于是打消了修改这些产品的念头。而对软件实体,人们却不这样认为,因为它是一个纯粹思维活动的产物,可以无限扩展。(4)不可见性)不可见性 软件是看不见的,当利用图示方法来描述软件结构时,也无法充分表现其结构,从而使软件的复杂度大大超过计算机硬件的复杂度,使得人们之间的沟通面临极大的困难。软件开发难点:概念结构规格、设计和测试 布鲁克斯指出软件复杂度是软件生产的主要困难布鲁克斯指出软件复杂度是软件生产的主要困难,不仅如此,他还分析了在软件领域,人们所取得的进展,并且认为,这些进展只是解决了软件复杂度的一些次要方面的问题,如果说有重大进展的话,那就是从汇编语言到高级语言的进展,其他的进展只能算是一种渐进。 的确如此,高级语言抽象掉了汇编语言所关心的寄存器、位、磁盘等概念,使软件开发的生产率提高了若干倍,同时,软件的可靠性、简洁性也大为提高,相对于汇编语言,高级语言有效地降低了软件的复杂性。 布鲁克斯认为,对于一个软件系统的开发来说,最为困难最为困难的是对其的是对其概念结构概念结构(概念模型)的规格、设计和测试,而不是(概念模型)的规格、设计和测试,而不是对概念结构的实现,以及对这种实现的测试对概念结构的实现,以及对这种实现的测试。当然,他也承认,在实现的过程中会出现语法的错误,但是,相对于概念结构方面的错误,则要小得多。软件的概念结构 在软件开发的前期,要对用户的需求进行分析,然后,将这种需求抽象为一种信息结构,这种结构被称为概念结构。其主要特点为: (1)能真实、充分地反映现实世界,包括事物和事物之间的联系,能满足用户对数据的处理要求; (2)易于理解,从而可以用它和不熟悉计算机的用户交换意见; (3)易于更改,当应用环境和应用要求改变时,能容易地对概念结构进行修改和扩充; (4)易于向计算机支持的数据结构转换。软件的概念结构 软件概念结构的特点决定了这种结构的设计在很多情况下是很难采用形式化的方法,而采用非形式化的系统化方法,如结构化方法、面向对象方法等,却可以有效地控制和降低概念结构设计的复杂性,最后,完成编码、使软件形式化。 系统化方法进入大学“软件工程”等课程已有几十多年的时间了,然而使用系统化方法的真正原因却被人们忽视了,这种忽视阻碍了人们自觉地应用系统化方法的基本原理去控制和降低软件开发复杂性的自觉性和能动性。软件开发的系统化方法遵循的原则 在软件中,存在着大量不能简化的实体,我们把这些实体称之为元素元素,那么,软件系统就是由这些相互联系、相互作用的若干元素组成的,具有特定功能的统一整体。而软件系统的概念结构则是指系统内各组成部分(元素和子系统)之间相互联系、相互作用的框架。 要使一个软件系统的复杂性下降,无非也就是分割,通俗点讲,也就是将一个大系统划分为若干小的子系统,最终,使人们易于理解和交流。下面,给出软件开发的系统化方法需要遵循的几个基本原则: (1)抽象第一的原则)抽象第一的原则 所谓抽象,就是要对实际的事物进行人为处理,抽取所关心的、共同的、本质特征的属性,并对这些事物及其特征属性进行描述。由于抽取的是共同的、本质特征的属性,从而大大降低了系统元素的绝对数量。软件开发的系统化方法遵循的原则(2)层次划分的原则)层次划分的原则 如果一个系统过于复杂,以至于很难处理,那么,就得先将它分解为若干子系统。如何进行分解?什么是好的分解? 可参照集合分解的等价类概念可参照集合分解的等价类概念。使用满足等价关系的3个条件(自反性、对称性和传递性),将集合划分为若干互不相交的子集(等价类),则子集具有某种共同性质的属性,并可以完全恢复到原来状态。这种划分的重要意义在于,使我们将注意力集中于子集中那些具有共同性质的属性及子集之间实质性的关联,从而使无序变为有序,最终大大地降低系统复杂性。 在计算机系统中,人们希望在层次的划分中遵循等价类划分的3个基本原则;另外,为便于记忆,希望划分后的层次数目控制在心理学中有关短时记忆最大容量72范围之内,像计算机网络层次结构、计算机体系结构等均遵循这样的原则。软件开发的系统化方法遵循的原则(3)模块化原则)模块化原则 模型化原则就是根据系统模型说明的原因和真实系统提供的依据,提出以模型代替真实系统进行模拟实验,达到认识真实系统特性和规律性的方法。模型化方法是系统科学的基本方法。 系统科学研究主要采用的是符号模型而非实物模型。研究系统的模型化方法,通常是指通过建立和分析系统的数学模型来解决问题的方法和程序。 用计算机程序定义的模型称为基于计算机的模型。所有的数学模型均可转化为基于计算机的模型,并通过计算来研究系统。另外,计算实验对一些无法用真实实验来检验的系统来说还是惟一可行的检验手段。软件开发的系统化方法遵循的原则 针对软件,在考虑模块化时,还要充分考虑来自Meyer给出的以下5个原则。 (1)模块可分解性。要控制和降低系统的复杂性,就必须有一套相应的将问题分解成子问题的系统化机制,这种机制是形成模块化设计方案的关键。 (2)模块可组装性。要充分利用现存的(可复用的)设计构件能被组装成新系统,要尽可能避免一切从头开始的模块化设计方案。 (3)模块可理解性。要使系统中的模块能够作为一个独立的单位(不用参考其他模型)被理解,从而使系统中的模块易于构造和修改。 (4)模块连续性。在对系统进行小的修改时,要尽可能只涉及到单独模块的修改,而不要涉及到整个系统,从而保证修改后副作用的最小化。 (5)模块保护。在模块出现问题时,要将其影响尽可能控制在该模块的内部,要使错误引起的副作用最小化。结构化方法Structured Methodology 结构化方法是计算学科的一种典型的系统开发方法。它采用了系统科学的思想方法,从层次的角度,自顶向下地分析和设计系统。结构化方法包括结构化分析结构化分析(Structured Analysis,简称SA)、结构化设计结构化设计(Structured Design,简称SD)和结构化程序设计结构化程序设计(Structured Program Design,简称SP)三部分内容。其中,SA和SD主要属于学科抽象形态的内容,SP则主要属于学科设计形态方面的内容。 在结构化方法中,有两大类典型方法,一类是以Yourdon的结构化设计、Gane/Sersor结构化分析方法以及Demarco结构化分析方法为代表的面向过程(面向数据流)的方法;另一类是以Jackson方法和Warnier-Orr方法为代表的面向数据结构的方法。 结构化方法是其他系统开发方法的基础。结构化方法是其他系统开发方法的基础。结构化方法的产生和发展1. 结构化程序设计方法的形成结构化程序设计方法的形成 结构化方法起源于结构化程序设计语言结构化方法起源于结构化程序设计语言。在使用SP之前,程序员都是按照各自的习惯和思路来编写程序,没有统一的标准,这样编写的程序可读性差,更为严重的是程序的可维护性极差,经过研究发现,造成这一现象的根本原因是程序的结构问题。 1966年,C.Bhm和G.Jacopini提出了关于“程序结构”的理论,并给出了任何程序的逻辑结构都可以用顺序结构、选择结构和循环结构来表示的证明。在程序结构理论的基础上,1968年,戴克斯特拉提出了“GOTO语句是有害的”的问题,并引起普遍重视,SP逐渐形成,并成为计算机软件领域的重要方法,对计算机软件的发展具有重要的意义。伴随着SP的形成,相继出现了Modula-2、C以及Ada等结构化程序设计语言。结构化方法的产生和发展2. 结构化设计方法的形成结构化设计方法的形成 结构化程序设计需要事先设计好每一个具体的功能模块,然后将这些设计好的模块组装成一个软件系统。接下来的问题是,如何设计模块。 源于结构化程序设计思想的结构化设计方法就是要解决模块的构建问题。1974年,W.Stevens、G.Myers和L.Constantine等人在IBM系统(IBM System)杂志上发表了结构化设计(Structured Design)论文,为结构化设计方法奠定了思想基础。此后这一思想不断发展,最终成为一种流行的系统开发方法。结构化方法的产生和发展3. 结构化分析方法的形成结构化分析方法的形成 结构化设计方法建立在系统需求明确的基础上。如何明确系统的需求,就是结构化分析所要解决的问题。结构化分析方法产生于20世纪70年代中期,最初的倡导者有Tom Demarco、Ed Yourdon等人。结构化分析在20世纪80年代又得到了进一步的发展,并随着Ed Yourdon于1989年所著的现代结构化分析(Modern Structured Analysis)的出版而流行开来。现代结构化分析更强调建模的重要性。 结构化方法遵循的基本原则 结构化方法的基本思想就是将待解决的问题看作一个系统,从而用系统科学的思想方法来分析和解决问题。结构化方法遵循以下基本原则。 (1)抽象原则:抽象原则是一切系统科学方法都必须遵循的基本原则,它注重把握系统的本质内容,而忽略与系统当前目标无关的内容,它是一种基本的认知过程和思维方式。 (2)分解原则:分解原则是结构化方法中最基本的原则分解原则是结构化方法中最基本的原则,它是一种先总体,后局部的思想原则它是一种先总体,后局部的思想原则。在构造信息系统模型时,它采用自顶向下,分层解决的方法。 (3)模块化原则:模块化是结构化方法最基本的分解原则的具体应用,它主要出现在结构化设计阶段中,其目标是将系统分解成具有特定功能的若干模块,从而完成系统指定的各项功能。结构化方法的核心问题 模型问题是结构化方法的核心问题。建立模型(简称建模)是为了更好地理解我们要模拟的现实世界。建模通常是从系统的需求分析开始,在结构化方法中,就是使用SA方法构建系统的环境模型;然后使用SD方法,确定系统的行为和功能模型;最后使用SP方法,进行系统的设计,并确定用户的现实模型。结构化方法的核心问题1. 环境模型环境模型 SA的主要任务就是要完成系统的需求分析,并构建现实世界的环境模型。在结构化方法中,环境模型包括需求分析、环境图和事件列表等内容。 (1)需求分析:系统分析的第一步,它的主要任务是明确用户的各种需求,并对系统要做什么作一个清晰、简洁和无二义性的文档说明。需求分析阶段的用户一般是高级主管、人事主管和执行官,且基本上每个人都不直接参与新系统开发。 (2)环境图:数据流图的一种特殊形式。环境图模拟系统的一个大致边界,并展示系统和外部的接口、数据的输入和输出以及数据的存储。 (3)事件列表:发生在外部世界,但系统必须响应的叙述性列表。事件列表是对环境图的一个补充。结构化方法的核心问题2. 行为和功能模型行为和功能模型 SD的主要任务就是要在系统环境模型的基础上建立系统的行为和功能模型,完成系统内部行为的描述。实现系统行为和功能模型的主要工具有:数据字典、数据流图、状态变迁图和实体联系模型等。 (1)数据字典 数据字典是一个包含所有系统数据元素定义的仓库。数据元素的定义必须是精确的、严格的和明确的。一个实体一般应包括以下几个部分的内容: 名字; 别名; 用途; 内容描述; 备注信息。结构化方法的核心问题2. 行为和功能模型行为和功能模型 (2)数据流图:是SA和SD的核心技术,它采用面向处理过程的思想来描述系统,它是一种描述信息流和数据从输入到输出变换的应用图形技术。 (3)状态变迁图:及时地描述了对象的状态,它着重系统的时间依赖行为。状态变迁图源于实时系统的建模,并被广泛应用于商业信息处理领域中。状态变迁图看起来非常像数据流图,然而,它们之间却存在着本质的不同。数据流图着重于数据流和数据转换的过程,而状态变迁图着重于状态的描述,如激励发生时的开始状态和系统执行响应后的结果状态。状态变迁图的条件和一个过程的输入数据流相对应,同时,还与控制流的流出相对应。 (4)实体联系模型:被用来模拟系统数据部件之间的相互关系。实体联系模型独立于当前的系统状态,并与具体的计算机程序设计语言无关。结构化方法的核心问题3. 实现模型实现模型 SP的主要任务就是要在系统行为和功能模型的基础上建立系统的实现模型。实现该模型的主要工具有: (1)处理器模型:在多处理器系统和网络环境中,还需要将处理器分成不同的组,以便确定操作在哪个处理器上进行。 (2)任务模型:任务模型建立在处理器模型的基础之上,它将所有过程都划分成操作系统的任务。 (3)结构图:结构图是使用图形符号来描述系统的过程和结构的工具。结构图常由数据流图转换而来,它展示了模块的划分、层次和组织结构以及模块间的通信接口,从而有助于设计者和程序开发人员进行系统的设计。在结构图中,通常有一个主模块在最高层,由该主模块启动程序并协调所有的模块。低级模块则包含更详细的功能设计。结构化方法的核心问题3. 实现模型实现模型 (4)模块设计:在结构化方法中,SP阶段的目标就是将系统分解成更容易实现和维护的模块。SP方法要求每个模块执行单一的功能,而且不同模块间的依赖性要尽可能低。 (5)实现阶段:实现阶段包括系统的编码、测试和安装。这一阶段的产物主要是能够模拟现实世界的软件系统。除此之外,软件文档和帮助用户熟悉系统的客户培训计划也是这一阶段的产物。面向对象的方法 面向对象是近20年来国内外IT行业最为关注的技术之一,面向对象技术是一种按照人们对现实世界习惯的认识论和思维方式来研究和模拟客观世界的方法学。 它将现实世界中的任何事物都视为“对象”,将客观世界看成是由许多不同种类的对象构成的,每一个对象都有自己的内部状态和运动规律,不同对象之间的相互联系和相互作用就构成了完整的客观世界。面向对象的思想面向对象的思想按设计思想来分,传统的软件系统开发可分为自顶向下和自底向上两种。流行的结构化方法采用自顶向下的设计思想。但是,面向对象方法既不是自顶向下方法也不是自底向上方法。尽管它兼有这两者的一些特点。 一方面,面向对象方法鼓励人们从问题的基本的、简单的方面入手,用对象来考虑如何描述问题的解决,然后抽象并确定类,得到具有一般性的解决问题的方法,这正是自底向上的本质; 另一方面,面向对象的方法又要求人们面向目标,考虑为达到这一目标如何建立这些基本的对象,这正体现了自顶向下的思想。面向对象方法从一开始就强调结构与代码的共享与重用 。它与传统的结构化设计思想比起来,有着明显的优点。 代码的可重用性好:代码的可重用性好:随着开发平台以及应用要求越来越复杂,应用程序的规模变得越来越庞大,代码重用成了提高程序设计效率的关键。可维护性和可扩充性好:可维护性和可扩充性好:用传统的面向过程语言开发出来的软件很难维护,是长期困扰人们的一个严重问题,也是软件危机的突出表现 稳定性好:稳定性好: 结构化程序设计也存在模块的独立性,因此结构化软件也有一定的稳定性。但结构化设计是通过过程(函数、子程序)的概念来实现的 。 面向对象的方法概念与思想 所谓面向对象技术,顾名思义,就是以对象观点来分析现实世界中的问题。从普通人认识世界的观点出发,把事物归类、综合,提取共性并加以描述。在面向对象的系统中,世界被看成是独立对象的集合,对象之间通过过程(在面向对象术语中称之为“消息”)相互通信。 面向对象方法是一种运用对象、类、继承、封装、聚合、对象、类、继承、封装、聚合、消息传送和多态性消息传送和多态性等概念来构造系统的软件开发方法。OO方法的产生和发展结构化生命周期法难以控制、处理和适应变化的矛盾,因此产生了原型化方法来进行弥补,原型化方法又需要有快速原型生成工具来支持。这两种方法都是从一般系统工程的角度采用计算机语言来描述、处理自然世界,这样必然造成系统分析、设计与其事物管理的差距,使管理信息系统在应用上产生了许多困难和矛盾。 在20世纪80年代初期产生了面向对象的设计方法(OOP),面向对象设计方法既吸取了以前开发方法的优点,同时又正视和顺应了现实世界由物质和意识两部分组成,是近20年来发展起来的基于问题对象的一种自底向上的系统开发方法。面向对象的思想首先出现在程序设计的语言中,产生了面向对象的程序设计方法(Object-Oriented Programming, OOP),并进而产生面向对象技术和方法。 一般认为,面向对象的概念起源于20世纪70年代挪威的K.Nyguarded等人开发的模拟离散事件的程序设计语言Simula67。但真正的面向对象设计(OOP)还是来源于Alan Keyz主持设计的Smalltalk语言。 由Xerox Learning Research Group所研制的Smalltalk-80系统,则是较全面地体现了面向对象程序设计语言的特征,标志面向对象程序设计方法得到比较完善实现,从而兴起了面向对象研究的高潮。面向对象的基本概念面向对象的基本概念对象对象 Object 对象是客观实体的抽象表示,是由描述对象属性的数据和对这些数据进行的操作行为两部分组成。 属性是用来描述对象静态特征的数据项。 行为是用来描述对象动态特征的操作方法或算法。 消息消息 Message 对象通过对外提供服务发挥自身作用,对象之间的相互服务是通过消息来连接实现的。 消息是为了实现某一功能而要求某个对象执行其中某个功能操作的规格说明。它一般含有下述信息:提供服务的对象标识、服务标识、输入信息和响应信息。对象接收消息,根据消息及消息参数调用自己的服务,处理并予以响应,从而实现系统功能。 消息是对象之间相互作用和相互协作的一种机制消息是对象之间相互作用和相互协作的一种机制,更通俗地讲,OOP中的术语“消息”只不过是现实世界中的“请求请求”、“命令命令”等日常生活用语的同义词。面向对象的基本概念面向对象的基本概念消息消息 Message 消息就是请求某个对象执行它所包含的某项处理操作的指令信息。实质是对某个类对象的操作函数的调用。例如, student S1; S1.display()是一个消息。 一个消息一般由三部分组成:接收消息的对象名、操作函数名、函数的参数。 消息是对象之间的通信机制。一个对象可以同时向多个对象发送消息,也可以接受多个对象发来的消息。面向对象的基本概念面向对象的基本概念面向对象的基本概念面向对象的基本概念方法方法 Method “方法”对应于对象的能力,它是实现对象所具有的功能操作代码段,是响应消息的“方法”。在C+中,方法即是类中定义的成员函数,它只不过是该类对象所能执行的操作的算法实现。 方法与消息是一一对应的,每当对象收到一个消息,它除了能用其“智能化”的选择机制知道和决定应该去做什么(what to do)外,还要知道和决定该怎样做(how to do)。而方法正是与对象相连决定怎么做的操作执行代码。 方法是实现每条消息具体功能的手段。类类 Class 在面向对象的软件技术中,类可以定义为由数据结构及相关操作所形成的集合,或所有相似对象的状态变量和行为构成的模板。 类是对一组对象的抽象归纳与概括,更确切地说,类是对一组具有相同数据成员和相同操作成员的对象的定义或说明。而每个对象都是某个类的一个具体实例。 在OOP中,每个对象由一个类来定义或说明,类可以看作生产具有相同属性和行为方式对象的模板。在面向对象系统中,我们一般就是根据对象的相似性(包括相似的存储特征和相似的操作特征)来组织类的。简而言之,按照对象的相似性,我们把对象分成一些类和子类,将相似对象的集合即称为“类”。面向对象的基本概念面向对象的基本概念面向对象的基本概念面向对象的基本概念类类 Class 在面向对象系统中,人们一般不会逐个描述具体对象,而是将注意力集中于具有相同特性的一类对象,抽象出这类对象的共同结构和行为,用“类”进行一般性描述。 类是具有相同属性和行为的对象集合的抽象描述; 类的内部包括属性和行为两个主要部分。面向对象的基本概念面向对象的基本概念实例实例 Instance 类是对具有相同属性和行为的一组对象的抽象描述。因此,它可作为一种用户自定义类型和创建对象的样板,而按照这种样板所创建的一个个具体对象就是类的实际例子,通常称为实例。 例如,student S1(051001,李明,男,90)继承继承 Inheritance 继承是对象类间的一种相关关系,指对象继承它所在类的结构、操作和约束,也指一个类继承另外一个类的结构、操作和约束。继承体现了一种共享机制。 继承机制既是一个对象类获得另一对象类特征的过程,也是一个以分层分级结构组织、构造和重用类的工具。它是解决客观对象“相似但又不同”的妙法。 继承机制具有能清晰体现相似类间的层次结构关系;能减小代码和数据的重复冗余度,大大增强程序的重用性;能通过增强一致性来减少模块间的接口和界面,大大增强程序的易维护性等特点。 如果没有继承概念的支持,则OOP中所有的类就象一盘各自为阵、彼此独立的散沙,每次软件开发都要从“一无所有”开始。面向对象的基本概念面向对象的基本概念面向对象的基本概念面向对象的基本概念继承继承 Inheritance 父类、子类面向对象的基本概念面向对象的基本概念继承继承 Inheritance 继承关系: 一代继承:从父类到子类只延伸一次。如图(a)所示。 多代继承:从父类到子类延伸多次。如图(b)所示。 单继承:如果在一个继承层次结构中,每个子类只有一个直接父类,则这种继承称为单继承。如图(a)和(b)所示。 多继承:如果在一个继承层次结构中,每个子类可有不止一个直接父类,则这种继承称为多继承。如图(c)所示。封装封装 Encapsulation 即信息隐藏。它保证软件部件具有较好的模块性,可以说封装是所有主流信息系统方法学中的共同特征,它对于提高软件清晰度和可维护性,以及软件的分工有重要的意义。我们从两个方面来理解封装的含义。 (1)当设计一个程序的总体结构时,程序的每个成分应该封装或隐藏为一个独立的模块,定义每一模块时应主要考虑其实现的功能,而尽可能少地显露其内部处理逻辑。 (2)封装表现在对象概念上。对象是一个很好的封装体,它把数据和服务封装于一个内在的整体。对象向外提供某种界面(接口),可能包括一组数据(属性)和一组操作(服务),而把内部的实现细节(如函数体)隐藏起来,外部需要该对象时,只需要了解它的界面就可以,即只能通过特定方式才能使用对象的属性或对象。这样既提供了服务,又保护自己不轻易受外界的影响。面向对象的基本概念面向对象的基本概念封装封装 Encapsulation 所谓封装就是把对象的属性和行为结合成一个独立的单位,使外界不能直接访问或修改这些数据和代码,外界只能通过对象提供的接口函数来改变或获取对象的属性数据,这就实现了消息隐蔽。 封装是面向对象技术的一个基本特征。 封装的目的实现信息的有效隐蔽。面向对象的基本概念面向对象的基本概念例如例如,Class Student private: char* id; /学号学号 char* name; /姓名姓名 int age; /年龄年龄 public: student(char* x,char* y,int z) void modify() age=age+1; Void print() 封装封装 Encapsulation优点:(a) 封装起了信息隐蔽作用,增强了对象的独立性,使外界只关心它对外所提供的接口,忽略其内部细节。(b) 封装使外界不能随意存取对象的内部属性,从而有效地避免外部错误对它的影响,提高了系统的安全性和可靠性。(c) 封装的结果隐蔽了程序的复杂性,提供了代码的重用性,降低了软件开发的难度。面向对象的基本概念面向对象的基本概念例如例如,Class Student private: char* id; /学号学号 char* name; /姓名姓名 int age; /年龄年龄 public: student(char* x,char* y,int z) void modify() age=age+1; Void print() main()Student S1; S1. modify() ; 多态性多态性 Polymorphism 指相同的操作(或函数,过程)可作用于多种类型的对象并获得不同的结果。在面向对象方法中,可给不同类型的对象发送相同的消息,而不同的对象分别做出不同的处理。例如给整数对象和复数对象定义不同的数据结构和加法运算,但可以给它们发送相同的消息“做加法运算”,整数对象接收此消息后做整数加法运算,复数对象则做复数加法运算,产生不同的结果。多态性增强了软件的灵活性、重用性、可理解性。面向对象的基本概念面向对象的基本概念面向对象的基本概念面向对象的基本概念 多态性多态性 Polymorphism 为了正确反映客观世界的多态性,面向对象程序设计中也采用了多态性,即在不同类中,可用相同的函数名实现功能不同的函数。如下图所示。 多态性的优点:高层代码(算法)只需写一次,低层便可多次复用,可提高程序设计的灵活性和效率。对象模型技术OMT模型是为了在构造事物前理解事物而对事物作出的一种抽象,它忽略事物的非本质内容。对象模型技术对象模型技术(Object Modeling Technique,OMT)是建立系统模型的方法学,它由三种模型组成。对象模型表示系统的静态的、结构化的数据,描述一个根据对象和相对实体关系的系统的静态结构;动态模型表示系统的动态的、行为的控制方式,是根据事件和状态描述系统的控制结构;功能模型则表示了系统的转换功能,是根据属性值和功能来描述系统的计算结构。软件过程是三方面的结合: 使用数据结构(对象模型) 按时间调整操作顺序(动态模型) 转换属性值(功能模型)对象模型 对象模型描述了系统中对象结构,包括对象的标识、与其他对象的关系、属性和操作。对象模型提供了动态模型和功能模型都适用的基本框架,对象是现实世界划分事件的单元,是模型中的组成成分。 对象模型用包含对象类的对象图来表示。类按层次排列,并共享公共结构和行为特征,类与其他类相关联。类定义了每个对象实例所取的属性值和每个对象执行的操作。动态模型 动态模型描述了系统中与时间和操作序列有关的内容,即标志改变的事件、事件序列、定义事件上下文状态以及事件和状态的组织。动态模型眼于控制,即描述系统中发生的操作序列。 动态模型用状态图表示。每个状态图展示了系统中对象类所允许的状态和事件序列。状态图中的动作对应于功能模型中的功能,状态图中的事件为对象模型中对对象的操作。功能模型 功能模型描述了系统与值转换有关的诸方面内容,即功能、映像、约束和功能性依赖。功能模型只着眼于系统做什么,而不考虑如何做、什么时候做。 功能模型用数据流图表示。数据流图表示根据输入值和函数进行的输出值的计算与值之间的相关性,而不考虑功能是否执行和什么时候执行。在动态模型中,功能作为动作被唤醒,而在对象模型中则作为对对象的操作。三种模型的联系 对象模型对象模型描述了动态模型和功能模型操作的数据结构。对象模型中的操作对应于动态模型中的事件和功能模型中的功能。 动态模型动态模型描述对象的控制结构,它展示了依赖于对象值并导致改变对象值和唤醒功能的动作的决策。 功能模型功能模型描述由对象模型中的操作和动态模型的动作唤醒的功能,功能是对象模型指定的数据值上的操作,功能模型给出对象值上的约束。面向对象的分析方法面向对象的分析方法面向对象分析(OOA)是面向对象(OO)方法的一个组成部分,它利用面向对象的方法进行系统分析,即在明确的用户需求的基础上,通过对问题空间的分析,把问题分解成一些类或对象,找出这些对象的特点(即属性和服务),以及对象间的关系(一般/特殊,整体/部分关系),并由此产生一个规格说明,建立以对象为单元的信息系统逻辑模型,为面向对象设计(OOD)和面向对象程序设计(OOP)提供指导。 到目前为止,面向对象分析方法有许多种:有Booch方法(OOD)Coad和Yourdon方法(OOA&D)Jacobson方法(OOSE)、Rumbauph方法(OMT)Wassman-Pircher方法(OOSD)等这些方法从不同角度进行分析,各有特色,但距问题的全面解决还有一定的距离。OOA模型及其规约模型及其规约基本模型:类图基本模型:类图模模 型型 规规 约约需求模型:需求模型:用况图用况图辅助模型:辅助模型:包图包图顺序图顺序图对象层对象层特征层特征层关系层关系层OOA过程过程确定系统边界确定系统边界发现参与者发现参与者定义用况定义用况发现对象发现对象定义类定义类定义对象定义对象的特征的特征定义对象定义对象间的关系间的关系原原型型开开发发建建立立模模型型规规约约建立需求模型建立需求模型建立基本模型建立基本模型建立包图建立包图建立顺序图建立顺序图其他其他建立辅助模型建立辅助模型OOA的系统模型的系统模型OOA的主要目标是利用面向对象的方法,站在对象的角度对所要研究的问题空间及系统进行深刻的理解,正确认识问题空间中的事务及其事务之间的关系,识别描述问题空间及系统所需的对象、类,定义对象及类的属性与服务,建立与问题空间相映射、相对应的系统对象模型。 OOA的系统模型包括三大部分,即基本模型、补充模型及系统的详细说明。OOAOOA的系的系统模型模型基本模型基本模型基本模型是以类图的形式来表达系统最重要的信息,而类图则由类、属性、服务、泛化特化结构、整体部分结构、实例连接和消息连接等主要成分所构成。这些成分所表达的模型信息可分为三个层次,即对象层、特征层和关系层。 OOAOOA的系的系统模型模型补充模型充模型补充模型是基本模型之外的用于帮助理解并延伸基本模型的模型,补充模型由主题图、使用实例和交互图组成。 (1)主题图是具有较强联系的类组织的集合体,它是对系统类图的进一步抽象,是较高层次上的系统视图。主题图描述了系统的主题构成,它简明直观,无论是对开发者还是对使用者都有很大帮助。 (2)使用实例(Use Case)是对系统功能使用情况的文字描述,每个使用实例对应着系统的一个功能,它描述系统的外实体与系统之间的信息交互关系。(3)交互图(Interaction Diagram)是一个使用实例与完成相应功能的系统成分之间的对照图,它具体表明了使用实例中陈述的事件是由系统中的哪个服务来响应和完成,以及这个服务在执行过程中又进一步用到哪些其它对象中的服务。OOA的系统模型系统的详细说明系统的详细说明详细说明是按照面向对象方法的要求格式对系统模型作出的进一步解释,它主要由类描述模板构成。对于OOA系统模型的每一类,一般都要建立一个类描述模板。类描述模板的构成有:对整个类及其对象的进一步说明、对每个属性和服务的进一步说明和其他必要的说明。 OOA的系统模型给出了对OOA分析结果的完整表达和精确描述,在这3个组成部分中,基本模型是描述表达OOA的核心,补充模型是对基本模型的必要补充和辅助说明,而详细说明则给出了系统模型中类、对象、属性和服务的详细定义与进一步解释。这三个部分组合起来,构成OOA分析文档的主要内容,也是OOA的主要工具,OOA就是根据这一框架来展开工作的。OOA分析过程在一个系统开发过程中进行了系统业务调查以后,就可以按照面向对象的思想来分析问题了。OOA所强调的是在系统调查资料的基础上,针对OO方法所需要的素材进行归类分析和整理.OOA强调如下基本观点:分析规格说明的总体框架贯穿结构化方法,如整体和局部,类和成员,对象和属性等; 用消息进行用户和系统之间以及系统中实例之间的相互通讯。OOA第一步:确定类对象1、找出候选找出候选的类的类对象对象有两种方法:(1)找出问题域中的五类事物作为候选类对象 可感知的物理实体,如书、汽车 人或组织的角色,如教师、雇员 应该记忆的事件,如演出、访问 两个或多个对象的相互作用,通常具有交易或接触的性质,如购买,结婚 需要说明的概念,如政策(2)将需求分析中的名词或名词短语作为候选者 例1:各剧院的演出售票预订系统按第一种方法,得到候选的类-&-对象为:剧院、演出、票、预订、系统 例2:企业管理信息系统 按第二种方法,得到候选的类-&-对象为:公司、部门、经理、产品、员工、工人、项目OOA第一步:确定类对象2 2、筛选筛选出正确的类出正确的类对象对象 从候选的类对象中去掉不正确或不必要的类对象,主要遵循下列原则: 冗余的:两个类名表示了相同的信息 无关的: 笼统的(模糊的):用精确的代替 属性:去掉无关的属性 操作:动词定义的操作是否作为类?如拨号 实现:分析阶段少或不考虑怎样实现目标系统OOA第二步:确定关联 两个或多个对象之间的相互依赖、相互作用的关系就是关联。 关联关系的确定(1)抽取需求陈述中使用的描述性动词或动词词组(2)找到隐含的关联关系(3)补充一些必要的关联关系(4)去掉不正确或不必要的关联OOA第二步:确定关联 图形图形颜色颜色中心位置中心位置笔粗细笔粗细笔类型笔类型移动(移动(move)选择(选择(select)旋转(旋转(rotate)显示(显示(display)0维维1维维定位定位放大放大2维维定位定位填充类型填充类型放大填充放大填充点点显示显示线线终点终点显示显示弧弧半径半径开始角开始角弧角弧角显示显示多边形多边形边数边数顶点顶点显示显示圆圆直径直径显示显示旋转旋转表表示示泛泛化化关关系系的的图图形形符符号号OOA第二步:确定关联例:例2得到类间的关系为: 动词 相关类 关系 有 公司和部门间 组合/受限关联 管理 部门和经理 0/1:1 生产 部门和产品 1:N 为之工作 公司和员工 1:N 分为 员工和工人 ISA(泛化) 员工和经理 ISA(泛化) 参加 工人和项目 M:N 主持 经理和项目 1:NOOA第二步:确定关联公公司司的的对对象象模模型型OOA第三步:确定属性属性是对象的特性属性的确定 分析:需求陈述中的名词词组表示属性,形容词作为确定属性的线索,如画一个红色的圆; 选择:删去不正确和不必要的属性OOA第四步:识别继承关系一般说来,可以使用两种方式建立继承关系: (1)自底向上:抽象出现有类的共同性质泛化出父类,这个过程实质上模拟了人类归纳思维过程。 (2)自顶向下:把现有类细化成更具体的子类,这模似了人类的演绎思维过程。如:头与眼、鼻、耳、嘴之间是组合关系 人、男人、男孩是继承关系OOA第五步:确定操作对象=数据+操作 在确定类中应该有的服务时,既要考虑该类实体的常规行为,又要考虑为完成本系统功能所需要提供的操作。注意:这里不一定要与数据库系统分析和设计结合起来注意:这里不一定要与数据库系统分析和设计结合起来OOA的符号表示OOA的符号表示OOA实例1:自动取款机(ATM)系统银行银行ATM系统系统1.ATM系统的需求 某银行拟开发一个自动取款机系统,它是一个由自动取款机、中央计算机、分行计算机及柜员终端组成的网络系统。ATM和中央计算机由总行投资购买。总行拥有多台ATM,分别设在全市各主要街道上。分行负责提供分行计算机和柜员终端。柜员终端设在分行营业厅及分行下属的各个储蓄所内。该系统的软件开发成本由各个分行分摊。 银行柜员使用柜员终端处理储户提交的储蓄事务。储户可以用现金或支票向自己拥有的某个账户内存款或开新账户。储户也可以从自己的账户中取款。通常,一个储户可能拥有多个账户。柜员负责把储户提交的存款或取款事务输进柜员终端,接收储户交来的现金或支票,或付给储户现金。柜员终端与相应的分行计算机通信,分行计算机具体处理针对某个账户的事务并且维护账户。OOA实例11.ATM系统的需求 拥有银行账户的储户有权申请领取现金兑换卡。使用现金兑换卡可以通过ATM访问自己的账户。目前仅限于用现金兑换卡在ATM上提取现金(即取款),或查询有关自己账户的信息(例如,某个指定账户上的余额)。将来可能还要求使用ATM办理转账、存款等事务。 所谓现金兑换卡就是一张特制的磁卡,上面有分行代码和卡号。分行代码唯一标识总行下属的一个分行,卡号确定了这张卡可以访问哪些账户。通常,一张卡可以访问储户的若干个账户,但是不一定能访问这个储户的全部账户。每张现金兑换卡仅属于一个储户所有,但是,同一张卡可能有多个副本,因此,必须考虑同时在若干台ATM上使用同样的现金兑换卡的可能性。也就是说,系统应该能够处理并发的访问。OOA实例12. 建立对象模型1) 确定类确定类对象对象 类对象是在问题域中客观存在的,系统分析员的主要任务,就是通过分析找出这些类对象。首先,找出所有候选的类对象;然后,从候选的类对象中筛选掉不正确的或不必要(1 1)找出候选的类)找出候选的类对象对象 方法:非正式分析过程方法:非正式分析过程 从需求陈述中找出下列名词,可以把它们作为类对象的初步的候选者。OOA实例12. 建立对象模型银行、自动取款机(ATM)、系统、中央计算机、分行计算机、柜员终端、网络、总行、分行、软件、成本、市、街道、营业厅、储蓄所、柜员、储户、现金、支票、账户、事务、现金兑换卡、余额、磁卡、分行代码、卡号、用户、副本、信息、密码、类型、取款额、账单以及访问。 通常,在需求陈述中不会一个不漏地写出问题域中所有有关的类对象,因此,分析员应该根据领域知识或常识进一步把隐含的类对象提取出来。例如,在ATM系统的需求陈述中虽然没写“通信链路”和“事务日志”,但是,根据领域知识和常识可以知道,在ATM系统中应该包含这两个实体。OOA实例12. 建立对象模型(2 2)筛选出正确的类)筛选出正确的类对象对象 显然,仅通过一个简单、机械的过程不可能正确地完成分析工作。非正式分析仅仅帮助我们找到一些候选的类对象,接下来应该严格考察每个候选对象,从中去掉不正确的或不必要的,仅保留确实应该记录其信息或需要其提供服务确实应该记录其信息或需要其提供服务的那些对象。 筛选时主要依据下列标准,删除不正确或不必要的类对象:冗余、无关、笼统、属性、操作、实现。 在ATM系统的例子中,经过初步筛选,剩下下列类对象: ATM、中央计算机、分行计算机、柜员终端、总行、分行、柜员、储户、账户、事务和现金兑换卡。 OOA实例12. 建立对象模型2)2)确定关联确定关联 两个或多个对象之间的相互依赖、相互作用的关系就是关联。分析确定关联,能促使分析员考虑问题域的边缘情况,有助于发现那些尚未被发现的类对象。在分析确定关联的过程中,不必花过多的精力去区分关联和聚集。事实上,聚集不过是一种特殊的关联,是关联的一个特例。 (1) (1) 初步确定关联初步确定关联 在需求陈述中使用的描述性动词或动词词组,通常表示关联关系。因此,在初步确定关联时,大多数关联可以通过直接提取需求陈述中的动词词组而得出。通过分析需求陈述,还能发现一些在陈述中隐含的关联。最后,分析员还应该与用户及领域专家讨论问题域实体间的相互依赖、相互作用关系,根据领域知识再进一步补充一些关联。OOA实例12. 建立对象模型2)2)确定关联确定关联(2 2)筛选)筛选 经初步分析得出的关联只能作为候选的关联,还需经过进一步筛选,以去掉不正确的或不必要的关联。筛选时主要根据下述标准删除候选的关联。已删去的类之间的关联与问题无关的或应在实现阶段考虑的关联瞬时事件三元关联派生关联(3 3)进一步完善)进一步完善 应该进一步完善经筛选后余下的关联,通常从下述几个方面进行改进:正名、分解、补充、标明阶数OOA实例12. 建立对象模型OOA实例1ATMATM系统原始对象图:系统原始对象图:2. 建立对象模型3 3)划分主题)划分主题 在开发大型、复杂系统的过程中,为了降低复杂程度,人们习惯于把系统再进一步划分成几个不同的主题,也就是在概念上把系统包含的内容分解成若干个范畴子系统。OOA实例12. 建立对象模型4 4)确定属性)确定属性 一般说来,确定属性的过程包括分析和选择两个步骤。 (1)分析: 属性的确定既与问题域有关,也和目标系统的任务有关。应该仅考虑与具体应用直接相关的属性,不要考虑那些超出所要解决的问题范围的属性。在分析过程中应该首先找出最重要的属性,以后再逐渐把其余属性增添进去。在分析阶段不要考虑那些纯粹用于实现的属性。(2)选择: 认真考察经初步分析而确定下来的那些属性,从中删掉不正确的或不必要的属性。通常有以下几种常见情况。 误把对象当作属性; 把链属性误作为属性; 把限定误当成属性; 误把内部状态当成了属性; 过于细化; 存在不一致的属性OOA实例12. 建立对象模型4 4)确定属性)确定属性AMT对象模型的属性OOA实例12. 建立对象模型5 5)识别继承关系)识别继承关系 确定了类中应该定义的属性之后,就可以利用继承机制共享公共性质,并对系统中众多的类加以组织。 一般说来,可以使用两种方式建立继承(即归纳)关系。 自底向上自底向上:抽象出现有类的共同性质泛化出父类,这个过程实质上模拟了人类归纳思维过程。 自顶向下自顶向下:把现有类细化成更具体的子类,这模拟了人类的演绎思维过程。 OOA实例12. 建立对象模型5 5)识别继承关系)识别继承关系 带有继承关系的ATM对象模型 OOA实例12. 建立对象模型5 5)评价、修正模型)评价、修正模型 仅仅经过一次建模过程很难得到完全正确的对象模型。事实上,软件开发过程就是一个多次反复修改、逐步完善的过程。在建模的任何一个步骤中,如果发现了模型的缺陷,都必须返回到前期阶段进行修改。由于面向对象的概念和符号在整个开发过程中都是一致的,因此远比使用结构化分析和设计技术更容易实现反复修改及逐步完善的过程。OOA实例1修正后的对象模型修正后的对象模型3. 建立动态模型建立动态模型的步骤:建立动态模型的步骤: 第一步,是编写典型交互行为的脚本。虽然脚本中不可能包括每个偶然事件,但是,至少必须保证不遗漏常见的交互行为。 第二步,从脚本中提取出事件,确定触发每个事件的动作对象以及接受事件的目标对象。 第三步,排列事件发生的次序,确定每个对象可能有的状态及状态间的转换关系,并用状态图描绘它们。 最后,比较各个对象的状态图,检查它们之间的一致性,确保事件之间的匹配。OOA实例13. 建立动态模型(1 1)编写脚本)编写脚本 所谓“脚本”,原意是指“表演戏曲、话剧,拍摄电影、电视剧等所依据的本子,里面记载台词、故事情节等”。在建立动态模型的过程中,脚本是指系统在某一执行期间内出现的一系列事件。脚本描述用户(或其他外部设备)与目标系统之间的一个或多个典型的交互过程,以便对目标系统的行为有更具体的认识。编写脚本的目的,是保证不遗漏重要的交互步骤,它有助于确保整个交互过程的正确性和清晰性。 编写脚本时,首先编写正常情况的脚本。然后,考虑特殊情况,例如输入或输出的数据为最大值(或最小值)。最后,考虑出错情况,例如,输入的值为非法值或响应失败。OOA实例13. 建立动态模型(1 1)编写脚本)编写脚本 ATM系统的正常情况脚本: ATM请储户插卡;储户插入一张现金兑换卡 ATM接受该卡并读它上面的分行代码和卡号 ATM要求储户输入密码;储户输入自己的密码“1234”等数字 ATM请求总行验证卡号和密码;总行要求“39”号分行核对储户密码,然后通知ATM说这张卡有效 ATM要求储户选择事务类型(取款、转账、查询等);储户选择“取款” ATM要求储户输入取款额;储户输入“880” ATM确认取款额在预先规定的限额内,然后要求总行处理这个事务;总行把请求转给分行,该分行成功地处理完这项事务并返回该账户的新余额 ATM吐出现金并请储户拿走这些现象;储户拿走现金 ATM问储户是否继续这项事务;储户回答“不” ATM打印账单,退出现金兑换卡,请储户拿走它们;储户取走账单和卡 ATM请储户插卡OOA实例13. 建立动态模型(1 1)编写脚本)编写脚本 ATM系统的异常情况脚本: ATM请储户插卡;储户插入一张现金兑换卡 ATM接受该卡并读它上面的分行代码和卡号 ATM要求储户输入密码;储户输入自己的密码“8888”等数字 ATM请求总行验证卡号和密码;总行要求“39”号分行核对储户密码,然后通知ATM拒绝这张卡 ATM显示“密码错”,并请储户重新输入密码;储户输入“1234”;ATM请总行验证后知道这次输入的密码正确 ATM请储户选择事务类型;储户选择“取款” ATM询问取款额;储户改变主意不想取款了,他敲“取消”键 ATM退出现金兑换卡,并请储户拿走它;储户拿走他的卡 ATM请储户插卡OOA实例13. 建立动态模型(2 2)设想用户界面)设想用户界面 OOA实例1ATM的界面格式3. 建立动态模型(3 3)画事件跟踪图)画事件跟踪图 完整、正确的脚本为建立动态模型奠定了必要的基础。但是,用自然语言书写的脚本往往不够简明,而且有时在阅读时会有二义性。为了有助于建立动态模型,通常在画状态图之前先画出事件跟踪图。为此首先需要进一步明确事件及事件与对象的关系。 OOA实例13. 建立动态模型(3 3)画事件跟踪图)画事件跟踪图 1) 确定事件 应该仔细分析每个脚本,以便从中提取出所有外部事件。事件包括系统与用户(或外部设备)交互的所有信号、输入、输出、中断和动作等。从脚本中容易找出正常事件,但是,应该小心仔细,不要遗漏了异常事件和出错条件。 传递信息的对象的动作也是事件。 经过分析,应该区分出每类事件的发送对象和接受对象。一类事件相对它的发送对象来说是输出事件,但是相对它的接受对象来说则是输入事件。有时一个对象把事件发送给自己,在这种情况下,该事件既是输出事件又是输入事件。 OOA实例13. 建立动态模型(3 3)画事件跟踪图)画事件跟踪图 1) 画事件跟踪图 从脚本中提取出各类事件并确定了每类事件的发送对象和接受对象之后,就可以用事件跟踪图把事件序列以及事件与对象的关系,形象、清晰地表示出来。事件跟踪图实质上是扩充的脚本。 在事件跟踪图中,一条竖线代表一个类&对象,每个事件用一条水平的箭头线表示,箭头方向从事件的发送对象指向接受对象。时间从上向下递增,也就是说,画在最上面的水平箭头线代表最先发生的事件,画在最下面的水平箭头线所代表的事件最晚发生。箭头线之间的间距并没有具体含义,图中仅用箭头线在垂直方向上的相对位置表示事件发生的先后,并不表示两个事件之间的精确时间差。OOA实例13. 建立动态模型(3 3)画事件跟踪图)画事件跟踪图 1) 画事件跟踪图OOA实例1ATMATM系统正常情况脚本系统正常情况脚本的事件跟踪图的事件跟踪图3. 建立动态模型(4 4)画状态图)画状态图 状态图描绘事件与对象状态的关系。当对象接受了一个事件以后,它的下个状态取决于当前状态及所接受的事件。由事件引起的状态改变称为“转换”。如果一个事件并不引发ATM系统正常情况脚本的事件跟踪图起当前状态发生转换,则可忽略这个事件。 通常,用一张状态图描绘一类对象的行为,它确定了由事件序列引出的状态序列。但是,也不是任何一个类&对象都需要有一张状态图描绘它的行为。很多对象仅响应与过去历史无关的那些输入事件,或者把历史作为不影响控制流的参数。对于这类对象来说,状态图是不必要的。系统分析员应该集中精力仅考虑具有重要交互行为的那些类。OOA实例13. 建立动态模型(4 4)画状态图)画状态图OOA实例1ATM类的状态图类的状态图总行类的状态图总行类的状态图3. 建立动态模型(4 4)画状态图)画状态图(5 5)审查动态模型)审查动态模型OOA实例1分行类的状态图分行类的状态图4. 建立功能模型(1)画出基本系统模型图 基本系统模型由若干个数据源点/终点,及一个处理框组成,这个处理框代表了系统加工、变换数据的整体功能。基本系统模型指明了目标系统的边界。由数据源点输入的数据和输出到数据终点的数据,是系统与外部世界之间的交互事件的参数。OOA实例1ATMATM系统的基本系统模型系统的基本系统模型4. 建立功能模型(2)画出功能级数据流图 把基本系统模型中单一的处理框分解成若干个处理框,以描述系统加工、变换数据的基本功能,就得到功能级数据流图。(3) 描述处理框功能 把数据流图分解细化到一定程度之后,就应该描述图中各个处理框的功能。应该注意的是,要着重描述每个处理框所代表的功能,而不是实现功能的具体算法。 描述既可以是说明性的,也可以是过程性的。OOA实例14. 建立功能模型对更新账户功能的描述 更新账户(账号,事务类型,金额)现金额,账单数据,信息 如果取款额超过账户当前余额,拒绝该事务且不付出现金 如果取款额不超过账户当前余额,从余额中减去取款额后作为新的余额,付出储户要取的现金 如果事务是存款,把存款额加到余额中得到新余额,不付出现金 如果事务是查询,不付出现金在上述任何一种情况下,账单内容都是:ATM号、日期、时间、账号、事务类型、事务金额(如果有的话)和新余额OOA实例1ATM系统的功能级数据流图系统的功能级数据流图5. 定义服务 在确定类中应有的服务时,既要考虑该类实体的常规行为,又要考虑在本系统中特殊需要的服务。(1) 常规行为(2) 从事件导出的操作(3) 与数据流图中处理框对应的操作 数据流图中的每个处理框都与一个对象(也可能是若干个对象)上的操作相对应。应该仔细对照状态图和数据流图,以便更正确地确定对象应该提供的服务。(4) 利用继承减少冗余操作 应该尽量利用继承机制以减少所需定义的服务数目。只要不违背领域知识和常识,就尽量抽取出相似类的公共属性和操作,以建立这些类的新父类,并在类等级的不同层次中正确地定义各个服务。OOA实例1图书管理系统1. 系统需求 在图书馆管理系统中,借阅者可以查阅图书馆所藏的图书、杂志、CD光盘,以及个人借阅图书的情况;图书管理员可以对借阅者借书和还书的请求作相应操作,对书刊进行管理和维护。OOA实例2图书管理系统2. 系统类图系统类图 OOA实例2图书管理系统2. 系统类图说明系统类图说明(1)类 图书管理系统中,共划分有8个类:Item(书目)、Title(标题)、BookTitle(图书)、JournalTitle(期刊)、CDTitle(随书CD光盘)、Reservation(预订信息)、Borrower(借书者信息)、Loan(借阅信息)。 (2)封装 一个矩形对应一个类。矩形将类名、属性、操作封装在一起。对外界而言,就是一个个矩形黑匣子,封装的技术将类实现的细节隐藏起来,使设计者能够将精力放在更高层的设计中,从而提高软件系统开发的效率。OOA实例2图书管理系统2. 系统类图说明系统类图说明(3)继承 继承是面向对象方法中的一个重要特征,它使得某类对象可以继承另外一类对象的特征和能力。 由于图书、期刊和光盘都是图书馆藏书的一种,它们都包含标题、作者等信息和查找等操作。因此,可以提取图书、期刊和光盘的共同特征,构造Title类,将Title作为父类,BookTitle、JournalTitle、CDTitle作为Title的子类,把共同的属性和操作放在父类Title中,而将各自不同的属性和操作放在BookTitle、JournalTitle、CDTitle等子类中。OOA实例2图书管理系统2. 系统类图说明系统类图说明(4)聚合关系 一个对象由若干个其他对象组合而成的一种包含关系,称为聚合关系。Title包含了Item。也就是说,一个标题可以包含多个书目,而一个书目必然属于一个标题。显然,这是一种1对多的关系。OOA实例2图书管理系统2. 系统类图说明系统类图说明(5)关联 系统中的类不是相互独立的个体,它们之间存在某种关联。其中,继承和聚合就是关联的特殊形式。继承是一般与特殊的关联,聚合是整体和部分的关联。 如Borrower类和Title类就是一般性关联,即它们间的预订关系。借书者可以在该标题没有相应书目时对该标题进行预订。每个借书者可以预订多个标题,每个标题也可以有多个借书者预订。这是一种多对多的关联。另外,Borrower类和Item类存在借阅的关联。在借书时,一个借书者可以借多个书目,但每个书目一次只能被一个借阅者借阅,因此,这一关联是1对多的。OOA实例2图书管理系统2. 系统类图说明系统类图说明(6)属性 属性用于刻画对象的状态,是对对象的细节描述。如Borrower类有姓名(Name)、读者号(UserID)、最大可借书量(Maxbook)、已借书量(BorrowNum)等属性;Title类有名称(Name)、作者名(Author)、图书号(ISBN)、该标题的书目数量(Number)等属性。在图6.2中,BookTitle、JournalTitle、CDTitle类虽然只定义了最大借阅时间(Maxtime),但由于它们是Title的子类,因此,还继承有Title类的所有属性。OOA实例2图书管理系统2. 系统类图说明系统类图说明(7)服务 服务就是操作,是对象拥有的行为。属性是对对象类的一种静态特征描述,而服务是对对象类动态特征的描述。如Borrower类有查询(find)、借阅(borrow)、还书(return)等操作;Title类有创建(Create)、删除(Destroy)、查找(FindOnTitle)等操作。BookTitle、JournalTitle、CDTitle类虽然没有定义操作,但继承了Title类中创建、删除、查找等操作。OOA实例2 第二部分第二部分 面向对象设计面向对象设计 Object-Oriented Design面向对象的设计方法面向对象的设计方法 面向对象设计(OOD)是对面向对象分析产生的逻辑结果进行设计,从面向对象的分析转到面向对象的设计是一个累进的模型扩充过程。 面向对象分析的各个层次(如对象、结构、主题、属性和服务)是对“问题空间”进行了模型化,而面向对象的设计则需要对一个特定的“实现空间”进行模型化,通过抽象、封装、继承性、消息通信、通用的组织法则、粒度和行为分类等途径控制设计的复杂性。 OOD的基本目标是改进设计、增进软件生产效率、提高软件质量以及加强可维护性。 有时也将两者合起来为OOAD。OOD系系统模型的模型的总体体结构构 四个部分对应目标系统的四个子系统,在不同的软件中,这四个部分的大小和重要程度可能差异较大,可以根据需要做出进一步的合并和分解。 PDC是针对总体进行的设计。 HIC给出实现人机交互需要的对象。 TMC提供协调和管理目标系统软件各个任务的对象。 DMC定义专用对象。 1、问题论域部分的设计(、问题论域部分的设计(PDC)面向对象分析(OOA)的结果恰好符合面向对象设计(OOD)的问题空间部分,因此,OOA的结果就是OOD部分模型中的一个完整部分。OOD要对OOA结果进行一些改进和增补。 复用设计:根据问题解决的需要,把从类库或其他来源得到的既存类增加到问题解决方案中去。 把问题论域相关的类关联起来:在设计时,从类库中引进一个根类,做为包容类,把所有与问题论域有关的类关联到一起,建立类的层次。把同一问题论域的一些类集合起来,存于类库中。 加入一般化类以建立类间协议:有时,某些特殊类要求一组类似的服务。在这种情况下,应加入一个一般化的类,定义为所有这些特殊类共用的一组服务名,这些服务都是虚函数。在特殊类中定义其实现。 调整继承支持级别:在OOA阶段建立的对象模型中可能包括有多继承关系,但实现时使用的程序设计语言可能只有单继承,甚至没有继承机制,这样就需对分析的结果进行修改。 改进性能:提高执行效率和速度是系统设计的主要指标之一。增加某些属性到原来的类中,或增加低层的类,以保存暂时结果,避免每次都要重复计算造成速度损失。 加入较低层的构件:在做面向对象分析时,分析员往往专注于较高层的类和对象,避免考虑太多低层的实现细节。但在做面向对象设计时,设计师在找出高层的类和对象时,必须考虑到底需要用到哪些较低层的类和对象。2、人机交互部分的设计(、人机交互部分的设计(HIC)通常在OOA阶段给出了所需的属性和操作,在设计阶段必须根据需求把交互的细节加入到用户界面的设计中,包括有效的人机交互所必需的实际显式和输入。如Windows、Pane、Selector等。人机交互部分的设计决策影响到人的感情和精神感受,设计HIC的策略由以下几点构成: 用户分类; 描述人及其任务的脚本; 设计命令层; 设计详细的交互; 继续做原型; 设计HIC类; 根据图形用户界面(GUI)进行设计。3、任务管理部分的设计(、任务管理部分的设计(TMC)在OOD中,任务是指系统为了达到某一设定目标而进行的一连串的数据操作(或服务),若干任务的并发执行叫做多任务。任务能简化并发行为的设计和编码,TMC的设计就是针对任务项,对一连串的数据操作进行定义和封装,对于多任务要确定任务协调部分,以达到系统在运行中对各项任务进行合理组织与管理。(1)TMC设计策略设计策略识别事件驱动任务。 事件驱动任务是指睡眠任务(不占用CPU),当某个事件发生时,任务被此事件触发,任务醒来做相应处理,然后又回到睡眠状态。 识别时钟驱动任务。按特定的时间间隔去触发任务进行处理,如某些设备需要周期性的数据采集和控制。 识别优先任务和关键任务。把它们分离开来进行细致的设计和编码,保证时间约束或安全性。 识别协调者。增加一个任务来协调诸任务,这个任务可以封装任务之间的协作。 审查每个任务,使任务数尽可能少。 定义每个任务:包括任务名、驱动方式、触发该任务的事件、时间间隔、如何通信等。(2)设计步骤)设计步骤对类和对象进行细化,建立系统的OOA/OOD工作表格。OOA/OOD工作表格包括:某系统可选定的对象的条目,对该对象在OOD部件中位置的说明和注释等。 审查OOA/OOD工作表格,寻找可能被封装在TM中那些与特定平台有关的部分以及任务协调部分、通信的从属关系、消息、线程序列等。 构建新的类。TM部件设计的首要任务就是构建一些新的类,这些类建立的主要目的是处理并发执行、中断、调度以及特定平台有关的一些问题。4、数据管理部分的设计(、数据管理部分的设计(DMC)数据管理部分提供了在数据管理系统中存储和检索对象的基本结构,包括对永久性数据的访问和管理。它分离了数据管理机构所关心的事项,包括文件、关系型DBMS或面向对象DBMS等。(1)数据管理方法主要有3种: 文件管理:提供基本的文件处理能力。 关系数据库管理系统(RDBMS):关系数据库管理系统建立在关系理论的基础上,它使用若干表格来管理数据,使用特定操作。 面向对象数据库管理系统(OODBMS):通常,面向对象的数据库管理系统以两种方法实现:一是扩充的RDBMS,二是扩充的面向对象程序设计语言。(2)数据管理部分的设计 数据存储管理部分的设计包括数据存放方法的设计和相应操作的设计。 数据存放设计数据存放有三种形式:文件存放方式、关系数据库存放方式和面向对象数据库存放方式,根据具体情况选用。 设计相应的操作为每个需要存储的对象及其类增加用于存储管理的属性和操作,在类及对象的定义中加以描述。通过定义,每个需要存储的对象将知道如何“存储我自己”。OOD的特点的特点OOD总体结构的基本思路是简单的,但是我们应当重视并理解它,对于学习和应用面向对象设计,养成良好的规范化设计风格,提高设计质量都有重要意义。详细地确定对象和类,是OOD的关键工作。一种有效的启发式方法是,对需要提供的服务和问题陈述作语法分析,其中,名词和名词短语可作为候选对象,动词可作为候选对象的服务,形容词可能表示子类关系。寻找对象的策略和方法不少,但设计经验和技巧是非常重要的。在分析和设计中,我们要注意遵循这样的原则:把由基本对象组装复杂对象或活动对象的过程与分解大粒度对象使系统细化过程相结合;把抽象化与具体化结合起来;把独立封装与继承关系结合起来等OOD的优良的判断条件的优良的判断条件OOD的关键工作是确定对象、类及其联系。一个优良的OOD应具备如下基本条件:(1)继承耦合应尽可能紧密耦合指一个软件结构内不同模块之间互连的紧密程度。继承是一般化类与特殊类之间耦合的一种形式,应该提高继承耦合程度。通过继承关系结合起来的基类和派生类之间的关系应该越紧密越好。 为获得紧密的继承耦合,特殊类应该确实是对它的一般化类的一种特殊具体化。因此,如果一个派生类摒弃了它基类的许多属性,则它们之间是松耦合的。在设计时应该使特殊类尽量多继承并使用其一般化类的属性和服务,从而更紧密地耦合到其一般化类。OOD的优良的判断条件的优良的判断条件(2)类与类之间的耦合应该很松散。如果一个软件系统内不同模块之间的耦合很松散,则系统中某一部分的变化对其他部分的影响会降到最低程度。在理想情况下,对某一部分的理解、测试或修改,无须涉及系统的其他部分。在面向对象方法中,类/对象是最基本的模块,因此类与类之间的耦合应该很松散。一般说来,类/对象之间的耦合可分为两大类:(i) 交互耦合尽可能松散对象之间的交互耦合通过消息连接来实现。为使交互耦合尽可能松散,应该遵守下述准则:a) 尽量降低消息连接的复杂程度。应该尽量减少消息中包含的参数个数,降低参数的复杂程度。b) 减少对象发送(或接收)的消息数。(ii) 继承耦合尽可能紧密OOD的优良的判断条件的优良的判断条件(ii) 继承耦合尽可能紧密 只有一个例外,类的继承关系必须是紧密联系的,因而子类与父类要紧密耦合。 (3)信息隐藏 某个类的数据实现细节对于别的类来说应该是隐藏的。(4)设计应该具有最优的可重用性 软件重用是提高软件开发生产率和目标系统质量的重要途径。重用的实现基本上从设计阶段开始。 最优的可重用性有两方面的含义: 一是尽量使用已有的类(包括开发环境提供的类库,及以往开发类似系统时创建的类); 二是如果确实需要创建新类,则在设计这些新类的协议时,应该考虑将来的可重复使用性。OOD的优良的判断条件的优良的判断条件(5)尽力使类、对象和方法的定义具有简单性; (6)对所设计的类和类族,应注意保持其协议或接口的稳定性; (7)类的层次结构设计规模适度,不要太深或太浅; (8)系统整体规模的最小化。复杂对象的设计复杂对象的设计 多媒体系统和工程系统的面向对象程序设计中,常常需要定义复杂对象及其联系,对其描述往往导致多层次对象(类)的定义。对象模型的结构设计,要注意以对象本身的自然表达方式为出发点,将对象按照结构层次、功能性质和操作行为划分成不同的类,建立所有类的有向无环图。 一般地讲,复杂对象具有多种数据结构,可分解为多层次低层对象,或者是不同层次的部件,每个部件对象又可参与其它对象的构成,为多方共享,还可按照各种特性定义相应地归入不同的类。复杂对象的设计复杂对象的设计 概念设计的目的就在于定义抽象对象之间的关系结构。常用的方法如下: 分类 分类是见将具有相同属性和行为的对象分成一组。如何选择模拟分类是设计中的一个焦点,这要同系统的总体规划设计一起统筹安排。 概括 概括是从某些具有共性的对象或类中抽象出高一层次的类。反之,由高层次类可以衍生出低层次的对象或子类。即高层是低层的泛化,低层是高层的特化,或实例化。例如,对苹果、梨、香蕉、柑橘.,可概括为一个对象类-水果,这是一种语义概括。 复杂对象的设计复杂对象的设计聚集 聚集是用有联系的成分对象构造抽象层次更高的对象,表示一个对象可从结构上划分为多个部分(部件),是“拥有”或“由.组成”联系,即“整体-部分”关系。这种结构划分可以逐层细化,形成类的层次结构。在设计时,聚集类的命名往往用联系中的动名词。例如,甲地、乙地、汽车、货物,其联系是汽车在甲地到乙地之间运货物,这四个对象成分的聚集对象,可命名为“运输”;其中,汽车和货物又可进一步分类。面向对象的建模与UML语言1. 统一建模语言的产生和发展2. UML的结构UML的语义UML的表示法3. UML的图用例图表态图行为图交互图实现图4. UML的应用领域需求分析分析设计构造测试UML定义的图图图结构图结构图行为图行为图交互图交互图类图类图构件图构件图对象图对象图活动图活动图用况图用况图状态机图状态机图部署图部署图顺序图顺序图通讯图通讯图组合结构图组合结构图包图包图交互概览图交互概览图定时图定时图UML定义的图图名功能备注类图描述类、类的特性以及类之间的关系UML 1原有对象图描述一个时间点上系统中各个对象的一个快照UML 1非正式图复合结构图描述类的运行时刻的分解UML 2.0新增构件图描述构件的结构与连接UML 1原有部署图描述在各个节点上的部署UML 1原有包图描述编译时的层次结构UML中非正式图用例图描述用户与系统如何交互UML 1原有活动图描述过程行为与并行行为UML 1原有状态机图描述事件如何改变对象生命周期UML 1原有顺序图描述对象之间的交互,重点在强调顺序UML 1原有通信图描述对象之间的交互,重点在于连接UML 1中的协作图定时图描述对象之间的交互,重点在于定时UML 2.0 新增交互概观图是一种顺序图与活动图的混合UML 2.0新增 第三部分第三部分 面向对象程序设计面向对象程序设计Object-Oriented Programming 附录附录1:数据流图:数据流图 Data Flow Diagram系统结构特征可归纳为两种典型形式:系统结构特征可归纳为两种典型形式:变换型结构变换型结构事务型结构事务型结构数据流图可分为两种类型:数据流图可分为两种类型: 变换型数据流变换型数据流事务型数据流事务型数据流(1 1)数据流图的类型)数据流图的类型变换变换中心中心输入输入输出输出 变换型变换型 结构结构事务事务中心中心接受接受路径路径动动作作路路径径 基本模型 特征特征 事务型事务型结构结构 由输入、变换中心和输出三部分组成 具有在多种事具有在多种事务中选择执行务中选择执行某类事务的能某类事务的能力力变换流示意图变换流示意图信息信息时间时间输入流输入流输出流输出流交换流交换流变换型变换型数据流数据流结构结构传入传入变换变换传出传出变换变换中心中心传入传入部分部分传出传出部分部分事务事务分析分析事务事务中心中心动作动作 1 1动作动作 2 2动作动作 3 3接受接受接受接受部分部分事务型事务型数据流数据流结构结构变换型数据流举例变换型数据流举例输入输入信息信息物理物理输入输入格式格式检查检查处理处理显示显示正确正确信息信息结果结果物理物理输出输出数据数据变换中心变换中心逻辑逻辑输入输入逻辑逻辑输出输出传入部分传入部分传出部分传出部分特点:具有明确的传入、变换特点:具有明确的传入、变换特点:具有明确的传入、变换特点:具有明确的传入、变换( ( (或称主加或称主加或称主加或称主加 工工工工) ) ) ) 和传出界面的和传出界面的和传出界面的和传出界面的DFDDFD变换型系统结构图变换型系统结构图变换型数据处理问题的工作过程大致分为变换型数据处理问题的工作过程大致分为变换型数据处理问题的工作过程大致分为变换型数据处理问题的工作过程大致分为三步,即取得数据,变换数据和给出数据。三步,即取得数据,变换数据和给出数据。三步,即取得数据,变换数据和给出数据。三步,即取得数据,变换数据和给出数据。相应于取得数据、变换数据、给出数据,相应于取得数据、变换数据、给出数据,相应于取得数据、变换数据、给出数据,相应于取得数据、变换数据、给出数据,变换型系统结构图由输入、中心变换和输出等变换型系统结构图由输入、中心变换和输出等变换型系统结构图由输入、中心变换和输出等变换型系统结构图由输入、中心变换和输出等三部分组成。三部分组成。三部分组成。三部分组成。事务型系统结构图事务型系统结构图它接受一项事务,根据事务处理的特点和它接受一项事务,根据事务处理的特点和它接受一项事务,根据事务处理的特点和它接受一项事务,根据事务处理的特点和性质,选择分派一个适当的处理单元,然后给出性质,选择分派一个适当的处理单元,然后给出性质,选择分派一个适当的处理单元,然后给出性质,选择分派一个适当的处理单元,然后给出结果。结果。结果。结果。在事务型系统结构图中,事务中心模块按在事务型系统结构图中,事务中心模块按在事务型系统结构图中,事务中心模块按在事务型系统结构图中,事务中心模块按所接受的事务的类型,选择某一事务处理模块执所接受的事务的类型,选择某一事务处理模块执所接受的事务的类型,选择某一事务处理模块执所接受的事务的类型,选择某一事务处理模块执行。各事务处理模块并列。每个事务处理模块可行。各事务处理模块并列。每个事务处理模块可行。各事务处理模块并列。每个事务处理模块可行。各事务处理模块并列。每个事务处理模块可能要调用若干个操作模块,而操作模块又可能调能要调用若干个操作模块,而操作模块又可能调能要调用若干个操作模块,而操作模块又可能调能要调用若干个操作模块,而操作模块又可能调用若干个细节模块。用若干个细节模块。用若干个细节模块。用若干个细节模块。事务型数据流图举例事务型数据流图举例A AB BE EH HO OM MI ID DC CN NL LF FG G确定DFD中是否含有事务流T事务.事务流:沿多条路径之一触发的数据流事务中心动作路径在一个大系统的DFD中,变换流和事务流可能是同时出现的事务映射方法事务映射方法接收路径C路径B路径A路径C1C2C3调度事务控制 大型系统大型系统DFDDFD中中, ,变换型和事务型变换型和事务型 结构往往共存结构往往共存: :T T事务中心事务中心传入传入变换变换传出传出(2) (2) 面向数据流设计方法的设计步骤面向数据流设计方法的设计步骤(Page91)(Page91)精化精化DFDDFD确定确定DFDDFD类型类型把把DFDDFD映射到系统模块结构设计映射到系统模块结构设计 出模块结构的上层出模块结构的上层基于基于DFDDFD逐步分解高层模块设计逐步分解高层模块设计 出下层模块出下层模块根据模块独立性原理,精化模根据模块独立性原理,精化模 块结构块结构面向数据流方法的面向数据流方法的设计过程设计过程精化数据流图精化数据流图区分事务中心区分事务中心区分事务中心区分事务中心和数据接收路径和数据接收路径和数据接收路径和数据接收路径映射成变换结构映射成变换结构区分输入和区分输入和区分输入和区分输入和输出分支输出分支输出分支输出分支映射成事务结构映射成事务结构用启发式设计规则精化软件结构用启发式设计规则精化软件结构用启发式设计规则精化软件结构用启发式设计规则精化软件结构导出接口描述和全程数据结构导出接口描述和全程数据结构导出接口描述和全程数据结构导出接口描述和全程数据结构详细设计详细设计事务分析事务分析变换分析变换分析复查复查事务事务变换变换流类型流类型
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号