系统分析与设计 - 建模部分
用例建模
用例图(考点1)
课件地址:https://sysu-swsad.github.io/swad-guide/06-usecase-modeling
需求识别
系统
- 使用
system框
并命名,避免命名空泛
参与者
- 系统左边
依赖的逮捕系统
Neighboursystem框
表示,构造型识别<<system>>
- 系统<<service>>
- 服务<<device>>
- 设备
用例
用户级用例
- 参与者驱动
- manage 用例
子用例
- 业务复用
- 复杂业务分解
关系
<<include>>
- 子用例必须<<extend>>
- 子用例可选<<include>>
箭头指向子用例,<<extend>>
箭头指向父用例
用例和Actor
- 无方向线
活动图(考点2)
课件地址:https://sysu-swsad.github.io/swad-guide/07-usecase-modeling
以下来自:
简单的控制流
分支和循环
操作:圆角矩形,文本 - 指定的操作
控制流:箭头
初始节点:第一个操作
最终结点:活动结束
决策节点:条件分支 - 单输入多输出,输入令牌只会在一个输出上显示
防护:指定令牌是否可以沿连接线流动
合并节点:多输入单输出
注释
调用行为的操作:在另一个活动图中进行了更详细定义的操作【大概不考】
并发流
分叉节点:单个流划分为并发流,每个传入令牌在每个传出连线上生成一个令牌
结点加入:并发流合并为单个流,每个输入流有等待令牌,输出生成一个令牌
发送信号:将消息/信号发送给另一个活动/同一活动并发线程
- 接受事件:等待消息/信号后才执行
数据流
一个操作到另一个操作
- 对象节点:传递的数据
- 输入插针:操作执行可以接受的数据
- 输出插针:操作执行时生成的数据
参数节点:通过节点活动接受/生成数据
控制流
- 操作 + 连接器
- 每个操作都在控制流的下一个操作开始之前结束
- 操作重叠的情况下使用并发流
决策和循环
决策节点 - 多个传出路径
防护条件 - 知道何时采用每条路径
合并节点 - 在分叉的两个或多个替代流组合在一起
- 不是汇集操作组合,一个操作中组合并发流
结束活动
所有并发操作和子活动终止
使用多个活动最终节点减少其他连接线混乱程度
多泳道图
- 描述2个以上组织、角色或系统之间的交互业务流程
领域建模(考点3)
- 描述问题域中事物及其之间的关系与量化的越是
- 按照用例构建领域模型
- 识别实体(entity)和中介实体(Model)
以下内容来自课本
如何创建领域建模(9.4)
- 寻找概念类(9.5)
- 绘制为UML类图的类
- 添加关联和属性
如何寻找概念类(9.5)
- 重用/修改现有模型
- 使用分类列表
- 确定名词短语
使用分类列表
- P104:业务交易、交易项目、与交易或交易项目相关的产品或服务、交易记录的地方、与交易相关的人或组织的角色+用例的参与者、交易/服务地点、重要事件(需要记录的时间地点)、物理对象、事物的描述、类别、事物的容器、容器中的事物、其他协作系统、金融工作合约法律材料记录、金融手段、执行工作所需的进度表、手册、文档
使用名词短语
名词/名词短语来自用例/其他文档/专家想法
名词短语为候选的概念类或概念类的属性
事件中直接将概念类绘制为UML类图
报表对象的处理(9.9)
- 一般不现实其他信息的报表
- 作为凭证/必要属性时需要,e.g.退货需要小票
使用领域术语(9.10)
- 不要凭空增加事物
属性与类的常见错误(9.12)
- 如果概念类XX不是现实中的数字或文本,XX八成为概念类
描述类(9.13)
e.g. 价格独立于汉堡,航线独立于航班
- 需要有关商品或服务的描述,独立于任何商品或服务的现有实例
- 删除所描述事物的实例后,导致信息丢失,而这些信息是需要维护的,但错误地与所删除事物关联起来
- 减少冗余或重复信息
关联(9.14)
- 对象之间需要持续一段时间的关系需要关联表示
避免加入大量关联
关联表示法
- 类之间连线,首字母大写的关联名称
- 末端多重性表达式 -> 类的实例之间的数量关系
- ”阅读导向箭头“(实心三角)阅读关联名称的方向
关联的命名
- 类名 - 动词短语 - 类名(动词短语构成可读的和有意义的顺序)
角色
- 定义:关联的每一端
- 可选项:
- 多重性表达式
- 名称
- 导航
多重性
- 类A有多少个实例可以和类B的一个实例关联
- 对于一个关联在不同时间段/条件/场景下有不同多重性时,根据关注点自行选择
两个类之间多个关联
- e.g. Flight - Flies from - Airport, Flight - Flies to - Airport,
如何在常见关联列表中找到关联
- A是B的相关交易(paid-by)、一个项目(contains)、产品(records-sale-of)或服务、相关的角色、物理或逻辑部分、被物理或逻辑地包含在B中、B地描述、在B中被感知(is-on)/记日志/记录/生成报表/捕获、B的成员(member of)、B的组织化子单元、使用/管理/拥有B(contains)、与B相邻
属性(9.16)
- 对象的逻辑数值
准则:何时展示属性
- 当需求(用例)建议或暗示需要记住信息时,引入属性
属性表示法
类框图的第二格表示,类型和其他信息可选
visibility name: type multiplicity = default {property-string}
visibility属性可见性一般为私有,一般不显示标出可见性符号
multiplicity可能出现的值或者这填充到集合属性中的对象数量,e.g. [0..1]表示可选值
**{property-string}**最常用的值
导出属性
- 表示方法:在属性名称前加以
/
符号 - 从多重性值导出的属性
准则:什么样的属性类型是适当的
数据类型属性
- 大部分属性应该是“简单”数据类型:Boolean, Date, Number, Character, String(Text)和Time; 以及Address, color, geometrics, phone number, social security number, universal product code, SKU, ZIP以及邮政编码。
- 把复杂领域概念建模为属性是错误的 - 通过关联描述概念类的关系
数据类型
- 对数据类型等价性检验不是基于标识,而是根据值判断
准则:何时加入数据类型
- 由不同小节组成:电话、人名
- 具有与之相关的操作:社会安全号
- 其他属性:e.g. 促销价格可能有开始日期和结束日期
- 单位的数量:支付总额具有货币单位
加入的数据类型可以表示为属性也可以表示为单独的类
准则:任何属性都不表示外键
- 属性不应该用于表示概念类的关系,应采用关联
准则:对数量和单位建模
- 数量:Quantity类/类型
- 单位:Unit
状态建模(考点4)
解决问题
- 从实例角度识别业务实践,完善、优化业务过程细节,细化业务过程与领域模型
- 给出业务过程合理性与完备性验证
- 为程序开发提供业务规范细节
符号体系
- 描述一个事物或对象受事件或消息刺激产生 可见的状态(属性/属性组合) 的数据变化。
- 基础
- 起始 - 黑点
- 终止 - 圆圈内黑点
- 状态 - 圆角矩形
- 变迁 -
event[guard]/动作
扩展符号(应该不考)
- 复合状态
- 信号
步骤
研究对象
识别状态集合
识别事件和变迁条件
合理性、完整性检查与逻辑分析
扣分点:
- 必须有起始,通常有终止和取消
- 状态命名:名词短语、动词过去时或正在进行时 - 延续性词汇
- 需求分析不涉及动作
架构设计
逻辑模型 & 包图(考点5)
https://sysu-swsad.github.io/swad-guide/11-architecture-design-methods
- 三层模型(表示层、业务层、持久化层)
- 表示层:按用户角色划分分区
- 业务层:按业务功能服务划分分区
- 持久化层:按核心交易实体管理
以下内容来自课本chapter13
- 逻辑架构是软件类的宏观组织结构,将软件类组织为包、子系统和层
- 层 - 对类、包、子系统的粗粒度分组
- 宽松分层架构 - 可以调用其下任何一层的服务
包图(13.5)
- 描述系统的逻辑结构 - 层、子系统、包
UML包
- UML能够组织任何事物:类、其他包、用例
- 包内部显示了成员,则在标签上标识包名;否则可以在包体内标识包名
依赖线
- 带有箭头的虚线,箭头指向被依赖的包
准则:使用层进行设计(13.6)
- 较低层是低级别和一般性服务,较高层与应用相关
概念区分
- 层:对系统在垂直方向的划分
- 分区:对系统在水平方向的划分
准则:不要将外部资源表示为最底层
- 这是物理,而非逻辑
准则:模型 - 视图分离原则
不要将非UI对象直接与UI对象连接或耦合
不要在UI对象方法中加入应用逻辑
从UI层发送到领域层的消息是SSD所描述的消息
部署模型(考点6)
基本元素
- artifacts:项目编译后生成的程序包
- components: 具有特定接口的功能部件,一个artifacts可以包含多个components,一个component也可以涉及多个artifacts
- device, host, execute environment(EEN): 容器/节点
<<container catalog>>
分类{key: value, ...}
表示属性描述
- 关联:通讯模式或协议、网络连接
以下内容来自课本chapter38
- 部署图表示如何将具体软件制品分配到计算节点(具有处理服务的某种事物)上。
- 表示软件元素在物理架构上的部署
- 使用构造型标记节点类型
- 设备节点或EEN可以包含其他EEN
- 具体实例名称带有下划线,没有下划线表示类而非实例;交互图实例(顺序图)中以生命线框图表示的实例名称没有下划线
构件图(考点7)
以下内容来自课本chapter38
- 构件表示封装了其内容的系统模块
- UML是设计级别的试图,并不存在于工具软件试图
系统顺序图(课本Chapter10)
- 系统相关的输入和输出事件
- 展示直接与系统交互的外部参与者、系统以及由参与者发起的系统事件
- 时间顺序自上而下,遵循场景顺序
- 系统被视为黑盒,强调从参与者到系统的跨越系统边界的事件(做什么,而非如何做)
- 通常不在SSD中显示用例文本
- 系统事件以动词开始
详细设计
对象动态建模(考点8)
顺序图(课本Chapter 15)
- 顺序图中没有发送者的起始消息要使用黑点标记起点
常用的UML交互图表示法(15.3)
使用生命线框图表示参与者
- 生命线框图表示交互的参与者
- 未命名实例 -
:类名
- 命名实例 -
实例名:类名
- 元类 -
<<metaclass>> 类名
- 数组 -
实例名:ArrayList<类名>
- 数组元素 -
实例名[i]:类名
- 接口/抽象类 -
实例名:接口/抽象类名
- 未命名实例 -
单实例对象
在生命线框图右上角标识”1”
顺序图的基本表示法(15.4)
消息
- 带实心箭头的实线 - 同步消息
- 最开始的消息在UML中称为创始消息,实心圆表示
表示应答或返回
returnVar = message(parameter)
发送给“自身”的消息
- 书上和课上不一样
实例的创建
- 虚线,
create
- 开放箭头 - 暗示调用构造器
- 实心箭头 - 调用操作符
new
并调用构造器
对象生命线和对象的销毁
显示销毁对象,大X和短生命线(P168)
UML顺序图中图框
- 操作符 & 保护信息
操作符 | 含义 |
---|---|
alt | 选择,互斥条件逻辑 |
loop | 保护信息为真的循环片段;loop(n) 指明循环次数 |
opt | 保护信息为真时执行的可选片段 |
par | [] 并行执行的并行片段 |
region | [] 只能执行一个线程的临界片段 |
注意alt和opt的区别在于opt里面只有一个条件,没有else if, else的关系,条件为真就执行;alt使用虚线隔开if, else if, else…
有条件消息[opt]
- 保护信息置于相关的生命线之上
互斥条件[alt]
- 不同的分支之间在图框内采用横虚线隔开
对集合的迭代[loop]
在保护信息设置循环条件,并在表示消息的横线下方设置动作图框(圆角矩形),写i++
保护信息和动作框图在同一条生命线上
右侧框图为选择器表达式
实例名[i]:类名
也可以同时不写保护信息和动作图框
关联交互图
- 整个顺序图周围放置图框,命名为
sd 名称
- 在主顺序图加入标记为ref的图框(引用),内容写需要引用的周围图框的名称(即sd后面的部分)
对类调用静态方法的消息
- 使用元类的生命线框图表示接受消息的对象是类
多态消息和案例
消息的接受者直接写
:抽象类名{abstract}
,并且停止在该消息,不要再展示更多信息也可以选择为多态的每个具体情况做单独的图
通信图的基本表示方法(15.5)
链
- 连接两个对象,多个消息沿着一条链流转
消息
- 使用消息表达式和消息方向的小箭头表示
- 增加顺序编号表示当前控制线程中消息的次序
自身传递的消息
- 使用到自身的链表示
实例的创建
create
消息的顺序编号
- 不为第一个消息编号
- 使用合法编号方案表示后续消息的顺序和嵌套,嵌套消息使用附加数字
有条件消息
- 顺序编号后使用带有方括号的条件子句表示有条件消息
[]
互斥的有条件路径
- 使用条件字母修改顺序编号,后续的嵌套消息仍然沿用并附加其外部消息的顺序编号
迭代或循环
- 在消息编号后使用
[i=1...n]
表示迭代,如果迭代子句不重要,使用*
简化
集合的迭代
- 和迭代循环类似,消息的接受者变为
实例名[i]:类名
调用静态方法的消息 & 多态消息
- 和顺序图类似,修改框图内容以及具体化多态的每个情况
对象静态建模(考点9)
- 符号
- 虚线空箭头:接口实现
- 实线空箭头:继承
- 虚线箭头:依赖
- 实线箭头:关联(多重性)
- 多重性和角色名放在箭头一端