软件工程复习 第六章
面向对象方法与UML
面向对象的软件工程方法
基本观点
客观世界是由对象组成的,任何客观的事物或实体都是对象,复杂的对象可以由简单的对象组成。
具有相同数据和相同操作的对象可以归并为一个类,对象是对象类的一个实例。
类可以派生出子类,子类继承父类的全部特性(数据和操作) ,又可以有自己的新特性。子类父类形成类的层次结构。
对象之间通过消息传递相互联系。类具有封装性,其数据和操作等对外界是不可见的,外界只能通过消息请求进行某些操作,提供所需要的服务。
基本概念
面向对象:按人们认识客观世界的系统思维方式,采用基于对象的概念建立模型,模拟客观世界分析、设计、实现软件的办法。通过面向对象的理念使计算机软件系统能与现实世界中的系统一一对应。
对象:即指现实世界中各种各样的实体。它可以指具体的事物,也可以指抽象的事物。在面向对象概念中我们把对象的内部状态称为属性,把运动规律称为方法或事件。
类:类是具有相似内部状态和运动规律的实体的集合。对于一个具体的类,它有许多具体的个体,我们就管这些个体叫作“对象”。类的内部状态是指类集合中对象的共同状态;类的运动规律是指类集合中对象的共同运动规律。
消息:消息是指对象间相互联系和相互作用的方式。一个消息主要由5部分组成:发送消息的对象、接收消息的对象、消息传递办法、消息内容、反馈。
包:现实世界中不同对象间的相互联系和相互作用构成了各种不同的系统,不同系统间的相互联系和相互作用构成了更庞大的系统,进而构成了整个世界。在面向对象概念中把这些系统称为包
接口:在系统间相互作用时为了蕴藏系统内部的具体实现,系统通过设立接口界面类或对象来与其他系统进行交互;让其他系统只看到这个接口界面类或对象,这个类在面向对象中称为接口类。
类的特性
抽象:类的定义中明确指出类是一组具有内部状态和运动规律对象的抽象,抽象是一种从一般的观点看待事物的方法,它要求我们集中于事物的本质特征,而非具体细节或具体实现。
②继承:继承是类不同抽象级别之间的关系。在计算机软件开发中采用继承性,提供了类的规范的等级结构;通过类的继承关系,使公共的特性能够共享,提高了软件的重用性
③封装:对象间的相互联系和相互作用过程主要通过消息机制得以实现。对象之间并不需要过多地了解对方内部的具体状态或运动规律。面向对象的类是封装良好的模块,类定义将其说明与实现显式地分开,其内部实现按其具体定义的作用域提供保护。类是封装的最基本单位。封装防止了程序相互依赖而带来的变动影响。在类中定义的接收对方消息的方法称为类的接口。
多态:多态是指同名的方法可在不同的类中具有不同的运动规律。在父类演绎为子类时,类的运动规律也同样可以演绎,演绎使子类的同名运动规律或运动形式更具体,甚至子类可以有不同于父类的运动规律或运动形式。不同的子类可以演绎出不同的运动规律
重载:重载指类的同名方法在给其传递不同的参数时可以有不同的运动规律。在对象间相互作用时,即使接收消息对象采用相同的接收办法,但消息内容的详细程度不同,接收消息对象内部的运动规律也可能不同。
特征
把数据和操作封装在一起,形成对象。对象是构成软件系统的基本构件
把特征相似的对象抽象为类
类之间可以存在继承或被继承的关系,形成软件系统的层次结构
对象之间通过发送消息进行通信
将对象的私有信息封装起来。外界不能直接访问对象的内部信息,而必须是发送相应的消息后,通过有限的接口来访问。
优势
符合人类的思维习惯
稳定性好
可复用性好
可维护性好
实施步骤
面向对象分析:从问题陈述入手,分析和构造所关心的现实世界问题域的模型,并用相应的符号系统表示。
确定问题域,包括定义论域、选择论域、根据需要细化和增加论域
区分类和对象,包括定义对象、定义类、命名
区分整体对象以及组成部分,确定类的关系以及结构
定义属性,包括确定属性、安排属性
定义服务,包括确定对象状态、确定所需服务、确定消息联结
确定附加的系统约束
面向对象设计
应用面向对象分析,改善和完善用其他方法得到的系统分析结果
设计交互过程和用户接口
设计任务管理,根据前一步骤确定是否需要多重任务,确定并发性,确定以何种方式驱动任务,设计子系统以及任务之间的协调与通信方式,确定优先级
设计全局资源,确定边界条件,确定任务或子系统的软、硬件分配
面向对象实现:使用面向对象语言实现面向对象的设计相对比较容易。用非面向对象语言实现面向对象的设计时,特别需要注意和保留程序的面向对象结构
面向对象测试:对面向对象实现的程序进行测试,包括模型测试、类测试、交互测试、系统(子系统)测试、验收测试等
统一建模语言(Unify Modeling Language)
统一建模语言(Unified Modeling Language,UML)是一种通用的可视化建模语言,可以用来描述、可视化、构造和文档化软件密集型系统的各种工件。它是由信息系统和面向对象领域的3位著名的方法学家GradyBooch、James Rumbaugh和Ivar Jacobson提出的。它记录了与被构建系统有关的决策和理解,可用于对系统的理解、设计、浏览、配置、维护以及控制系统的信息。这种建模语言已经得到了广泛的支持和应用,并且已被ISO组织发布为国际标准。
UML是一种标准的图形化建模语言,它是面向对象分析与设计的一种标准表示
它不是一种可视化的程序设计语言,而是一种可视化的建模语言
它不是工具或知识库的规格说明,而是一种建模语言规格说明,是一种表示的标准
它不是过程,也不是方法,但允许任何一种过程和方法使用它。
特点
统一标准
面向对象
可视化,表达能力强大
独立于过程
容易掌握使用
与编程语言的关系
应用范围
- UML以面向对象的方式来描述系统。UML最广泛的应用是对软件系统进行建模,但它同样适用于许多非软件系统领域的系统。从理论上来说,任何具有静态结构和动态行为的系统都可以使用UML建模。当UML应用于大多数软件系统的开发过程时,它从需求分析阶段到系统完成后的测试阶段都能起到重要作用。
组成
UIL符号为开发者或开发工具使用这些图形符号和文本语法为系统建模提供了标准
这些图形符号和文字所表达的是应用级的模型,在语义上它是U0元模型的实例
UIL模型由事物、关系和图组成
静态建模机制
任何建模语言都以静态建模机制为基础,UML也不例外。UML的静态建模机制包括用例图、类图、对象图、包图等。
用例图
用例图是从用户的角度描述系统的功能,由用例(Use Case)、参与者(Actor)以及它们的关系连线组成。
用例的特征用例是从用户角度描述系统的行为,它将系统的一个功能描述成一系列的事件,这些事件最终对操作者产生有价值的观测结果。参与者(也称为操作者或执行者)是与系统交互的外部实体,可能是使用者,也可能是与系统交互的外部系统、基础设备等。用例是一个类,它代表一类功能而不是使用该功能的某一具体实例。
包含关系
- 如果系统用例较多,不同的用例之间存在共同行为,可以将这些共同行为提取出来,单独组成一个用例。当其他用例使用这个用例时,它们就构成了包含关系。
扩展关系
- 在用例的执行过程中,可能出现一些异常行为,也可能会在不同的分支行为中选择执行,这时可将异常行为与可选分支抽象成一个单独的扩展用例,这样扩展用例与主用例之间就构成了扩展关系。一个用例常常有多个扩展用例。
泛化关系
- 用例之间的泛化关系描述用例的一般与特殊关系,不同的子用例代表了父用例的不同实现。
类图和对象图
类图使用类和对象描述系统的结构,展示了系统中类的静态结构,即类与类之间的相互关系。类之间有多种联系方式,如关联(相互连接)、依赖(一个类依赖于或使用另一个类)、泛化(一个类是另一个类的特殊情况)。一个系统有多幅类图,一个类也可以出现在几幅类图中。
对象图是类图的实例,它展示了系统在某一时刻的快照。对象图使用与类图相同的符号,只是在对象名下面加上下画线。
包图
包是一种对元素进行分组的机制。如果系统非常复杂,常常包含大量的模型,为了便于理解以及将模型独立出来用于复用,对这些元素进行分组组织,从而作为一个个集合进行整体命名和处理。
动态建模机制
系统中的对象在执行期间的不同时间点如何通信以及通信的结果如何,就是系统的动态行为,也就是说,对象通过通信相互协作的方式以及系统中的对象在系统生命期中改变状态的方式,是系统的动态行为。UML的动态建模机制包括顺序图、协作图、状态图和活动图。
顺序图
顺序图描述了一组对象的交互方式,它表示完成某项行为的对象和这些对象之间传递消息的时间顺序。顺序图由对象(参与者的实例也是对象)、生命线、控制焦点、消息等组成。生命线是一条垂直的虚线,表示对象的存在时间;控制焦点是一个细长的矩形,表示对象执行一个操作经历的时间段;消息是作用于控制焦点上的一条水平带箭头的实现,表示消息的传递。
绘制顺序图的步骤如下
列出启动该用例的参与者
列出启动用例时参与者使用的边界对象
列出管理该用例的控制对象
根据用例描述的所有流程,按时间顺序列出分析对象之间进行消息传递的序列
绘制顺序图需要注意以下问题。
如果用例的事件流包含基本流和若干备选流,则应当对基本流和备选流分别绘制顺序图
如果备选流比较简单,可以合并到基本流中
如果事件流比较复杂,可以在时间方向上将其分成多个顺序图
实体对象一般不会访问边界对象和控制对象。
协作图
协作图显示多个对象及它们之间的关系,对象间的箭头显示消息的流向。消息上也可以附带标签,表示消息的其他信息,如发送顺序、显示条件、迭代和返回值等。开发人员熟识消息标签的语法之后,就可以读懂对象之间的通信,并跟踪标准执行流程和消息交换顺序。但是,如果不知道消息的发送顺序,就不能使用协作图来表示对象关系。图6-21为某个系统的“登录”交互过程的简要协作图。
状态图
状态图由状态机扩展而来,用来描述对象对外部对象响应的历史状态序列,即描述对象所有可能的状态,以及哪些事件将导致状态改变。状态图包括对象在各个不同状态间的跳转以及这些跳转的外部触发事件,即从状态到状态的控制流。状态图侧重于描述某个对象的动态行为,是对象的生命周期模型。并不是所有的类都需要画状态图,只有明确意义的状态、在不同状态下行为有所不同的类,才需要画状态图。状态图在4.3.3节中已经介绍,这里不再赘述。
活动图
活动图是展示整个计算步骤的控制流(及其操作数)的节点和流的图。执行的步骤可以是并发的或顺序的。
描述物理架构的机制
系统架构分为逻辑架构和物理架构两大类。逻辑架构完整地描述系统的功能,把功能分配到系统的各个部分,详细说明它们是如何工作的。物理架构详细描述系统的软件和硬件,描述软件和硬件的分解。在UML中,用于描述逻辑架构的图有:用例图、类图、对象图、状态图、活动图、协作图和顺序图;用于描述物理架构的图有:构件图、部署图。
构件图
构件图根据系统的代码构件显示系统代码的物理结构。