系统分析与设计 - 建模部分

用例建模

用例图(考点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

以下来自:

UML活动图参考

UML活动图指南

简单的控制流

分支和循环
  1. 操作:圆角矩形,文本 - 指定的操作

  2. 控制流:箭头

  3. 初始节点:第一个操作

  4. 最终结点:活动结束

  5. 决策节点:条件分支 - 单输入多输出,输入令牌只会在一个输出上显示

  6. 防护:指定令牌是否可以沿连接线流动

  7. 合并节点:多输入单输出

  8. 注释

  9. 调用行为的操作:在另一个活动图中进行了更详细定义的操作【大概不考】

并发流
  1. 分叉节点:单个流划分为并发流,每个传入令牌在每个传出连线上生成一个令牌

  2. 结点加入:并发流合并为单个流,每个输入流有等待令牌,输出生成一个令牌

  3. 发送信号:将消息/信号发送给另一个活动/同一活动并发线程

  1. 接受事件:等待消息/信号后才执行
数据流

一个操作到另一个操作

  1. 对象节点:传递的数据
  1. 输入插针:操作执行可以接受的数据
  1. 输出插针:操作执行时生成的数据

参数节点:通过节点活动接受/生成数据

控制流

  • 操作 + 连接器
  • 每个操作都在控制流的下一个操作开始之前结束
  • 操作重叠的情况下使用并发流

决策和循环

  • 决策节点 - 多个传出路径

  • 防护条件 - 知道何时采用每条路径

  • 合并节点 - 在分叉的两个或多个替代流组合在一起

    • 不是汇集操作组合,一个操作中组合并发流

结束活动

所有并发操作和子活动终止

使用多个活动最终节点减少其他连接线混乱程度

多泳道图

  • 描述2个以上组织、角色或系统之间的交互业务流程

领域建模(考点3)

https://sysu-swsad.github.io/swad-guide/08-domain-modeling

  • 描述问题域中事物及其之间的关系与量化的越是
  • 按照用例构建领域模型
    • 识别实体(entity)和中介实体(Model)

以下内容来自课本

如何创建领域建模(9.4)

  1. 寻找概念类(9.5)
  2. 绘制为UML类图的类
  3. 添加关联和属性

如何寻找概念类(9.5)

  1. 重用/修改现有模型
  2. 使用分类列表
  3. 确定名词短语

使用分类列表

  • 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)

https://sysu-swsad.github.io/swad-guide/09-domain-modeling

解决问题

  1. 从实例角度识别业务实践,完善、优化业务过程细节,细化业务过程与领域模型
  2. 给出业务过程合理性与完备性验证
  3. 为程序开发提供业务规范细节

符号体系

  • 描述一个事物或对象事件或消息刺激产生 可见的状态(属性/属性组合) 的数据变化。
  • 基础
    • 起始 - 黑点
    • 终止 - 圆圈内黑点
    • 状态 - 圆角矩形
  • 变迁 - event[guard]/动作
扩展符号(应该不考)
  • 复合状态
  • 信号

步骤

研究对象

识别状态集合

识别事件和变迁条件

合理性、完整性检查与逻辑分析


扣分点:

  1. 必须有起始,通常有终止和取消
  2. 状态命名:名词短语动词过去时正在进行时 - 延续性词汇
  3. 需求分析不涉及动作

架构设计

逻辑模型 & 包图(考点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)
发送给“自身”的消息
  • 书上和课上不一样
  • 1561899453704
实例的创建
  • 虚线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)

  • 符号
    • 虚线空箭头:接口实现
    • 实线空箭头:继承
    • 虚线箭头:依赖
    • 实线箭头:关联(多重性)
      • 多重性和角色名放在箭头一端