《面向对象方法学》doc版.doc_第1页
《面向对象方法学》doc版.doc_第2页
《面向对象方法学》doc版.doc_第3页
《面向对象方法学》doc版.doc_第4页
《面向对象方法学》doc版.doc_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

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

文档简介

软件工程导论讲义2010版:第四讲 面向对象方法学第四讲 面向对象方法学、 生命周期方法学回顾1、 生命周期方法学的特点生命周期方法学是一种传统的软件工程方法学,其主要特点是:l 严格的分阶段计划 以时间分解为基础来控制和管理整个软件开发过程的,将软件开发过程划分为许多首尾相接、相互独立的阶段。l “瀑布式”开发模式软件开发阶段在时间上严格地实施顺序,不能反复。每个阶段完成后才进行下一个阶段的工作,并且前一个阶段的成果作为下一个阶段工作开始的依据。l 严格的技术审查和管理复审在软件开发的每一个阶段结束后,进行严格的技术审查和管理复审,排除所有潜在的错误,保证瀑布模型的实施,并从成本和进度上管理和控制软件开发。l 结构化技术结构化技术内涵为“自上而下,逐步求精”,生命周期方法学在各个阶段采用结构化技术,包括结构化分析、结构化设计、结构化程序设计等。从以上特点可以看出,生命周期方法学是以软件功能为基础来进行软件开发的,面向的软件实体由一段段可执行的程序代码组成,并以模块作为基本的软件结构体,可以由程序代码的运行来实现所需的软件功能,满足用户的需求。也正是由于生命周期方法学的以上特点,使得它在软件工程实践中也暴露出了许多问题:l 对功能需求分析的依赖生命周期方法学的软件开发成果对于功能需求分析有很强的依赖性,要求需求分析阶段的结果一定要全面、准确、清晰,不能有任何错误或模糊的东西。而一旦对需求分析中确定的需求进行了任何改变,都会直接影响到整个软件的设计和实现,对软件进行的修改要付出很大的代价。但是在实际操作过程中,一方面用户很难一次性地写出既完善又正确无误的功能要求,另一方面所确定的功能要求,又有可能随着时间的变化或者用户对系统理解的逐步深入发生变化。这种软件功能需求的变化在实际软件项目的开发过程中是不可避免和屡见不鲜的,但它对生命周期方法学来说又是灾难性的,这使得生命周期方法学在软件开发实践中往往处于被动的地位。l 软件重用性差如果某个软件开发中的成果不能够保存下来,并且在其它软件的开发过程中得到应用,那么对于软件开发的生产力来说,就是一种极大的浪费。使软件开发中产生的成果能够被别的软件项目所利用,称为软件的重用性。在生命周期方法学中,对软件进行模块划分,是致力于提高软件重用性的一种努力。软件模块具有相对独立的功能,能够完成对信息的某一种处理,因此理论上可以被别的用到相同功能的软件所使用。但各种不同的软件系统中,完全相同的功能是很难见到的,总会因为数据类型、处理细节、允许范围等等原因存在一定的差异。这样,除了一些非常基础的函数运算以外,大量的功能模块并不直接被利用到别的软件中去,而必需要进行一定的修改。这些修改的工作既要在理解原来程序的基础上进行,又要保证对该模块的修改不会影响到与这个模块有耦合关系的其它模块,所以并不简单。生命周期方法学并没有很好地解决软件重用性的问题,也就直接影响了软件生产率的提高。l 维护的代价高任何软件在它的生命周期中,都必然会包含长期的、大量的维护工作。对软件进行维护就是对软件进行修改,但是在生命周期方法学开发软件的过程中,任何对软件的修改都会返回到软件开发的前面阶段中去,因此都需要很大的分析、修改、测试的代价。虽然使用了生命周期方法学后,软件的文档齐备、可理解性增强,能够进行维护,但是瀑布式开发模式的限制使得每一次维护工作都变成了一次小型的软件开发工作,并且功能模块之间的耦合关系使得维护工作给原来的软件引入了新的不确定因素,降低了软件的可靠性,这样的软件结构还是不容易实现维护要求的。l 与现实世界的差异现实世界是一个复杂的系统,它由许多相互独立的元素组成,这些元素之间互相作用、互相影响,共同构成系统整体。每个元素的内部特性并不受到系统的完全控制,相互间的通讯和协同才是系统整体功能产生的原因。而在采用生命周期方法学中,整个软件系统是按照一个统一的功能整体来考虑的,所有的功能模块是这个功能整体的某个从属部分,完成功能整体的某一部分内容,自身并不具有独立性和自主性。因此,整个软件系统可以说是一个受到“完全控制”的整体,不管在开发过程中还是在系统的实际运行过程中,每一个细节都是受到完全的、透明的控制的。这种软件系统和它对应的现实世界模型的不同结构,使得必需要经过某种转换才能够实现互相沟通,降低了软件系统的可理解性。l 与硬件和运行平台发展趋势的分歧开发出高性能的计算机系统一直是技术人员的愿望。最初的计算机采用串行的“诺意曼”方式,其后硬件技术中逐渐产生了并行处理技术。并行处理技术是指一个计算机系统同时能够进行多项处理,这些处理互相独立,共同完成某一项复杂的处理任务。虽然并行处理技术在目前的多数场合还是转换成为实现高性能的“诺意曼”方式计算机的一种工具,但是这种思想对软件运行平台产生了积极的影响。为了提高硬件利用的效率,很多软件运行平台均开始支持多任务。所谓多任务,就是同一套计算机系统能够“同时”进行多项任务的处理。硬件和运行平台的并行、多任务特性,事实上使某个大任务的执行过程变成了多个互相独立、又互相作用的小任务组成的系统,这和生命周期方法学面向过程,统一调度控制软件的运行流程的思想出现了越来越大的分歧。l 数据与处理过程的分离任何软件系统都是信息处理系统,也就是数据处理系统。特别是随着商业、行政事务领域对软件需求的迅速增加,数据在软件系统中的重要性也随之增加。而在生命周期方法学中,对于系统的分析和设计,都是基于功能的,也就是说,是基于对数据的处理算法、处理过程的,由处理过程和数据结构构成整个软件系统的实体,而数据只是处理过程所操作的对象而已。数据本身的静态性和被动性,使得整个软件系统的数据变成了一些“死”的数据,只能根据功能操作产生变化,自身不具有任何独立性。这和以数据为中心的任务需求是不相符合的,也不利于对数据的应用和保护。这种数据与处理过程的分离还使得整个软件系统分裂成为了软件实体(由处理过程组成)与数据两大部分,互相之间的关系变得错综复杂,不仅不利于理解,也增加了软件开发本身的难度。正是因为生命周期方法学存在这样一些问题,已经不能很好地适应软件产业的发展,所以面向对象方法学才被引入软件工程中来。一、 面向对象方法学的基础知识1、 面向对象方法学的基本概念(1) 对象对象是现实世界中系统组成元素在软件中的对应物。每个实际的系统是由许多相互独立又相互作用的元素共同构成的,这些元素的性质和行为构成了系统的基本内容。将实际系统中每个元素抽象出来,在解决实际系统某个问题的软件中,对应给予一个元素进行模拟,称之为对象。这个对象的概念是一个非常广义的概念,在不同的任务中它所指的内容并不相同。比如要考察一个公司的人际关系,那么公司内的每一个个人就可以抽象为一个对象;如果要考察的是公司的经营情况,那么可能公司内的每一个部门会抽象为一个对象。以什么元素抽象作为对象,要看所要考察的系统的实际内容,和所要考察的项目的实际要求。实际系统中,每一个元素都是相对独立,又相互作用的。也可以说,是主动的,或者说是“活”的。这些元素既具有自己的性质,又具有自己的行为。它们的性质是由表明某方面状态的数据来表现的,而它们的行为则是通过它们对其它元素某方面状态的影响,或者其它元素对它们自身某方面状态的影响来表现的。因此,可以认为实际系统中的元素既具有数据又具有对自身数据的操作,数据和操作构成一个整体。同样,在对应于实际系统的软件系统中,对应于实际元素的对象也同时具有数据和操作这两种特性,并且二者结合在一起,共同构成一个在软件系统中独立的“活”的元素。实际系统中的元素的性质不可能直接被改变,其它的元素只能通过与它之间的作用才能使它的性质发生改变。软件中的对象也具有同样的特性,就是它所具有的数据只能通过它所具有的操作才能改变,而不能直接被别的对象改写。对象的所有数据都被看作是私有的、局部的,外界不能直接访问。其它对象只能够通过它提供给外界的操作来影响所包含的数据,并且数据的变化是由对象自己根据操作和进行操作时的条件完成的。对象的这种特性称为“封装”。因此,对象有如下定义:定义:对象是软件系统中对实际系统的元素的一种抽象,它由表示属性的数据和对这些数据的操作封装而成。根据对象的定义,它有这样一些特点:l 以数据为核心 对象的核心是它的数据,数据的不同表明了对象的不同状态,也对应了实际系统中元素的不同性质。对象的操作是对这些数据的变动,是肯定与对象的某些数据有关。l 对象是主动的 对象不是一组静态的数据,等待别人来改变它,它具有活性。其它对象想要改变它的数据,只能通过激发它的操作来完成,而对数据的改变是由对象自己的操作来实现的。所以,对象在自己数据的改变上具有主动性,即使别的对象发出了改变的要求,也还要根据实际情况来决定是否按要求改变。l 对象具有封装性 对象的数据和操作是封装在一起的,别的对象既不能直接改变它的数据,也不能改变它的操作。只能通过激发它的操作来对数据产生影响。l 对象具有独立性 正因为对象实现了数据和操作的封装,所以它比功能模块具有更好的独立性,内聚更强,而互相间的耦合更弱。并且正因为对象互相之间具有独立性,因此它们在一个软件系统中,是各自独立存在和活动的。整个软件系统就可以看作是很多对象的集合,这些对象独立生存,互相之间通过信息传递来互相影响,共同完成系统的任务。(2) 消息和方法消息是对象的对外接口,它提供了与某个具体对象进行通讯,从而激发某种动作的方式。每条消息由接收消息的对象名、消息名和变元组成。方法则是每个对象所具有的具体操作,是对消息的具体响应方式。方法通常需要有具体的实现代码。通过消息来调用方法,从而对与一个对象发生作用,这是基本的、也可以说是唯一的对对象施加作用的方法,是对象的唯一对外接口,这种思想充分保障了对象的独立性。(3) 属性属性是类中定义的属于对象的数据,反映了对象某方面的特性。一个类派生出的所有实例具有相同的属性定义,但属性值互不相关。(4) 类和实例抽取一组相似事物的共同特征,将它们归为一类,这是人类研究和认识世界的一种基本方法。在面向对象方法学中,类是具有相似特性的一组对象的抽象,它的定义确定了这组对象所共同拥有的属性和操作,可以用于生成具体的对象。实例是根据某个类定义所产生的一个具体对象,同属一个类的不同实例拥有相同的属性和操作定义,但属性值各不相同,在计算机系统中也占据不同的存储空间,各自的状态和动态特性也互相独立。(5) 继承继承是面向对象方法学中的核心概念,它是指从一个类的定义中可以派生出另一个类的定义,被派生出的类(子类)具有父类的所有属性和方法定义。单纯的继承没有意义,继承的价值在于子类还可以定义自己新的属性和方法,或者对继承得来的属性和方法重新进行定义,覆盖父类中的定义。这样的继承方式可以使新类可以从已有的类中派生而来,从而对已有的软件开发成果进行有效的重用,减少了程序的代码量和复杂度,提高了软件的质量和可靠性,软件的维护修改也变得更加容易。2、 面向对象方法学的特点虽然对象的概念是面向对象方法学最基本的概念,但并不是所有使用了全面使用了对象概念的软件开发方法都可以叫做面向对象方法学,它具有下面这样一些特点:l 使用对象的概念来构造软件在面向对象方法学中,以对象的概念来对应模拟实际系统中的各种元素,并且以对象的集合构成软件系统的整体,以对象的性质和行为来完成软件系统的所有功能。如果仅使用了对象概念来开发软件,可以称为“基于对象”的软件开发方法。l 使用类的概念来完成对象定义面向对象方法学中不仅使用对象的概念,而且使用类的概念。对象作为类的实例,是在软件运行过程中按照类的定义动态生成的,因此实现软件中所有类的定义是软件开发的主要工作。如果同时使用了对象和类的概念来开发软件,可以称为“基于类”的软件开发方法。l 类之间具有继承关系继承是面向对象方法学的主要特点之一,它利用类与类之间的继承来实现软件重用,软件开发过程从统一的基类开始,逐步派生出各个层次的所有类,并根据各类的开发需求对类的属性和方法进行重新定义,最后完成整个软件的开发。如果同时使用了对象、类和继承的概念,可以称为“面向对象”的软件开发方法。l 对象之间通过消息机制互相作用在面向对象方法学中,对象具有封装性,一个对象不能直接访问另一个对象的数据,只能通过消息机制互相通讯和作用。这种机制既保证了对象之间的独立性,也是对现实世界实际系统之间相互作用方式的最好模拟。面向对象方法学作为一套完整的软件开发范型,其思想最早来源于程序设计领域,也就是面向对象程序设计(OOP),其代表是C语言。在OOP中,独立的对象成为了构成整个应用软件实体的基本元素,而多任务操作系统的提出是由对象构成的软件能够得以运行实现的环境条件。随着面向对象程序设计的成功,传统面向过程的软件开发方式(包括软件分析和软件设计)与它的矛盾也逐渐凸显,在软件开发全过程都采用统一的对象概念和对象软件模型的面向对象方法学也就逐渐成形,并逐步发展为软件工程领域具有主导地位的软件开发范型。3、面向对象方法学的主要优点:面向对象方法学具有一系列的优点:l 问题域与解域具有相同的结构所谓问题域,是实际问题的表达,也就是实际系统的描述;解域,是为了解决实际问题而设计的软件系统。如果问题域和解域有相似的结构和表达方法,那么不仅软件开发人员容易理解问题域的要求,用户容易理解解域的结果,而且从问题域到解域的转化(也就是软件开发的过程),会变得更加简单。现实世界中的系统都是由独立存在和行为的元素组成的,而面向对象方法学中对使用对象的概念对这些元素进行了模拟,对象与对象之间的关系类似于实际系统中元素与元素之间的关系。这样在软件结构上,面向对象方法学采用的方式就比传统的生命周期方法学更加符合现实世界的实际情况,问题域和解域具有更好的一致性。在问题域中的元素具有自己的性质和行为,解域中的对象也具有自己的属性和操作。问题域中每个元素具有自己的独立活动性,并发地自主活动,互相之间通过影响和作用共同构成整个实际系统;解域中的对象也是独立存在和运行的,互相之间通过消息的传递来实现互相操作,完成整个软件系统的设计要求和功能。l 求解过程与人类思维模式一致在面向对象方法学中,不用再考虑用一个全面的、完善的、事无巨细的控制流程来管理一切,而是根据对问题域的分析,以设计出相应的对象来模拟问题域中的元素,由这些对象自主的行为构成整个软件系统的运行。这就使软件开发的过程与实际系统的运行过程更加一致,不必从实际系统中去抽取出所有的控制流程,也就更加容易实现。l 软件系统具有稳定性 正因为使用面向对象方法学开发出来的软件系统是由众多的对象所构成的,并且其结构和现实世界中的实际系统相类似。因此,如果问题域发生变化,那么对应解域的变化可以比较方便地进行。在实际系统中,构成整个系统的元素相对来说比较稳定,经常发生变化的是整个系统的功能,而功能是通过增减元素,或改变元素与元素之间的相互作用来体现的。所以,用面向对象方法学开发出来的软件系统当功能要求发生变化时,并不需要对整个软件全部进行调整,只需要增减对象或对象类,改变对象的消息处理机制或者内部操作就可以实现了,整个软件系统的结构比较稳定。l 可重用性好可重用性要求构成软件的构件具有很好的适应应用场合和环境变化的能力,而应用场合和环境变化最常体现在对构件功能的要求相似,但数据类型或处理细节有所不同。传统的功能模块由于只具有对数据的处理,不包含数据本身,因此对于不同的数据类型或处理细节必然会产生不同的模块,那么这些模块的重用都会受到很大的限制。面向对象方法学将数据和对数据的处理封装成为一个对象,对象这个数据和操作的整体类似于现实系统中的元素,具有独立性和完整性。因此,如果用它作为软件重用的构件,那么更加符合现实世界的自然情况。面向对象方法学采用了类的概念,每一个类都可以产生出许多的具有相同性质,但又各自独立活动的对象实体;每一个类又还可以通过派生产生新的类,新的类能够如果继承利用父类的所有设计成果。这些优点都使得对象的重用变得更加简单和灵活,大大提高了软件开发的效率和可靠性。l 可维护性好由于软件自身具有完整的生命周期,因此可维护性无论如何都是软件开发质量的一个重要指标。采用面向对象方法学开发的软件系统,由一系列相对独立的对象组成,对象与对象之间并不能直接互相改变数据的状态,甚至直接执行某种操作。因此对于软件的任何修改,都只需要限定在相关的类就可以了,并不会影响到其它的类;对于某个类内部的数据和操作的修改,只要与提供给外界的消息机制无关,对其它类也没有任何影响。这种特性使得对于软件的修改和测试都变得更加容易。面向对象方法学的解域和问题域的一致性,也使得软件系统更加容易理解,修改起来也更容易。二、 统一建模语言UML1、 UML语言的历史面向对象方法学是一种基于对象模型的软件开发方法,它在分析、设计和实现的各个阶段都采用统一的模型来对系统进行描述,整个软件开发的过程就是一个逐渐对系统模型进行细化和精华的过程。因此,在面向对象方法学中,如何实现对系统模型的统一描述,采用何种工具来表达系统模型是一个关键性的问题。UML语言就是在这种背景下诞生的,它是统一建模语言(Unified Modeling Language)的简称。在70年代中期面向对象程序设计诞生之初,用于建模的语言就层出不穷,到1994年据统计超过了50种,这些语言各有特色,也都得到了一些实践应用,但是各自不同的表达方法和体系造成了使用者之间交流的很大障碍,亟需进行整合。1994年10月,Rational公司的Grady Booch(格雷第布屈)和Jim Rumbaugh(詹姆斯伦伯)开始致力于这一工作。他们在精心比较不同的建模语言优缺点及总结面向对象技术应用实践的基础上,于1995年10月发布了统一方法UM 0.8(Unified Method)。1995年秋,OOSE 的创始人Ivar Jacobson(依瓦亚克生)加入该项工作,经过三人的共同努力,于1996年6月和10月分别发布了UML 0.9和UML 0.91,并将UM重新命名为UML(Unified Modeling Language)。l UML三友(Three Amigos)u Grady BoochBooch是美国Rational软件工程公司的首席科学家和Booch方法的主创人。与Rational公司的Ivar Jacobson、Jim Rumbauth共同创建了一种可视化地说明、建造软件系统的工业标准语言-统一建模语言UML。他还是Rational公司一些产品的开发者,包括该公司最初的软件工程环境Rational Enviroment及业界领先的可视化建模工具Rational Rose。u Jim RumbaughJames Rumbaugh 博士拥有麻省理工学院的物理学学士学位、加利福尼亚理工学院的天文学硕士学位,以及麻省理工学院的计算机科学博士学位,1994年加入Raional公司前曾在通用电气(GE)研发中心工作了25年,他提出了许多面向对象软件开发和实现的概念及工具,包括OMT方法(Object Modeling Technique),他目前领导着IBM Rational分部的软件建模工作。u Ivar JacobsonIvarJacobson博士曾任瑞典爱立信公司的首席软件体系架构师,1995年加盟Rational公司,2005年成立Ivar Jacobson International,致力于软件开发方法的研究和推广,其公认的主要成就包括组件(Component)、用例(Use Case)、SDL语言 (Specification Description Language)、OOSE(Object_Oriented Software Engineering)、RUP过程(Rational Unified Process)和UML语言,著作包括面向对象软件工程和UML语言用户指南等。自1996年开始,UML得到了一些软件开发企业和软件开发人员的逐步认同,并成立了UML成员协会,以完善、加强和改进UML的规范和应用推广,其成员包括了IBM、DEC、Microsoft、Oracle、Rational、TI、Unisys等业界的重要企业。1997年9月1日,UML 1.1发布,并提交给面向对象软件开发的标准化组织OMG(Object Management Group,对象管理组织),于同年11月17日被OMG采纳,作为面向对象软件开发技术的标准建模语言。UML是一种经过精心设计的标准化建模语言,它吸取了软件工程领域的最新研究成果,并经过软件工程实践的检验,具有定义完善、易于使用、功能强大和适用面广等特点,可以完整支持面向对象软件开发的全过程,获得了广泛的认可,是可视化建模语言的行业标准,具有很高的价值,并已推广到软件开发以外的领域用来建立系统的静态和动态模型。2010年5月OMG发布了UML 2.3规范,这是UML标准目前的最新版本。其具体文档可参见网址:/spec/UML/2.3/2、 UML语言的内容自UML2.0开始,UML语言的定义分为四个部分:基础结构(Infrastructure)、上层结构(Superstructure)、对象约束语言(OCL)和图交换(Diagram Interchange),其中基础结构和上层结构是UML的主体部分。UML基础结构的设计目标是定义一个元语言的核心Infrastructure Library,通过对此核心的复用,定义一个自展的UML元模型。元模型为UML的所有元素在语法和语义上提供了简单、一致、通用的定义性说明。UML基础结构也能定义其他建模语言的元模型和专用语言。UML上层结构的设计目标是基于基础结构Infrastructure Library中的元语言规则,定义用户可以直接使用的系统模型描述工具。UML 2.3用图(Diagram)作为模型基本符号,共支持13种图,分成两大类:结构图(Structure)和行为图(Behavior)。结构图包括:类图(Class)、组合结构图(Composite Structure)、构件图(Component Diagram)、部署图(Deployment)、实例图(Instance Specification)和包图(Package);行为图包括:活动图(Activity)、交互图(Interaction)、用例图(Use Case)和状态机图(State Machine),其中交互图是顺序图(Sequence)、通信图(Communication)、交互概览图(Interaction Overview)和时序图(Timing)的统称。3、 静态模型描述工具系统静态模型表达了系统的组成和结构关系,在UML 2.2中使用的静态模型描述工具是各种结构图,其中最核心的定义是类图和对象图。(1) 类图类图是一个纵向分成三部分的矩形,分别写入类名、属性和方法。类名是访问类的索引,应当使用含义清晰、用词准确、没有歧义的名字。属性是类中的数据,每个属性按照以下语法定义:可见性 属性名:类型名=初值性质串其中可见性有四种类型,分别为:l 公有Public:用(+)表示,说明该属性所有对象均可以访问l 私有Private:用(-)表示,说明该属性只有该类产生的实例可以访问l 保护Protected:用(#)表示,说明该属性只有该类及其派生类产生的对象可以访问l 包Package:用()表示,说明该属性只有属于同一个包的类产生的对象可以访问类型名表示该属性的数据类型,性质串说明了该属性所有可能的取值,也可以加入其它说明。方法是该类可以提供的对数据的操作,其定义为:可见性 方法名(参数表):返回值类型性质串可见性的定义与属性相同。参数表中每个参数的格式为:方向 参数名:类型名默认值方向有四种类型,分别为:l In:表示传送给方法的参数l Out:表示传送给调用者的参数l Inout:表示在方法和调用者之间双向传送的参数l Return:表示作为方法返回值返回给调用者的参数(2) 对象图对象是类的实例,对象由一个分成两部分的矩形表示,分别写入对象名和属性值。对象名由对象名:类名表示,并加下划线。每个对象的属性都有具体的取值。(3) 关系关系表达了类与类之间的相互联系,一个系统的静态模型就是由类图和类图之间的关系来作为基础构成的。UML中常用的类之间的关系表达有以下几种类型:l 关联Association关联表示了两个类之间的语义联系,因此关联有名称,有方向,并且可以表明重数。01,表示0到1个对象0*或*,表示0到多个对象1或1*,表示1到多个对象115,表示1到15个对象3,表示3个对象l 聚集 Aggregation聚集可以看作是关联的特例,它表示类与类之间是整体与部分的关系。聚集可以有两种特殊方式:u 共享聚集 Shared Aggregation处于部分方的类可同时参与多个处于整体方类的构成,部分方类也可以独立存在。u 组合聚集 Composition处于部分方的类是处于整体方类的一部分,同时存在或消失。l 泛化 Generalization泛化关系就是继承关系,特殊类拥有一般类的全部信息,还可以附加自己的新的信息。泛化关系仅仅用于类与类之间,可以传递,也可以表现为多重继承或其它受约束的泛化关系。4、 功能模型描述工具系统功能模型表达了系统的功能,UML功能模型中最重用的概念是用例,使用用例模型来捕捉和描述系统满足用户需求的各种功能。(1) 用例图的组成一个用例描述了系统和外部角色(Actor)之间的一次交互。用例图由系统、用例、角色和关联组成。系统是一个矩形,表示了软件系统的边界。角色也称为参与者,是指系统以外与系统进行信息交互的人或物,用一个人形符号表示。用例是一个椭圆形,它表达了系统可以提供的一项完整的功能,这些功能的结果能通过系统与角色之间的通信让角色觉察到。关联也称为通信,它连接角色与用例,表达了角色与用例之间的关系。关联也可以有自己的重数和特性。(2) 用例之间的关系用例与用例之间可以有两种常见关系:l 扩展 Extend扩展关系是一种泛化关系,它表达了一个用例由另一个用例扩展而来,继承了原用例的行为,同时可以有自己新的行为,它是由一般用例扩展到特殊用例的过程。l 使用 Use使用关系表示一个用例在完成自己功能的时候,要使用另一个用例的功能。类图是一个纵向分成三部分的矩形,分别写入类名、属性和方法。(3) 用例描述用例图中的用例只是表达了系统所具有的某项功能,而对每个功能的具体含义和操作细节,必须使用用例描述来进行文字表达。用例描述只关注角色可以感知到的用例的功能表现,而不关注软件系统自身对功能的实现细节,一般包括用例说明、前置条件、事件流、异常处理等内容。5、 动态模型描述工具系统的动态模型表达了系统的动态特性。UML 2.2中用各种行为图来表达系统的动态模型,其中比较重要的有状态机图和顺序图。(1) 状态机图 (State Machine)状态图是一种常用的描述系统动态特性的工具,它可以表达一个对象如何在事件的驱动下从自身的一个状态转移到另一个状态。UML 2.2中的状态机图是状态图的一个子集,它表达了系统对象作为一个有限状态机的状态转移特性。状态机图由状态、转换、事件等组成,表达了对象的状态在相应事件触发下会发生的转移。(2) 顺序图(Sequence)顺序图是UML中非常重要的工具,它表达了对象之间在事件上的相互配合以及互相之间的消息传递过程,充分体现了系统对象之间的交互作用。UML中时序图包含4个元素,分别是对象(Objce)、生命线(Lifeline)、消息(Message)和激活(Activation),其中纵轴是时间轴,时间沿竖线向下延伸。横轴代表了在协作中各个独立的对象。当对象存在时,生命线用一条虚线表示,当对象的过程处于激活状态时,生命线是一个双道线。消息用从一个对象的生命线到另一个对象生命线的箭头表示。l 课后作业: 用UML语言中的类图、用例图和顺序图对以下计算机储蓄系统进行描述:储户填写的存款单或取款单由柜员输入系统,如果是存款,系统记录存款人姓名、住址、存款类型、存款日期、利率等信息,并打印存款单给储户;如果是取款,系统计算利息并打印利息清单给储户。三、 面向对象分析1、 一般过程面向对象分析是采用面向对象方法学开发软件的第一步。它的基本内容是以对象概念为基础,通过对目标系统的分析,确定软件系统的结构、组成和行为方式,从而建立起目标系统的完整模型。面向对象分析的一般过程如下图所示:撰写需求陈述建立系统的静态模型建立系统的功能模型建立系统的动态模型定义每个类的服务需求陈述是软件开发的出发点,它是由用户撰写的关于开发目标的最初描述。需求陈述往往是不完整、不精确和不正规的,它不能直接作为软件开发的需求规格描述,而只能作为进行需求分析和系统建模的引导性文件。在需求陈述的基础上,系统分析员要通过自己的分析和与用户的交互,抽象出系统的本质特征,建立起系统的面向对象模型,最后对模型中每个服务的细节进行定义。面向对象分析的过程不是一种线性的过程,而是一个对系统模型进行演进和迭代的过程,因此在每一项任务都有可能要在更深入、更细化的意义上重复进行其它任务的工作。面向对象分析所建立的系统模型,包括静态模型、动态模型和功能模型三部分,每个模型都可以在五个层次上分别进行细化,它们是:主题层类与对象层结构层属性层服务层这五个层次互相重叠,但逐步深入,其中类与对象、属性、服务都是系统模型的基本元素,结构代表了系统中各个元素之间的相互关系,而主题则是将系统中具有相互关联的元素组合到一起,形成一个“主题”,每个主题都代表了系统的某一个相对独立的组成部分。使用“主题层”是提高系统抽象程度,减少系统复杂度的一种方法,它相当于将大的软件系统划分成许多小的子系统,在一个规模可控的范围内来进行研究。2、 建立系统静态模型:(1)识别类和对象建立系统静态模型首先要识别出类和对象,其依据来源于对问题域的分析,通过研究所要解决的问题所构成的系统的结构和组成来完成。首先对问题域中有意义的个体或概念实体进行研究,按照以下五种类型来列出候选的对象: 可感知的物理实体,比如计算机终端、打印机、密码键盘、CRT、存储器等; 人或组织的角色,比如操作员、管理员、储户等; 应该记忆的事件,比如意外停电、非法操作等; 对象间的相互作用,比如打印、显示、生成利息等; 需要说明的概念,比如存期、利率等; 将一个目标系统中的所有候选的对象列表出来以后,要对它们进行筛选。筛选的原则包括: 相同的冗余概念 与系统无关的概念 笼统模糊的概念 应当归为属性和服务的概念 系统实现阶段才应出现的概念经过筛选得到的对象表才是构成目标软件系统的基本组成成份。完成对象的识别后,要对对象进行归类,也就是进行类的识别。识别类的方式主要是依据对象与对象之间的共同之处和差异之处进行的。把某些具有共同属性和操作的对象之间的共同的东西抽象出来,形成一个类,然后将这些对象作为这个类的不同实例例,就完成了类的识别。(2)识别关联关联代表了类与类之间的关系,也就是系统的结构,它对应了问题域中实体之间的相互关系。在对问题域的分析中,可以依据以下方法得到关联: 从动词短语中提取:比如“由组成”、“拥有”、“与交换”等; 寻找需求陈述中隐含的关联; 根据问题领域的知识得到的关联;得到关联后同样要进行筛选,筛选的原则包括: 与不存在的类或对象相关的关联 与系统任务无关的关联 描述瞬时事件的关联 可用其他关联派生的关联 系统实现阶段才应出现的关联(3)划分主题主题是对系统的一种划分,它由主题词来标识,表明了整个系统中的某个结构范围,通常把关系比较密切的紧耦合类和对象划分在同一个主题内,位于不同主题中的类(对象)之间的关系比较松散,仅以少量的消息传递相互关联,基本不存在泛化关系。划分主题一般也按照问题域的分解关系来进行,针对问题域的功能和结构分解来得到不同的主题。(4)定义属性对属性的定义是对类(对象)识别的深入,对每一个类(对象)的属性进行详细的研究,确定它的名称、内容、数据特性和表征含义。定义属性的过程来源于对每一个对象的详细分析,而得到的属性通常也要按照以下原则进行筛选: 应当是对象的属性 区分关联类的属性和一般对象的属性 关联的限定词 对象的内部状态数据 属性的矛盾和冲突在进行属性定义的过程中,还可能碰到这样的一些情况,说明需要对类(对象)识别的结果进行调整:l 如发现一个属性只适用于一个类中的某些对象,而不适用于另一些对象,说明存在新的类,并且这个新类和原先的类存在继承关系;l 如果某个类只有一种属性,那么它应该可以作为它的父类的一个属性,而不单独作为一个类存在;(5)非正式分析在识别对象、属性包括服务的过程中,除了对系统进行分析得到候选元素外,还可以使用被称为“非正式分析”的方法,它对需求陈述进行考查,将需求陈述中的名词作为对象的候选者,形容词作为属性的候选者,动词作为服务的候选者。需求陈述名词对象属性服务形容词动词3、 建立系统功能模型:建立系统功能模型的最主要工作是编写用例,用例表达了系统功能,也作为软件开发的目标驱动了整个面向对象软件开发的过程。定义用例的首要步骤是识别出角色(参与者),这往往是通过分析系统的使用者、维护者和外部接口得到的。用例的编写从可见的外部事件出发,考查其与角色之间的关系,以发现系统应该提供什么功能来实现这些外部事件,从而定义出用例,并在研究用例之间相互关系的基础上绘制出用例图,最后对每个用例进行描述。在用例图的基础上,可以进一步使用数据流图来对系统功能模型进行细化描述。4、 建立系统动态模型:(1)编写脚本建立系统动态模型从编写脚本开始。脚本是指系统在某一期间内的一系列事件,它由用户与系统的多次交互构成,表达了用户使用系统所提供的功能的过程。脚本的编写围绕系统的用例进行,通常一个完整的脚本中包含了系统某一方面功能的多个用例,并用流程描述将它们串接起来。脚本的内容为事件序列,每个事件要明确产生的时间、发起者、接收者、参数和产生的影响,通常都会按照正常情况脚本和异常情况脚本来分别编写。(2)绘制顺序图 在脚本的基础上,抽取出对象间状态变化的时间关系,以及对象间消息传递的内容,绘制出顺序图,准确地描绘出系统功能实现过程中的信息传递和对象间相互关系。(3)设计基本用户界面根据对系统动态的分析,设计一个能满足交互需求的用户界面,同时确定系统的基本人机交互模式。(4)绘制每个对象的状态图顺序图表达了系统整体的消息流动和事件,而状态图能很好地描绘出每个对象对消息和事件的反应,对于准确地理解每个对象的动态特性很有帮助。状态图的绘制可以在顺序图的基础上进行,从顺序图中抽取出每个对象以及它接收和发送的消息,考查这些消息是否会对对象的状态造成影响。5、 定义类的服务类的服务也可以称为“方法”或“操作”,对类的服务进行定义是面向对象分析最后完成的工作。服务的定义可以来源于状态图中的事件响应,也可以来源于功能模型中的具体数据处理。四、 面向对象设计1、 一般过程面向对象方法学把整个软件系统看作是对象的集合,软件开发过程是对对象模型演进迭代、逐步精华的过程,因此也没有“瀑布模型”那样精确严格的阶段划分,这一点在“喷泉模型”这样的面向对象软件开发过程中可以明显地看出来。在这种方式中,面向对象分析和面向对象设计也很难明确区分开来。事实上,不管是分析过程还是设计过程,都是对整个软件系统的对象、类、结构、服务的建构过程。所不同的是:在面向对象分析阶段,工作的重点是对问题域进行仔细的研究,将它所包含的对象和对象之间的关系确定下来,并且用对象模型进行模拟;而在面向对象设计阶段,可以看作是对分析阶段生成的系统对象模型的一种扩充和深化,补充许多在问题域中并不存在,但为了完成软件的整体任务所不可缺少的对象和对象之间的关系,从而形成完整的软件结构。所以,在进行面向对象分析时,一定要将所研究的内容限定在与系统任务直接相关的范围内,以更多地集中精力探明目标系统的本质要求,而不要涉及与系统任务没有直接关系的对象和操作,把这些内容留待面向对象设计的阶段再来研究。喷泉模型1、建立系统的三个模型2、逐步迭代和扩充系统模型3、在五个层次上完成系统建模1、重点分析问题域,关注与问题有关的系统成分2、不涉及系统模型的实现细节1、扩充问题域模型,添加系统实现所必须的成分2、完成软件系统的实际架构和所有实现细节分析设计根据P.Coad和E.Yourdon提出的面向对象设计模型,把软件的整个面向对象设计过程分成了“问题域子系统”、“人机交互子系统”、“任务管理子系统”、“数据管理子系统”这四个部分,对每一个部分又包括了类与对象、结构、主题、属性、服务这5个层次的内容。系统分解人机交互子系统主题层服务层属性层类与对象层结构层问题域子系统任务管理子系统数据管理子系统其中“问题域子系统”是整个设计的主体,它是由完成软件系统主要任务的部分所构成的,其设计直接来源于OOA所建立目标系统对象模型;“人机交互子系统”给出实现人机交互所需的对象;“任务管理子系统”提供协调和管理目标软件系统各个任务的对象;“数据管理子系统”定义专用对象,将目标软件系统中依赖于开发平台的数据存取操作与其它功能分开,以提高对象独立性。这四个部分相当于给整个软件的完整对象模型划分了四个最高层的主题,不仅可以相对独立地进行设计,而且在人机交互、任务管理、数据管理这些主题的设计和实现

温馨提示

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

评论

0/150

提交评论