软件建模
什么是软件建模
将想法通过模型可视化地表达出来,方便记忆和进一步分析,方便团队/同事交流,口语交流容易失真。
软件建模体现了软件设计的思想,在需求和实现之间架起了一座桥梁,通过模型指导软件系统的具体实现。
模型并不是软件系统的一个完备表示,而是所研究系统的一种抽象。
如何进行软件建模
软件建模原则
1、选择正确的模型,模型要与现实相联系
2、从不同的视角,使用不同的模型去表示一个系统
3、模型是抽象的,是选取系统某个最显著的特征并进行简化表示,因此需要通过不同的视角采用不同模型表示:
- **外部视角:**对系统上下文或环境进行建模
- **交互视角:**对系统及其环境或者系统的构件之间的交互进行建模,建立用例模型
- **结构化视角:**对系统的组织或者系统所处理的数据的结构进行建模,建立静态模型
- **行为视角:**对系统的动态行为以及系统如何响应事件进行建模,建立动态模型
软件建模方法
在不同的领域和场景下有不同的软件建模方法,其各自的建模思想和采用的建模工具也不尽相同,如:
- 结构化方法(Structured Method)
- 面向对象方法(Object Oriented Method)
- 基于构件方法(Component Based Method)
- 面向服务方法(Service Oriented Method)
- 面向切面方法(Aspect Oriented Method)
- 模型驱动方法(Model Driven Method)
- 形式化方法(Formal Method)
本章仅介绍最常用,对开发人员普遍适用的面向对象建模。
软件建模工具
随着面向对象技术的不断发展和应用,形成了面向对象的建模标准,即**UML(Unified Modeling Language)**统一建模语言。UML是面向对象开发中一种通用的图形化建模语言,具有如下特点:
- **面向对象:**支持面向对象的主要概念,提供了一批基本的模型元素的表示图形和方法,能简洁明了地表达面向对象的各种概念
- **可视化、表示能力强:**通过UML的模型图能够清晰地表示系统的逻辑模型和实现模型,可用于各种复杂系统的建模
- **独立于过程:**是系统建模语言,独立于开发过程
- **独立于程序语言:**用UML建立的软件系统模型可以用Java、C++、Smalltalk等任何一种面向对象的程序设计来实现
- **易于掌握使用:**UML图形结构清晰,建模简洁明了,容易掌握使用
UML内容组成
UML由三部分组成:
- **事物:**是UML中重要的组成部分,是UML模型中最基本的面向对象的构造块。它们在模型中属于最静态的部分,代表概念上或物理上的元素。
- **关系:**把事物紧密联系在一起。
- **图:**是很多有相互相关的事物的组。
9种UML模型图
图 | 用途 |
---|---|
用例图 Use-Case Diagram | 用于描述角色以及角色与用例之间的连接关系(如:泛化、关联和依赖);说明的是谁要使用系统,以及他们 使用该系统可以做些什么,是一种静态模型 |
类图 Class Diagram | 用于描述系统中的类,以及各个类之间的关系(如:泛化、实现、依赖、关联、聚合、组合)。是一种静态模型。 |
对象图 Object Diagram | 与类图极为相似,它是类图的实例,对象图显示类的多个对象实例,而不是实际的类,它描述的不是类之间的关系, 而是对象之间的关系,是一种静态模型。 |
状态图 State Diagram | 用于描述类的对象所有可能的状态,以及事件发生时状态的转移条件,是对类图行为上的补充,是一种动态模型。 |
活动图 Activity Diagram | 用于描述用例要求所进行的活动,以及活动间的约束关系,有利于识别并进行活动,是一种动态模型。 |
顺序图 Sequence Diagram | 也叫序列图或时序图,用于描述参与者与系统对象之间有序的交互过程,强调消息是如何在对象之间被发送和 接收的,是一种动态模型。 |
合作图 Communication Diagram | 也叫协作图,与顺序图相似。用于描述对象间动态合作关系。可以看成是类图和顺序图的交集,重点描述对象之间 的相互通信关系。如果强调时间和顺序,则使用时序图;如果强调上下级关系,则选择合作图。是一种动态模型。 |
组件图 Component Diagram | 也叫构件图,用于描述代码构件的结构以及各种构件之间的依赖关系,是一种静态模型。 |
部署图 Deployment Diagram | 用于描述系统的物理部署。例如计算机和设备,以及它们之间是如何连接件的。是一种静态模型。 |
UML4+1视图
用例视图:使用用例图来描述
逻辑视图:描述系统的结构组成,使用类图、对象图
行为视图:用于系统运行时的交互过程,使用时序图、合作图、状态图、活动图
实现视图:也叫开发视图,使用组件图
部署视图:使用部署图
常见UML模型图
UML模型在软件开发流程中的应用
软件开发过程中,不同阶段需要用到不同的UML图,选择使用哪些图,需要深刻理解该图的主要用途,以及它表达的优势。
软件开发流程:
需求分析阶段:
常用模型图:用例图
对外部的参与者(Actor)以及它们所需要的系统功能建模,表示客户的需求
概要设计阶段:
常用模型图:类图、对象图、合作图、状态图、时序图、活动图
描述系统的静态结构,描述系统的动态特征
详细设计阶段:
常用模型图:类图、对象图、合作图、状态图、时序图、活动图
在详细设计阶段,把概要设计的结果扩展成技术解决方案,分析阶段的领域问题被嵌入在这个技术基础结构中
编码阶段:
把设计阶段的类转换成某种面向对象程序设计语言的代码
测试阶段:
常用模型图:类图、组件图、部署图
不同的测试阶段使用不同的UML图,如:单元测试使用类图和类的规格说明;集成测试阶段典型的使用组件图、部署图
静态图
用例图
用例图关键元素
描述用例图首先要确定参与者,即角色(Actors),Actors表示提供或接收系统信息的人或系统,他们是与系统有交互作用的人或事物,代表一个系统的使用者或外部通信的目标。
用例是系统中的一个功能单元,被描述为角色与系统的一次交互。用例需要从角色希望系统提供的功能中提取,而不是以系统自身的角度来提取,满足参与者的需求的用例才是好用例。
用例间的常见关系有包含(Include)、扩展(Extend)、泛化(Generalization)。用例也可以叫Use,表示本用例会用到被包含的其他用例,被包含的用例是可以被重用的;扩展用例是可选的,在特定场景下可以补充基础用例,降低基础用例的复杂性。 泛化体现了父子关系,表明存在派生和继承。
类图
类图中的关系,箭头指向较小的部分
1、实现(Realization):
是一种类与接口的关系,表示类是接口所有特征和行为的视线。例如:借阅者能查找书籍。
2、依赖(Dependency):
是一种使用的关系(非持久,局部变量),有单向依赖和双向依赖。但尽量避免使用双向依赖。
3、泛化(Generalization):
是一种继承关系,指定了子类继承父类的所有特征和行为。
4、关联(Association):
是一种拥有的关系(持久的,全局变量),它使一个类知道另一个类的属性和方法。例如:借阅者的节约记录或预约记录。聚合和组合属于特殊的关联关系。
5、聚合(Aggregation):
是整体与个体的关系,可以理解成把个体聚集在一起。个体可以独立分离,聚合为整体可以有更多功能。
6、组合(Composition):
是整体与局部的关系,整体的对象负责代表局部的对象的生命周期,可以理解成整体是由局部组成的。没有局部就无法组成整体。(强依赖关系,局部是必要的)
动态图
动态图用于描述系统的对象交互、活动流程、状态变迁等行为动态模型,通常在完成静态图建模之后进行相应的动态图建模。
动态模型是描述系统的功能是如何完成的,用时序图、活动图、状态图从不同的角度来描述对象和对象之间的交互。
时序图
**时序图是强调消息时间顺序的交互图。**描述了不同对象之间协助完成预期行为的动态过程。顺序图具有直观、形象的优点。对呈现、理解不同对象间的交互关系时序具有较大的帮助。
时序图的主要绘图元素
- 时序图将交互关系表示为一个二维图
- 纵向是时间轴,时间沿竖线向下延伸
- 横向代表了在协作中各独立对象的类元角色
- 类元角色用生命线表示
- 消息用从一个对象的生命线到另一个对象生命线的箭头表示
设计考虑:
为了突出关键设计步骤和设计意图,只关注主要交互流程,忽略无关异常分支
活动图
活动图用于对目标对象计算流程和工作流程建模。
- 一张活动图本质是一个流程图,它显示系统从一个活动到另一个活动的流程迁移
- 在完成用例建模后,通过活动图表示用例的活动步骤,用于描述用例模型,有助于用例的动态行为建模
- 也可以用于通用的流程图建模场景
四种基本建模元素
- 活动Activity:表示一个执行步骤
- 活动流Activity line:不同活动间的控制流或数据流
- 控制符Control node:分支控制符decision/merge,并发控制符fork/join
- 泳道Swimming line:用于表达不同的活动分组
活动图一般有开始和结束标志
泳道图是一种特殊的活动图,侧重“活动”属于哪个“对象”,同一对象的活动写在一条“泳道(Lane)”里面。
状态图
状态图描述了系统元素的状态条件和响应,它反映了类的对象可能具有的状态,以及状态变化的事件。
并不是所有的类都有相应的状态图,状态图仅用于具有下列特点的类:
具有若干个确定的状态,类的行为在这些状态会收到影响变为其他状态,另外也可为系统描述整体状态图。
状态图可用于类、用例或者整个系统。
主要概念:
- 状态(State):状态描述了一个类对象生命周期中的一个时间段。体现一个类在当前时间所处的状态。
- 事件(Event):事件是发生在时间和空间上的值得注意的事情,而这个事情可以引发状态变迁。事件可以分为:信号事件、调用事件、改变事件、时间事件等。
- 转换(Transition):事件发生后类的状态变迁的过程。转换要有引起转换的触发器事件、监护条件、转换的动作和转换的目标状态。
设计考虑:
为了维护状态的原子性,对于预约书借出过程,分解为两步:首先迁移到可借状态,然后再迁移到借出状态。
顺序图、活动图、状态图对比
顺序图、活动图、状态图都是描述事物的动态行为,其区别对比如下:
类别 | 建模对象 | 核心建模元素 | 建模时机 | 适用场景 |
---|---|---|---|---|
顺序图 | 多个不同对象的交互过程 | Role-Message | 在类图完成之后进行 | 描述复杂的多对象间交互。并发、 分支过多的场景会影响可理解性,不宜太复杂 |
活动图 | (特定对象或不同对象的) 不同活动之间的流动 | Activity-Control Flow | 在用例图或类图完成之后进行 | 描述涉及到复杂的活动步骤的用例。 特别是并发、分支等场景。 |
状态图 | (特定对象的)不同状态变迁 | State-Transition | 在用例图或类图完成之后进行 | 涉及到复杂的状态变化的场景,也适用于 并发场景,如网络连接的会话状态等。 |
Tips:
- 顺序图强调多个不同对象之间交互的先后顺序
- 活动图强调复杂流程中活动单元的分支处理
- 状态图强调特定对象在不同事件发生后的状态变化
小结
- 软件建模是构建正确可信软件系统的基础,是对软件系统的抽象,指导软件系统的实现。
- 软件建模是通过不同的视角,采用不同的模型去抽象描述一个系统(抽象,不是完整性描述),包括 外部视角、交互视角、结构化视角和行为视角。
- UML(Unified Modeling Language)是面向对象开发中一种通用的图形化建模语言,可视化、表达能力强,独立于过程和程序设计语言,易于掌握和使用。
- UML包括4种事物、4种关系、9种图。各个元素不是孤立的,是相互有机结合来表示一个软件系统。
- UML的9种模型又可以分为静态图和动态图两大类,静态图描述了系统以及各对象的组织形式,动态图描述了系统以及对象之间的交互活动过程。
- UML模型贯穿在软件开发流程各个环节。