[理学]第7章面向对象开发方法与UML.ppt_第1页
[理学]第7章面向对象开发方法与UML.ppt_第2页
[理学]第7章面向对象开发方法与UML.ppt_第3页
[理学]第7章面向对象开发方法与UML.ppt_第4页
[理学]第7章面向对象开发方法与UML.ppt_第5页
已阅读5页,还剩110页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第7章 面向对象开发方法与UML,7.1 面向对象开发方法 7.2 标准建模语言(UML)简介 7.3 UML静态建模机制简介 7.4 UML动态建模机制简介 习题,7.1 面向对象开发方法,20世纪70年代末至80年代初,计算机应用领域日渐扩大,系统软件和应用软件的需求日益多样化,系统规模日益膨胀,传统的结构化分析方法和面向过程的编程技术已无法给予有效的支持,导致软件的生产方式和效率远远赶不上信息化社会发展的需要。人们开始寻找和研究新的方法和技术,面向对象方法和技术应运而生。 面向对象(OO,Obeject Orient)方法和技术起源于面向对象的程序设计语言(OOPL)。20世纪80年代以来,出现了大批OOPL,其实用性、效率不断提高,OO技术开始走向繁荣和实用化。,面向对象方法适合于解决分析与设计期间的复杂性,实现分析与设计的复用。从20世纪80年代中期开始,面向对象技术的焦点逐渐从程序设计转移到软件工程的其他阶段,面向对象分析与设计(OOA和OOD)技术得到了快速的发展,初步形成新的方法论和开发技术。 近年来又出现了一些新的高级技术,例如面向对象数据库、对象分布、对象总线、面向对象的系统框架构造以及面向对象的系统集成等。,7.1.2 面向对象方法的基本思想 传统的结构化开发方法用过程化方式描述应用系统,而面向对象方法认为客观世界是由各种各样的对象组成的,每个对象都有各自的内部状态和运动规律,不同对象之间通过消息传送相互作用和联系就构成了各种不同的系统。 将对象模型映射到计算机上,面向对象方法将软件系统看成是一系列对象的集合,并强调描述对象性质的数据及行为的紧密联系数据和行为的封装技术。例如,学籍管理系统可以看成是由学生、教师、课程、各种规章制度等多个彼此独立而又相互关联的对象集合而成的。,面向对象的本质是确定动作的主体在先,而执行动作在后,这种面向对象的模式称为“主体动作”模式。例如,学生总是先选定某门课程,然后才去考虑如何学好这门课程。而在窗口系统的界面上,总是先选定一个界面对象(图标或按钮),然后在其上进行相应的操作(例如移动、单击等)。 反映面向对象本质的“主体动作”模式是与人们对客观世界的认识规律相符合的。因此,采用对象的观点看待所要解决的问题,并将其抽象为系统是极其自然与简单的,符合人类的思维习惯,应用系统也更容易被理解。“主体动作”模式的特点是将对象作为软件系统结构的基本组成单元,以主体数据为中心,对数据和作用在数据上的操作进行封装,以标准接口对外提供服务。,7.1.3 面向对象的基本概念 1. 对象(Object) 对象是客观世界中事物在计算机领域中的抽象,是一组数据(描述对象的特性或属性)和施加于该组数据上的一组操作(行为)组成的集合体。 例如,Windows系统中窗口上的一个文本框对象包含有外部名(Name)、字体(Font)、数据源(Data Source)、前景颜色(Fore Color) 、高度和宽度(Height、Width)等多种属性,同时还带有单击左键(Click)、双击左键(Double Click)、修改文本(Change)等多个操作。,对象的属性可以是简单数据类型、结构数据类型,也可以是复杂数据类型(另一个对象)。例如,公司是对象,公司中包含有员工这一属性,而员工本身又是一个对象。 从系统的观点出发,可以给对象作如下定义:对象是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位,一个对象是由一组属性和对这组属性进行操作的一组服务构成的。属性是用来描述对象静态特征的一个数据项,也叫对象特性;服务是用来描述对象动态特征(行为)的一个操作;属性和操作称为对象的性质。,当系统运行时,系统中的对象显现出其动态特征,即对象内部状态的转换和对象间的相互作用,例如,A对象向B对象传送一个消息,这一消息附带的一个事件可能导致B对象被激发或B对象由于执行某一传送方所要求的操作,改变了某些内部属性值,从而由一个状态转入另一个状态(对象的一个状态是由某些内部属性值构成的)。 在面向对象系统中,对象之间的相互作用是通过消息传送来进行的。消息是向对象发出的服务请求,它应该含有下述信息:提供服务的对象标识、服务标识、输入信息和回答信息。消息通常由接收对象(提供服务的对象标识)、调用操作名(服务标识)以及必要的参数等三部分组成。,消息的接收者是提供服务的对象,在设计该对象时,它对外提供的每个服务应规定消息的格式消息协议。消息的发送者是要求服务的对象或其他系统成分,在每个发送点上,需要按服务方规定的消息协议写出一个完整的消息。,一个对象在映射为软件实现时由三个部分组成: (1) 私有的数据结构。它用于描述对象的内部状态。 (2) 处理,称为操作或方法。它是施加于数据结构之上的。 (3) 接口。这是对象可被共享的部分,消息通过接口调用相应的操作。接口规定哪些操作是允许的;它不提供操作是如何实现的信息。,客观世界的同一对象在不同的应用系统中,由于考察对象的角度不同,对其抽象的数据结构和操作都可能是不同的。例如,对于一个学生,在学籍管理系统与户籍管理系统两个不同的应用系统中,抽象出的表示内部状态的数据结构和对数据结构进行的操作都是不同的。因此,在对实际应用系统中的对象进行分析时应注意该系统的要求,区分哪些是该对象的本质特征。,2. 类与实例 把具有共性的一些事物归为一类,是人们认识客观世界和分析问题的一般方法。这里的共性是指事物的本质特征,分类实际上是一种抓住事物的本质而忽略一些无关紧要的细节的抽象过程,图7.1就是从各种自行车到自行车类的抽象。,图7.1 各种自行车到自行车类的抽象,同样,采用面向对象方法进行系统分析与设计时,对于一个具体的系统而言,可能存在很多具有相同特征的对象。例如,对于一个学籍管理系统,存在许多学生对象,它们具有相同的结构特征和行为特征,只是表示内部状态的数据值不同。为了描述这种相同结构特征和行为特征的对象,面向对象方法引入了类的概念。 类是一组具有相同性质(属性和操作)的对象的抽象,或者说类是具有相同属性和服务的一组对象的集合,它为属于该类的全部对象提供了统一的抽象描述,其内部包括属性和服务两个主要部分。,类是对一组具有相同特征的对象的抽象描述,所有这些对象都是这个类的实例。对于学籍管理系统,学生是一个类,而一个具体的学生则是学生类的一个实例。一个类的不同实例具有相同的操作或行为的集合和相同的信息结构或属性的定义,但属性值可以不同;不同的实例具有不同的对象标识。对于学生类中的每一个对象,描述它们所使用的数据结构相同,但是其值不同。因此,一个类的定义至少包含以下两个方面的描述: (1) 该类所有实例的属性定义或结构定义; (2) 该类所有实例的操作(或行为)的定义。,7.1.4 面向对象系统的特性 一个对象具有抽象、继承性、封装性和多态性等特性,要构造一个性能优越的面向对象系统必须充分利用面向对象方法的这些特性。 1. 抽象 所谓抽象,是指在分析问题时,强调实体的本质、内在属性而忽略一些无关紧要的细节。抽象是分析问题的基本方法。,在系统开发的整个过程中,尤其在分析阶段,抽象具有特别重要的意义,其作用如下: (1) 使用抽象仅仅涉及到应用域的概念而不必涉及问题域的求解,因此可以尽可能避免过早地考虑实现的细节。 (2) 合理地使用抽象,可以在分析、高级设计以及文档化等阶段和过程中使用统一模型(对象模型)。 (3) 抽象可以帮助我们明确对象是什么、对象做什么而不必考虑对象怎么做。 对象怎么做属于编程方面的细节,可以延迟到开发的最后阶段物理设计阶段去实现。,2. 继承性 面向对象思想采纳了事物分类的层次思想,在描述类的时候,某些类之间具有结构和行为的共性。例如,教师类与学生类在结构方面均具有姓名、年龄、身高、体重等共性,在行为(或操作)方面均具有回答身高、回答体重等操作。将这些共性抽取出来,形成一个单独的类人,描述教师类和学生类中的共性。类人的结构特征和行为特征可以被多个相关的类共享。例如,教师类和学生类继承了类人的结构和行为特征。一个教师类的对象与一个学生类的对象都具有类人所描述的特征,同时又具有各自所属教师类和学生类独有的特征。此时类人称为教师类和学生类的父类,而学生类和教师类为类人的子类。,上面例子中的类人也可以称为教师类和学生类的一般类,而教师类和学生类为类人的特殊类。面向对象方法中一般类和特殊类的定义是:如果类A具有类B的全部属性和服务,而且具有自己特有的某些属性或服务,则类A叫做类B的特殊类,类B叫做类A的一般类。 利用类之间的继承关系,可以简化对类的描述。在类人中描述教师类和学生类的共性,而在学生类和教师类中只需描述各自的个性。,利用继承机制可以提高软件代码的可重用性。在设计一个新类时,不必从头设计编写全部的代码,可以通过从已有的具有类似特性的类中派生出一个类,继承原有类中的部分特性,再加上所需的新特性。 这一点与面向过程的设计语言中的过程或函数不同,要使用具有相似功能的过程或函数必须修改源程序代码以使其适应新系统的功能需求,而类的派生机制无须原有类的源代码即可派生出新的类。,利用类及其继承性描述系统时,由于类之间的继承关系,可能会形成一种具有层次性的类结构。在使用类的层次结构描述系统时,某些类之间的层次关系可以有多种实现方案。例如,中学生类既可以直接从类人派生出来,也可以从类人的派生类中学生类派生出来。在设计类的层次结构时,应注意建立的类层次结构是否易于理解以及组织类结构的费用等方面的问题。设计出来的类层次结构是否合理,往往取决于系统分析员的经验等因素。,另外,人们在对客观世界的事物分类时,一个事物可能属于多个类,同时具有多个类的特性。例如一个黑人学生,他既属于学生类,又属于黑人类。这种情形在面向对象方法中称为多继承,即一个类同时从多个类中派生出来,此时类的层次结构是网状的。多继承在有些面向对象的程序设计语言中是不允许的。只允许派生类有一个基类称为单继承,单继承的类层次结构是树状的。,3. 多态性 多态性是面向对象系统的又一重要特性。所谓多态,是指一个名词可具有多种语义。在面向对象方法中,多态并不是指一个对象类有多种形态或状态,而是指同一个操作在不同的类中有不同的实现方法和不同的执行结果。例如,图7.2中的图形类和其子类圆类、点类中都定义了显示和隐藏操作,图形类中的显示和隐藏并不确定到底显示或隐藏何种图形,但子类中的显示和隐藏就涉及到具体应该显示或隐藏何种图形,并且所显示的图形显然是不一样的。这就是显示和隐藏这两个操作体现出来的多态性。其特点是源于继承而并非简单的继承,必须有不同的表现。,图7.2 多态性的例子,多态性不仅仅局限于操作,同一个属性在不同的对象类中也可以具有不同的数据类型,即属性的多态性。 综上所述,多态性可定义为:“一个类中定义的属性或操作被继承之后,可以具有不同的数据类型或表现出不同的行为。这使得同一属性或操作在父类和子类(或子类的子类,可多次继承)中具有不同的语义。”,就图7.2中的例子而言,当外部的某个对象调用图形对象的显示操作时,无须考虑该操作具体对应多少种实现方法,即该对象发出的请求服务的消息中只须写上“显示”,究竟对应哪个显示由图形类的操作自动识别,并传给对应的子类,由子类去执行不同的显示操作,这也称为“动态绑定”。,4. 封装性 封装是一种信息隐藏技术,对象内部对用户是隐藏的,不可直接访问;用户只能见到对象封装界面上的信息,通过对象的外部接口访问对象。用户向对象发送消息,对象根据收到的消息调用内部方法作出响应。 封装的目的在于将对象的使用者和设计者分开,使用者无须知道对象内部实现的细节,只需要知道对象接收的消息。,封装的定义为: (1) 一个清楚的边界。所有对象的内部软件的范围被限定在这个边界内。 (2) 一个接口。该接口用以描述这个对象和其他对象之间的相互作用。 (3) 受保护的内部实现。这个实现给出了由软件对象提供的功能的实现细节,实现细节不能在定义这个对象的类的外面访问。,因为封装技术强调客观实体的内在属性和服务(操作)的不可分割性以及内部信息的隐蔽,自然而然就增加了系统中对象的相对独立性,减少了它们之间的相互依赖,同时也增加了其应用的灵活性。,封装可以保证对象的界面清晰、简单,防止由于模块之间的相互依赖所带来的变动的相互影响。在非面向对象的系统中,如果某个函数的某些参数改变了(类型、个数等),或者某些非私有数据改变了,即使函数的外部功能没有改变,都要求调用该函数的其他模块必须随之作相应的改变,否则后果不堪设想。因为调用者可能会直接操纵被调用者中改变了的这些数据。相反,面向对象的封装性不允许一个对象直接操纵另一个对象的数据,即调用者无须知道被调用者的内部实现细节,所以只要外部功能没变,就不存在上述变动的相互影响。就比如甲、乙两人互传电子邮件,双方关心的是内容和格式是否符合要求,而不是电子邮件的素材、编辑工具以及传送方式。,对象的封装特性可以提高模块之间的独立性,使得系统易于调试和维护。封装使得一个对象可以像一个可插接的部件一样用在各种程序中,就像一种集成块可以用在不同的电路中一样。,7.1.5 面向对象的设计方法 采用面向对象方法进行系统开发的首要任务是采用面向对象的概念及其抽象机制将开发的系统对象化和模型化,建立应用系统模型,然后使用面向对象的程序设计语言来实现系统中的对象。尽管面向对象的概念早已出现,但直到20世纪80年代初还没有人能给出一种方法,用以实现面向对象的设计。20世纪80年代以后,面向对象设计的设计方法取得了逐步进展。下面我们介绍由Booch提出的面向对象设计的步骤:,(1) 定义问题。 (2) 为真实世界问题域的软件实现开发一个不严格的概括描述。 (3) 按以下子步骤把方法严格化: 弄清对象及其属性; 弄清可能被施于对象的操作; 利用表达对象与操作的关系建立每个对象的接口; 决定详细设计问题,从而给出对象的实现描述。 (4) 递归地重复步骤(1)、(2)和(3),以得到完整的设计。,以上步骤中,前面两步工作实际上是属于软件需求分析的范畴,相当于我们在需求分析阶段得到的规格说明书。 面向对象设计方法将数据设计、结构设计和过程设计三类设计元素结合起来。为了弄清对象,产生了数据抽象;借助定义抽象,描述了模块,软件的结构也就建立起来了;靠开发使用对象的机制(如生成消息),接口得到了描述。,下面对Booch提出的面向对象设计的各步骤作一简单的介绍。 1. 问题定义 这里的问题定义是需求分析的另一种说法,此步骤中系统分析人员和设计人员应完成两项必不可少的工作: (1) 描述问题本身; (2) 分析并说明已知的限制。 无论现实问题的大小和复杂性如何,其软件实现都应以语法正确的简单语句来描述,通过它应该让承担项目的软件工程师对问题有一个确切的、惟一的理解。,2. 概括描述 面向对象的设计的下一步是根据问题描述中给出的问题的解写出不十分严格的概括描述。这种概括描述具有以下几个特点: (1) 它是简明易懂的一段文字描述; (2) 它所涉及的对象具有同一级抽象的特点,即其详细程度在概括描述中保持一致; (3) 它应主要表达为解决问题必须要做什么,而不是如何得到解的过程; (4) 无须包括需求分析过程中所涉及的全部信息。,概括描述的好坏可由提出一个问题来加以判断:“假如严格遵循概括描述实现解答,问题能得到解决吗?” 概括描述应尽可能重复使用相同的术语来描述同一件事物,避免使用同义词。此外,为便于理解,应注意不要使用过分专业化的名词。,3. 形式化处理 面向对象的设计经过前面的分析和描述后,到此实际上才展开。如前所述,形式化处理分为如下四个子步骤。 1) 标识对象及其属性 弄清对象是面向对象设计的核心问题,标识对象可以从应用系统的概括描述中的名词来导出。在这一步应把注意力集中在如何将概括描述中所含的名词和名词短语分离出来。对象标识出来后,还应注意对象之间的类似之处,以建立对象类。,2) 标识每个对象所要求的操作和提供的操作 这一步必须标识出该对象执行的功能,这些功能描述了每个对象的行为。例如,窗口被打开、关闭、缩放和滚动等。同时还应关心由其他对象提供给它的操作,因为通过标识这些操作有可能导出新对象。 3) 建立对象之间的联系和每个对象的接口 这一步建立对象和对象类之间的联系,标识出每一个对象都与什么对象和对象类有关。这一步中可能找出一些对象的模式,并决定是否要建立一个新类以表示这些对象的共同行为特性。,4) 建立每个对象的接口 识别出系统中的对象和类以后,还应该识别出对象之间的相互作用,即对象的外部接口。在面向对象系统中,对象和对象之间的联系是通过消息的发送和响应来完成的。 一旦对象、对象的操作、数据和对象间交互作用被了解,对象的实现就很容易用某种面向对象的语言来完成。面向对象设计方法是以上步骤反复进行,直到建立起完整软件设计的过程。 上面介绍的Booch的步骤是一种松散的、不十分严格的方法。其他一些主要的面向对象的设计技术还有Rumbaugh提出的一种称为“对象模型技术OMT”的设计方法、Alabiso提出的基于数据流分析的面向对象设计技术等。,7.2 标准建模语言(UML)简介,7.2.1 UML概述 面向对象的分析与设计方法的发展在20世纪80年代末至90年代中期出现了一个高潮,UML是这个高潮的产物。它统一了Booch、Rumbaugh等的表示方法,并且对其作了进一步的发展,最终统一为大众所接受的标准建模语言。,1. 标准建模语言UML的发展历史 早期的面向对象建模语言出现于20世纪70年代中期,到90年代初,数量从不到10种增加到了50多种。虽然不同建模语言的创造者都努力推崇自己的产品,并在实践中不断完善,但是由于用户并不了解不同建模语言的优缺点及相互之间的差异,因而很难根据应用特点选择合适的建模语言,于是爆发了一场“方法大战”。90年代中期,一批新方法出现了,其中最引人注目的是Booch 1993、OOSE和OMT-2等。,Booch是面向对象方法最早的倡导者之一,他提出了面向对象软件工程的概念。1991 年,他将以前面向Ada的工作扩展到整个面向对象设计领域。Booch 1993比较适合于系统的设计和构造。 Rumbaugh等人提出了面向对象的建模技术(OMT)方法,采用了面向对象的概念,并引入各种独立于语言的表示符。这种方法用对象模型、动态模型、功能模型和用例模型来共同完成对整个系统的建模,所定义的概念和符号可用于软件开发的分析、设计和实现的全过程。软件开发人员不必在开发过程的不同阶段进行概念和符号的转换。OMT-2特别适用于分析和描述以数据为中心的信息系统。,Jacobson于1994年提出了OOSE方法,其最大特点是面向用例(Use-Case),并在用例的描述中引入了外部角色的概念。用例的概念是精确描述需求的重要武器,贯穿于整个开发过程,包括对系统的测试和验证。OOSE比较适合支持商业工程和需求分析。 另外,还有Coad/Yourdon方法,即著名的OOA/OOD,它是最早的面向对象的分析和设计方法之一。该方法简单、易学,适合于面向对象技术的初学者使用,但由于该方法在处理能力方面的局限,目前已很少使用。,虽然不同的建模语言大多类同,但仍存在某些细微的差别,妨碍了用户之间的交流。因此,有必要在精心比较不同的建模语言优缺点及总结面向对象技术应用实践的基础上,根据应用需求,求同存异,统一建模语言。 1994年10月,Grady Booch和Jim Rumbaugh开始致力于这一工作。1995年秋,OOSE 的创始人Ivar Jacobson加盟到这一工作。第一个公开版本,称为统一方法UM 0.8(Unitied Method)。1996年6月和10月又分别发布了两个新的版本,即UML 0.9和UML 0.91,并将UM重新命名为UML(Unified Modeling Language)。,1996年成立了UML成员协会,以完善、加强和促进UML的定义工作。当时的成员有DEC、HP、I-Logix、Itellicorp、IBM、ICON Computing、MCI Systemhouse、Micr osoft、Oracle、Rational Software、TI以及Unisys等。这一机构对UML 1.0(1997年1月)及UML 1.1(1997年11月17日)的定义和发布起了重要的促进作用。图7.3描述了UML的发展历程。,图7.3 UML的发展历程,UML是一种定义良好、易于表达、功能强大且普遍适用的建模语言。它融入了软件工程领域的新思想、新方法和新技术,支持从需求分析开始的软件开发的全过程。 UML融合了Booch、OMT和OOSE等方法中的基本概念,但又不仅仅是上述方法的简单汇合,而是在这些方法的基础上集众家之长,几经修改而完成的,它扩展了现有方法的应用范围。 UML已获得了工业界、科技界和应用界的广泛支持,已有700多个公司表示支持采用UML作为建模语言,它已成为可视化建模语言事实上的工业标准。1997年11月17日,OMG组织采纳UML 1.1作为基于面向对象技术的标准建模语言。UML代表了面向对象方法的软件开发技术的发展方向,具有巨大的市场前景,也具有重大的经济价值和国防价值。,2. 标准建模语言UML的主要特点 标准建模语言UML的主要特点可以归结为三点: (1) UML统一了Booch、OMT和OOSE等方法中的基本概念。 (2) UML还吸取了面向对象技术领域中其他流派的长处,其中也包括非OO方法的影响。UML符号考虑了各种方法的图形表示,删掉了大量易引起混乱的、多余的和极少使用的符号,也添加了一些新符号。因此,在UML中汇入了面向对象领域中很多人的思想。,(3) UML在演变过程中还提出了一些新的概念。在UML标准中新加了构造型(Stereotypes)、职责(Responsibilities)、扩展机制(Extensibility Mechanisms)、线程(Threads)、过程(Processes)、分布式(Distribution)、并发(Concurrency)、模式(Patterns)、协作图(Collaborations)、活动图(Activity Diagram)等新概念,并清晰地区分类型(Type)、类(Class)、实例(Instance)、细化(Refinement)、接口(Interfaces)和组件(Components)等概念。,UML以面向对象图的方式来描述任何类型的系统,具有很宽的应用领域。最常用的是建立软件系统的模型,但它同样可以用于描述非软件领域的系统。UML适用于系统开发过程中从需求规格描述到系统完成后测试的不同阶段。如何恰当地将这种可视化图形建模技术用于解决软件开发所面临的问题,如何研制和开发支持UML的建模过程及其支持环境,仍是目前该领域的热点问题。 目前,在基于UML的开发方法和环境方面,国际上已经进行了一些研究和实际开发工作。Rational公司目前正致力于推广统一开发过程(RUP,Rational Unified Process),研究期称为Objectory),支持UML建模。国内对UML支持环境的研制开发工作尚处于起步阶段。,7.2.2 基于UML的软件开发方法 基于UML的系统开发有五个阶段:需求分析、分析、设计、编码和测试。 1. 需求分析阶段 UML语言采用用例来捕获客户的需求。通过用例模型,可以使那些对系统感兴趣的外部参与者与他们要求系统具备的功能(即用例)一起被建模。外部参与者和用例之间是通过关系建模的,并允许相互之间存在通信关联,或者被分解为更具体的层次结构。参与者和用例由UML的用例图描述,在用例图中参与者被称为执行者或角色(Actor)。每一个用例都是用文本进行描述的,它确定了客户的需求,即在不考虑功能如何实现的情况下客户所企盼的功能。,2. 分析阶段 分析阶段所关注的是出现在问题域中的主要抽象(类和对象)和机制。被建模的类以及类之间的关系在UML的类图中被明确指定和描述。为了实现用例,各类之间需要相互协作。这种协作由UML中的动态模型描述。在分析阶段,只有在问题域(现实世界的概念)中的类才被建模,不包括那些在软件系统中定义了细节和解决方案的技术类,如用户界面类、数据库类、通信类等。,3. 设计阶段 在设计阶段,分析阶段的结果被扩展为一个技术解决方案。新类被加入进来,以提供以下一些基础结构:用户界面、处理对象存储的数据库、与其他系统的通信、与系统各种设备的接口等。在分析阶段获得的问题域中的类被“嵌入”到此技术基础结构中,这样就能够同时改变问题域和基础结构。设计阶段将为随后的构建阶段产生详细的规格说明。,4. 编码阶段 在编码阶段(或者称为构建阶段),设计阶段的类被转换为使用面向对象程序设计语言编制的实际代码。这一任务的难度取决于编程语言本身的能力。用UML创建分析模型和设计模型时,应避免试图将模型转换为代码。在开发的早期阶段,模型是帮助理解和搭建系统结构的一种手段。如果在早期阶段就考虑代码,势必达不到预期的目的。因此,编码是一个独立的阶段,只有到了编码阶段,模型才被转换为代码。,5. 测试阶段 与结构化系统开发方法类似,面向对象的开发方法也需要经过单元测试、集成测试、系统测试和验收测试。对于面向对象的开发方法,单元测试是对单个类或一组类的测试,一般情况下由编程者自己完成。集成测试集成组件和类,以校验它们是否像指定的那样合作。系统测试将系统看成是一个黑盒子,检验系统是否具有最终用户所期望的功能。验收测试由用户实施,验证系统是否满足客户的要求。不同的测试团队使用不同的UML图作为他们测试的基础:单元测试团队使用类图和类规格说明;集成测试团队一般使用组件图和协作图;系统测试团队使用用例图检验最初在这些图中定义的系统行为。,7.3 UML静态建模机制简介,7.3.1 用例图 长期以来,在面向对象开发和传统的软件开发中,人们一直用典型的使用情景来描述需求。但是,这些使用情景是非正式的,难以规范化描述。用例模型由Ivar Jacobson在开发AXE系统中首先使用,并加入由他所倡导的OOSE和Objectory方法中。用例方法引起了面向对象领域的极大关注,面向对象领域已广泛接纳了用例这一概念。,1. 用例模型(Use Case Model) 用例模型用于需求分析阶段,描述的是外部执行者(Actor)所理解的系统功能。它的建立是系统开发者和用户反复讨论的结果,表明了开发者和用户对需求规格达成的共识。 用例模型描述了待开发系统的功能需求,将系统看作黑盒,从外部执行者的角度来理解系统。它驱动了需求分析之后各阶段的开发工作,不仅在开发过程中保证了系统所有功能的实现,而且被用于验证和检测所开发的系统,从而影响到开发工作的各个阶段和UML的各个模型。 在UML中,一个用例模型由若干个用例图描述,用例图主要元素是用例和执行者。,2. 用例(Use Case)与执行者(Actor) 一个用例从本质上讲是用户与计算机之间的一次典型交互作用。例如,在文字处理软件中,“将某些正文置为黑体”和“创建一个索引”便是两个典型的用例。执行者是指用户在系统中所扮演的角色。 UML将用例定义成系统执行的一系列动作,动作执行的结果能被指定执行者察觉到。图7.4是一个图书管理系统的用例图的一部分,其中的椭圆表示用例,小人表示执行者。,图7.4 用例图,3. 通信联系 在图7.4中,不带箭头的线段将执行者与用例连接到一起,表示两者之间交换信息,称之为通信联系。执行者触发用例,并与用例进行信息交换。单个执行者可与多个用例联系;反过来,一个用例可与多个执行者联系。对同一个用例而言,不同执行者有着不同的作用:他们可以从用例中取值,也可以参与到用例中。 执行者在用例图中是用类似人的图形来表示的,但执行者未必是人。例如,执行者也可以是一个外界系统,该外界系统可能需要从当前系统中获取信息,与当前系统进行交互。,4. 使用和扩展(Use and Extend) 用例图除了包含执行者与用例之间的连接外,还可以有另外两种类型的连接,用来表示用例之间的使用和扩展关系。 使用和扩展是两种不同形式的继承关系。当一个用例与另一个用例相似,但所做的动作多一些,就可以用到扩展关系。当有一大块相似的动作存在于几个用例,又不想重复描述该动作时,就可以用到使用关系。,用例用来获取需求、规划和控制项目。用例的获取是需求分析阶段的主要任务之一,而且是首先要做的工作。大部分用例将在项目的需求分析阶段产生,并且随着工作的深入会发现更多的用例,这些都应及时增添到已有的用例集中。用例集中的每个用例都是一个潜在的需求。 对一个大系统,要列出用例清单常常十分困难。可先列出执行者清单,再对每个执行者列出它的用例,问题就会容易很多。,下面给出一个较完整的图书馆应用系统的用例图。用户或客户对它最初的需求描述如下: l 这是一个图书馆支持系统。 l 图书馆应用系统将图书和杂志借给读者,这些读者已经在系统中注册了,借阅的图书和杂志也已在系统中登记了。 l 图书馆负责新书的购买。一本图书可以购买多个副本。 当书和杂志已经过时或破旧不堪时,将它们从系统中删除。,l 读者可以预订图书馆当前还没有的图书或杂志,当预订的图书或杂志归还或购进时,应用系统就通知预订人。当读者借阅了它所预订的图书或杂志后,或者读者要求取消预订时,他的本次预订就被取消了。 l 图书馆应用系统能够很容易地建立、修改和删除系统中的信息,包括书名、借书者、借阅信息和预订信息。 用例描述了图书馆系统提供的所有功能系统的功能需求。用例分析包括阅读和分析规格说明,同时也包括与潜在的用户一起讨论系统。,图书馆系统的执行者包括图书管理员和读者。图书管理员是软件系统的用户,而读者则是来借阅或预订图书和杂志的客户。读者不直接和软件系统打交道,读者的要求由图书管理员代为执行。,图书馆系统中的用例有: l 借书 l 还书 l 预订 l 取消预订 l 增加标题 l 删除或更新标题 l 增加书目 l 删除书目 l 增加读者 l 删除或更新读者,因为一本书可能有多个副本,所以这里必须分离出标题的概念。标题可以是一本书的名称、书的作者或者是用来表示指定标题的一个物理副本的其他信息。而书目是指读者从图书馆中借阅的书。在图书馆拥有某本书之前,就可以在系统中增加该书的标题以允许读者预订此书。 上述列表中没有列出用例图中的维护用例,该用例是一个使用其他用例的更一般的用例,我们可以不将它作为一个用例画出来。这里将它作为一个用例,主要是为了能够将维护任务从系统的主要功能中清晰地分离出来。,图书馆应用系统分析的结果绘制在UML用例图中,如图7.5所示。每一个用例都附带有文本文档,用来描述用例以及用例与执行者之间的交互。下面是借书用例的描述: (1) 如果读者没有预订: a. 确定标题 b. 确定该标题下可用的书目 c. 确定读者 d. 图书馆将书借出 e. 登记一个新的借阅,(2) 如果读者有预订: a. 确定读者 b. 确定标题 c. 确定该标题下可用的书目 d. 图书馆将相应的书目借出 e. 登记一个新的借阅 f. 取消预订,图7.5 图书馆系统的一个用例图,7.3.2 类图、对象图和包 类(Class)、对象(Object)和它们之间的关联是面向对象技术中最基本的元素。对于一个想要描述的系统,其类模型和对象模型揭示了系统的结构。UML用类图和对象图分别表示类和对象模型。类图技术是OO方法的核心。例如,图7.6是一个金融保险系统的类图。,图7.6 类图,1. 类图 类图(Class Diagram)描述类和类之间的静态关系。它不仅显示了信息的结构,同时还描述了系统的行为。类图是定义其他图的基础。在类图的基础上,状态图、合作图等进一步描述了系统其他方面的特性。 UML中类的图形表示为一个划分成三个格子的长方形(下面两个格子可省略)。图7.6中的“客户”就是一个典型的类。,最顶部的格子包含类的名字,类的命名应尽量用应用领域中的术语,应明确、无二义性,以利于开发人员与用户之间的相互理解和交流。 中间的格子包含类的属性,用以描述该类对象的共同特点(该项可省略)。图7.6中“客户”类有“客户名”、“地址”等属性。 底部的格子表示该类的操作(Operation)。该项也可省略。操作名、返回类型和参数表组成操作界面。,定义了类之后,就可以定义类之间的各种关系了。类之间的关系主要有以下几种。 1) 关联关系 关联(Association)表示两个类之间存在某种语义上的联系。在图7.6中最上部存在一个 “属于”/“签定”关联:每个“保险单”属于一个“客户”,而“客户”可以签定多个“保险单”。,关联可以有方向,表示该关联单方向被使用。关联上加上箭头表示方向,在UML中称为导航(Navigability)。只在一个方向上存在导航表示的关联称作单向关联(Uni-Directional Association),在两个方向上都有导航表示的关联称作双向关联(Bi-Directional Association)。图7.6中,“保险单”到“保险单上的项目”是单向关联。UML规定,不带箭头的关联可以意味着未知、未确定或者该关联是双向关联三种选择,因此在图中应明确使用其中的一种选择。,双向关联可以在每个方向上给出一个名字,可以用小黑三角表示名字的方向,例如图7.6中最上部的“属于”/“签定”关联。 关联两头的类以某种角色参与关联。例如图7.7中,“公司”以“雇主”的角色,“人”以“雇员”的角色参与的“工作合同”关联。“雇主”和“雇员”称为角色名。如果在关联上没有标出角色名,则隐含地用类的名称作为角色名。,图7.7 关联的角色,角色具有多重性(Multiplicity),表示可以有多少个对象参与该关联。在图7.7中,雇主(公司)可以雇佣(签工作合同)多个雇员,表示为“*”,雇员只能与一家雇主签定工作合同,表示为“1”。多重性表示参与对象的数目的上下界限制。“*”代表0,“1”是11的简写。多重性可以用单个数字表示,也可以用范围或者是数字和范围不连续的组合表示。 一个关联可能要记录一些信息,可以引入一个关联类来记录。图7.8是在图7.7的基础上引入了关联类。关联类通过一根虚线与关联连接。,图7.8 关联类,2) 聚集(Aggregation)关系 聚集是一种特殊形式的关联,表示类之间是整体与部分的关系。例如,一辆轿车包含四个车轮、一个方向盘、一个发动机和一个底盘。在需求分析中,“包含”、“组成”、“分为部分”等经常设计成聚集关系。 聚集可以进一步划分成共享聚集(Shared Aggregation)和组成。例如,课题组包含许多成员,但是每个成员又可以是另一个课题组的成员,即部分可以参加多个整体,称为共享聚集。另一种情况是整体拥有各部分,部分与整体共存,如整体不存在了,部分也会随之消失,这称为组成(Composition)。例如,我们打开一个窗口,就可见它由标题、外框和显示区所组成,窗口一旦消亡则各部分同时消失。在UML中,聚集表示为空心菱形,组成表示为实心菱形。,3) 继承关系 在UML中,继承表示为一头为空心三角形的连线。如图7.6中,将客户进一步分类成个体客户和团体客户,使用的就是继承关系。,4) 依赖关系 假设有两个元素X、Y,如果修改元素X的定义可能会引起对另一个元素Y的定义的修改,则称元素Y依赖(Dependency)于元素X。 在类中,依赖由各种原因引起,如一个类向另一个类发消息;一个类是另一个类的数据成员;一个类是另一个类的某个操作参数。如果一个类的界面改变,则它发出的任何消息可能不再合法。,5) 类图的细化(Refinement) 细化是UML中的术语,表示对事物更详细一层的描述。两个元素A、B描述同一件事物,它们的区别是抽象层次不同,若元素B是在元素A的基础上的更详细的描述,则称元素B细化了元素A,或称元素A细化成元素B。细化的图形表示为由元素B指向元素A一头为空心三角的虚线。,2. 对象图、对象和链 UML中对象图与类图具有相同的表示形式。对象图可以看作是类图的一个实例。对象是类的实例;对象之间的链(Link)是类之间的关联的实例。对象与类的图形表示相似,均为划分成两个格子的长方形(下面的格子可省略)。上面的格子是对象名,对象名下有下划线;下面的格子记录属性值。链的图形表示与关联相似。对象图常用于表示复杂的类图的一个实例。,3. 包(Package) 将许多类集合成一个更高层次的单位,形成一个高内聚、低耦合的类的集合,UML中称为包,通过这种方法可以将大系统拆分成小系统。在UML中,包图主要显示类的包以及这些包之间的依赖关系。有时还显示包和包之间的继承关系和组成关系。图7.9是一个包图的例子。 在图7.9中,“系统内部”包由“保险单”包和“客户”包组成。这里称“保险单”包和“客户”包为“系统内部”包的内容。当不需要显示包的内容时,包的名字放入主方框内,否则包的名字放入左上角的小方框中,而将内容放入主方框内。包的内容可以是类的列表,也可以是另一个包图,还可以是一个类图。,图7.9 包图,类图中用到的模型元素和表示机制较为丰富,由于篇幅的限制,这里不能一一介绍。主要还有以下模型符号和概念:构造型(Stereotype)、界面(Interface)、参数化类(Parameterized Class)或称为模板类(Template)、限定关联(Qualified Association)、多维关联(N-Ary Association)、多维链(N-Ary Link)、派生(Derived)、类型(Type)和注释(Note)、约束(Constraint)等。 类图可以说是所有OO方法的支柱。采用标准建模语言UML进行建模时,必须对UML类图引入的各种要素有清晰的理解。,7.3.3 构件图和配置图 构件图(Component Diagram)和配置图(Deployment Diagram)显示系统实现时的一些特性,包括源代码的静态结构和运行时刻的实现结构。构件图显示代码本身的结构,配置图显示系统运行时刻的结构。 构件图显示软件构件之间的依赖关系。一般来说,软件构件就是一个实际文件,可以是源代码文件、二进制代码文件和可执行文件等。构件图可以用来显示编译、链接或执行时构件之间的依赖关系。,配置图描述系统硬件的物理拓扑结构以及在此结构上执行的软件。配置图可以显示计算结点的拓扑结构和通信路径、结点上运行的软件构件以及软件构件包含的逻辑单元(如对象、类)等。配置图可以帮助用户理解分布式系统。 结点(Node)代表一个物理设备以及运行于其上的软件系统,如一台Unix主机、一个PC终端、一台打印机、一个传感器等。如图7.10所示的配置图中,“客户端PC”和“保险后台服务器”就是两个结点。结点表示为一个立方体,结点名放在左上角。,结点之间的连线表示系统之间进行交互的通信路径,在UML中称为连接(Connection)。通信类型则放在连接旁边的“”之间,表示所用的通信协议或网络类型。 在配置图中,构件代表可执行的物理代码模块,如一个可执行程序。逻辑上它可以与类图中的包或类对应。因此,配置图中显示运行时各个包或类在结点中的分布情况。如在图7.10中,“保险后台服务器” 结点中包含“保险系统”、“保险对象数据库”和“保险系统配置”3个构件。,图7.10 配置图,在配置图中,构件代表可执行的物理代码模块,如一个可执行程序。逻辑上它可以与类图中的包或类对应。因此,配置图中显示运行时各个包或类在结点中的分布情况。如在图7.10中,“保险后台服务器” 结点中包含“保险系统”、“保险对象数据库”和“保险系统配置”3个构件。 在面向对象方法中,类和构件等元素并不是所有的属性和操作都对外可见。它们对外提供了可见操作和属性,称之为类和构件的界面。界面可以表示为一头是小圆圈的直线。图7.10中,“保险系统”构件提供了一个“配置”界面。配置图中还显示了构件之间的依赖关系,“保险系统配置”构件依赖于这个“配置”界面。,一个面向对象软件系统中可以运行很多对象。由于构件可以看作与包或类对应的物理代码模块,因此,构件中应包含一些运行的对象。配置图中的对象与对象图中的对象表示法一样。图7.10中,“保险系统配置”构件包含“配置保险政策”和“配置用户”两个对象。 标准建模语言UML的静态建模机制是采用UML进行建模的基础。熟练掌握基本概念、区分不同抽象层次以及在实践中灵活运用,是三条最值得注意的基本原则。,7.4 UML动态建模机制简介,UML的动态建模机制通过状态图、序列图、协作图和活动图来实现。这四个动态模型中均用到面向对象技术中消息这个概念。前面我们已经讲过,对象间的交互是通过对象间消息的传递来完成的,当一个对象调用另一个对象中的操作时,即完成了一次消息传递。当操作执行后,控制便返回到调用者。对象通过相互间的通信(消息传递)进行合作,并在其生命周期中根据通信的结果不断改变自身的状态。 在UML中,消息是用带有箭头的线段将消息的发送者和接收者相联系来表示的,箭头的类型表示消息的类型,如图7.11所示。,图7.11 消息的类型,UML定义的消息类型有三种: (1) 简单消息(Simple Message) :表示简单的控制流,用于描述控制如何在对象间进行传递,而不考虑通信的细节。 (2) 同步消息(Synchronous Message):调用者发出消息后必须等待消息返回,只有当处理消息的操作执行完毕后,调用者才可继续执行自己的操作。操作的调用是一种典型的同步消息。 (3) 异步消息(Asynchronous Message):当调用者发出消息后不用等待消息的返回即可继续执行自己的操作,主要用于描述实时系统中的并发行为。,7.4.1 状态图 状态图(State Diagram)用来描述一个特定对象的所有可能状态及其引起状态转移的事件。大多数面向对象技术都用状态图表示单个对象在其生命周期中的行为。一个状态图包括一系列的状态以及状态之间的转移。 1) 状态 所有对象都具有状态,状态是对象执行了一系列活动的结果。当某个事件发生后,对象的状态将发生变化。状态图中定义的状态有初态、终态、中间状态和复合状态。其中,初态是状态图的起始点,而终态则是状态图的终点。一个状态图只能有一个初态,而终态则可以有多个。,图7.12 一个带有动作域的状态,中间状态的图形表示包括两个区域:名字域和内部转移域,如图7.12所示。图

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论