第二节 面向对象的系统分析、设计与UML建模
一、面向对象分析与设计
1.面向对象分析和设计(object oriented analysis design,OOAD)
是一种流行的技术方法,它通过应用面向对象编程,以及在整个开发生命周期中使用可视化建模来分析和设计应用程序、系统或业务,从而促进涉众之间更好地沟通,提升产品质量。
现代软件工程中的OOAD最好以迭代和增量的方式进行。通过一次又一次的迭代,OOAD活动的输出、OOA(object oriented analysis)的分析模型、OOD(object oriented design)的设计模型,都在风险和业务价值等关键因素的驱动下不断地被细化和演进。
2.面向对象建模(object-oriented modeling,OOM)
是在整个开发生命周期中使用面向对象范式对应用程序、系统和业务领域进行建模的一种常见方法。面向对象建模(OOM)是现代软件工程中OOD和OOA活动广泛使用的一种主要技术。
面向对象建模通常分为两个方面:动态行为(如业务流程和用例)的建模,以及静态结构(如类和组件)的建模。面向对象分析(OOA)和面向对象设计(OOD)是面向对象建模(OOM)过程中两个不同的抽象层次(即分析层次和设计层次)。统一建模语言(UML)和系统建模语言(SysML)是用于面向对象建模的两种流行的国际标准语言。面向对象建模有如下两大好处。
(一)高效的沟通
用户通常很难理解全面的文档和编程语言代码,而可视化的模型图却更易于理解,并且能让用户和涉众就系统的适当需求和结构向开发人员提供反馈。面向对象方法的一个关键目标是减少系统和现实世界之间的“语义鸿沟”,并采用与涉众在日常业务中使用的术语几乎相同的术语来构建系统。面向对象建模是实现这一目标的必要工具。
(二)有用且稳定的抽象
建模可以帮助编写代码。大多数现代软件方法的目标是首先解决“是什么”的问题,然后解决“如何”的问题,即首先确定系统要提供的功能而不考虑实现的约束,然后考虑如何实现针对这些抽象需求的具体解决方案,并根据技术和预算等约束条件细化成详细的设计和编码。面向对象建模通过生成对系统需求和设计的抽象和可理解的描述来实现这一点,也就是说,模型定义了它们的基本结构和行为,比如过程和对象,这些都是重要和有价值的开发资产,具有比具体和复杂的源代码更高的抽象级别。
二、UML统一建模语言
(一)综述
软件工程的目标是利用工程化的方法在给定成本、进度等前提下,开发出具有可维护性、正确性、可移植性的软件,提高软件产品的质量和开发效率,降低维护的难度。
随着软件工程的发展以及系统愈加复杂和庞大,IT界迫切需要用一种语言来描述它们所完成的需求、设计,但是不同的公司开发了自己的产品,应运而生的数量不在少数的各种建模语言,使得人们无所适从,一是人们没有能力区别各种建模语言时间的差别,二是它们之间的差异也影响了用户之间的交流。
为了统一起来,成立了对象管理组织(object management group,OMG),这个组织建立了描述需求与设计的规范语言,称为统一建模语言(unified modeling language,UML)[4,5]。
软件系统开发过程中会有不同的涉众参与其中,如分析师、设计师、程序员、测试员、质量保证员、技术文档撰写员、客户等。这些人对系统的不同方面持不同兴趣,会从不同的角度来审视系统,故此在建模时需要考虑不同的细节层次。例如程序员需要了解系统的设计,并将设计转换为代码;技术文件撰稿员则对整个系统的行为感兴趣,借以了解产品的功能。UML提供了极富表达能力的建模语言,可让所有涉众从UML图表得到感兴趣的信息。
UML的主要目的或目标如下。
1.为用户提供现成的、有表现力的可视化建模语言,以便他们用对象的概念来构造系统模型。
2.建立直观地从模型直至可执行体之间的对应关系。
3.为复杂的系统建立衡量的标准。
4.创建一种对人和机器都合适的语言,即可用人工描述,也可以用机器实现的计算机辅助建模。
5.整合最佳的工作实践(best practices)。
实践证明,面向对象分析设计(OOAD)方法比传统方法能更加准确、全面地描述现实世界。UML是用来表述面向对象概念的一种语言工具。很奇妙的是,它本身作为一件产品同样也是用面向对象方法来设计的,这使得UML具有传统建模语言所不具备的很强的语义表达能力和非常灵活的可扩展性。
UML的用途非常广泛,可以概括为描述、可视化、构造、记载4种基本功能,在业务建模、需求分析、系统设计、实现和测试、数据建模、项目管理等阶段任务中均可根据需要采用。
(二)UML基本内容和常用图表
1.UML基本内容
UML是一种可视化的面向对象的建模语言,描述了一个系统的静态结构和动态行为,用图形方式表现典型的面向对象系统的整个结构,从不同的角度为系统建模,并形成系统的不同视图。
结构性图表显示了系统在不同抽象层次和实现层次上的静态结构以及它们之间的相互关系。结构性图表中的元素表示系统中具意义的概念,可能包括抽象的、现实的和实现的概念。结构性图表有7种类型:①类图(class diagram);②组件图(component diagram);③部署图(deployment diagram)、配置图;④对象图(object diagram);⑤包图(package diagram);⑥复合结构图(composite structure diagram);⑦轮廓图(profile diagram)。
行为性图表显示了系统中对象的动态行为,可用以表达系统随时间的变化。行为性图表有7种类型:①用例图(use case diagram);②活动图(activity diagram);③状态机图(state machine diagram);④序列图(sequence diagram);⑤通讯图(communication diagram);⑥交互概述图(interaction overview diagram);⑦时序图(timing diagram)。
2.两种建模机制及其图形
从应用的角度看,当采用面向对象技术设计系统时,第一步是描述需求;第二步是根据需求建立系统的静态模型以构造系统的结构;第三步是描述系统的行为。其中在第一步与第二步中所建立的模型都是静态的,例图、类图、包图、对象图、组件图和配置图6个图形是标准建模语言UML的静态建模机制。第三步中所建立的模型表示执行时的时序状态或交互关系,它包括状态图、活动图、顺序图和合作图4个图形,是标准建模语言UML的动态建模机制。建模常用的五类10种图如下。
UML建模常用的UML图通常可以分为五类。
第一类:用例图(图4-1),从用户角度描述系统功能,并指出各功能的操作者。
图4-1 用例图
第二类:静态图,包括类图、对象图和包图。
(1)类图:描述系统中类的静态结构。不仅定义系统中的类,表示类之间的联系,如关联、依赖、聚合等,也包括类的内部结构(类的属性和操作),如图4-2所示。类图描述的是一种静态关系,在系统的整个生命周期都是有效的。
图4-2 类图
图4-3 医院病房管理系统状态图示例
(2)对象图:是类图的实例,几乎使用与类图完全相同的标识。它们的不同点在于对象图显示类的多个对象实例,而不是实际的类。一个对象图是类图的一个实例。由于对象存在生命周期,因此对象图只能在系统某一时间段存在。
(3)包图:由包或类组成,表示包与包之间的关系。包图用于描述系统的分层结构。
第三类:行为图(behavior diagram),描述系统的动态模型和组成对象间的交互关系。
(1)状态图:描述类的对象所有可能的状态以及事件发生时状态的转移条件。通常状态图是对类图的补充。在实用上并不需要为所有的类画状态图,仅为那些有多个状态其行为受外界环境的影响并且发生改变的类画状态图。图4-3是医院病房管理系统状态图示例。
(2)活动图:描述满足用例要求所要进行的活动以及活动间的约束关系,有利于识别并行活动。图4-4是门诊就诊业务活动图示例。
图4-4 门诊就诊业务活动图示例
第四类:交互图(interactive diagram),描述对象间的交互关系。其中:
(1)序列图:显示对象之间的动态合作关系,它强调对象之间消息发送的顺序,同时显示对象之间的交互,如图4-5所示。
(2)合作图:描述对象间的协作关系,合作图与时序图相似,显示对象间的动态合作关系。除显示信息交换外,合作图还显示对象以及它们之间的关系。如果强调时间和顺序则使用时序图;如果强调上下级关系则选择合作图。这两种图合称为交互图。
图4-5 序列图
第五类:实现图(Implementation diagram)。
(1)组件图(图4-6):又称为构件图,描述代码部件的物理结构及各部件之间的依赖关系。一个构件可能是一个资源代码部件、一个二进制部件或一个可执行部件。它包含逻辑类或实现类的有关信息。组件图有助于分析和理解部件之间的相互影响程度。
(2)部署图(图4-7):定义系统中软硬件的物理体系结构。它可以显示实际的计算机和设备(用节点表示)以及它们之间的连接关系,也可显示连接的类型及部件之间的依赖性。在节点内部,放置可执行部件和对象以显示节点与可执行软件单元的对应关系。
图4-6 组件图
图4-7 部署图