EMACS & 程序 编程点滴...
天下难事必作于易,天下大事必作于细
UML

这里总结一些以前考 OMG-Certified UML Professional Advanced 和 OMG-Certified Real-time and Embedded Specialist Advanced 的笔记,以后查阅起来也方便。
TOP用例图(Use Case Diagram)
TOP使用目的
- 明确开发系统的主要功能,但不揭露系统内部结构
- 明确开发对象的范围,系统界限
- 明确开发系统对象与外部系统的关系
TOPActor的候补
- 外部系统
- 外部硬件设备
- 利用者
TOPUse Case 图中的关系
- << include >> 包含 : 是指用例中的包含关系,通常发生在多个用例中,有可以提取出来的公共部分(就象提取公因式 一样),例如 UseCaseA 中包括了 a 和 b 两个流程,而 UseCaseC 中包含了 c 和 b 两个流程。为了提高复用性,可以把 b 提取出来,形成另一个用例 UseCaseB,此时,UseCaseA include UseCaseB(表现为一条指向 UseCaseB 的虚线,箭头在 UseCaseB 侧),UseCaseC 也 include UseCaseB。因而,当有 include 关系时,被 include 的用例通常会被两个以上的其 他用例 include(否则就不需要重用,也就不需要提取出来了),用例图如下: 在 include 关系中,“UseCaseA 和 UseCaseC 知道 UseCaseB 的存在,而 UseCaseB 根本不知道有 UseCaseA 和 UseCaseC);
- << extend >> 扩张 : 则恰好相反。假设 UseCaseA 的功能描述为“发送一条通知”,可是,发送通知的方式可能有许多 种,例如通过邮件发送、通过短信发送等。在需求分析阶段,可能无法明确到底有多少种方式,在用例分析阶段,UseCaseA 需要留出扩展接口,然后把已知的发送方式作为扩展用例给出,例如 UseCaseB 是“通过短信发送”,而 UseCaseC 是“通过 邮件发送”,此时,UseCaseB 和 UseCaseC 作为新功能 extend 了 UseCaseA,表现为两根虚线,箭头指向 UseCaseA,用例 图如下: 在 extend 关系中,UseCaseA 不知道 UseCaseB 和 UseCaseC 的存在,但 UseCaseB 和 UseCaseC 却是知道 UseCaseA 并且 知道如何在 UseCaseA 中作扩展的。
- 泛化 : 与类一样,抽象的Use-Case也可以被继承,例如下图:Phone Order 与 Internet Order 都继承了 Place Order。 Actor 与 Use-Case 都支持泛化。
TOP活动图 (Activity Diagram)
活动图是UML用于对系统的动态行为建模的另一种常用工具,它描述活动的顺序,展现从一个活动到另一个活动的控制流。活动图在本质上是一种流程图。
虽然活动图与状态图都是状态机的表现形式,但是两者还是有本质区别:活动图着重表现从一个活动到另一个活动的控制流,是内部处理驱动的流程;而状态图着重描述从一个状态到另一个状态的流程,主要有外部事件的参与。
TOP活动图与流程图的区别
- 流程图着重描述处理过程,它的主要控制结构是顺序、分支和循环,各个处理过程之间有严格的顺序和时间关系。而活动图描述的是对象活动的顺序关系所遵循的规则,它着重表现的是系统的行为,而非系统的处理过程。
- 活动图能够表示并发活动的情形,而流程图不行。
- 活动图是面向对象的,而流程图是面向过程的。
除此之外,活动图可以:
- 描述活动之间的数据流或判断
- 提供多种不同的业务流程视图
- 描述用例中出现的活动
- 使用不同的非连续符号显示多种不同的活动
- 显示并行线程
TOP活动图与状态图比较
- 活动图和状态图描述的重点不同
-
活动图描述的是从activity到activity的控制流,而状态图描述的是对象的状态及状态之间的转移。
- 活动图和状态图使用的场合不同
- 对于以下几种情况可以使用活动图:
- 分析用例
- 理解涉及多个用例的工作流
- 处理多线程应用
- 对于下面的情况要使用状态图:
- 显示一个对象在其生命周期内的行为
TOP构成元素
| 元素 | 图形 | 意义 |
|---|---|---|
| 开始节点 | ![]() |
动作活动开始 |
| 活动终止节点 | ![]() |
整个活动的结束 |
| 流程终止节点 | ![]() |
表示子流程的结束 |
| 动作状态节点 | ![]() |
动作状态是指原子的,不可中断的动作,并在此动作完成后通过完成转换转向另一个状态。 |
| 分歧/合并节点 | ![]() |
表示根据条件产生流程分歧或者是流程合并 |
| 分叉/汇合节点 | ![]() |
对象在运行时可能会存在两个或多个并发运行的控制流,为了对并发的控制流建模,UML中引入了分叉与汇合的概念。分叉用于将动作流分为两个或多个并发运行的分支,而汇合则用于同步这些并发分支,以达到共同完成一项事务的目的。 |
| 数据存储对象 | ![]() |
表示存储数据的记忆装置等 |
| 对象节点 | ![]() |
表示被控制目标的对象,包含参数节点和pin节点 |
| 泳道 | ![]() |
泳道将活动图中的活动划分为若干组,并把每一组指定给负责这组活动的业务组织,即对象。 在活动图中,泳道区分了负责活动的对象,它明确地表示了哪些活动是由哪些对象进行的。 在包含泳道的活动图中,每个活动只能明确地属于一个泳道。 泳道是用垂直实线绘出,垂直线分隔的区域就是泳道。 在泳道的上方可以给出泳道的名字或对象的名字,该对象负责泳道内的全部活动。 泳道没有顺序,不同泳道中的活动既可以顺序进行也可以并发进行,动作流和对象流允许穿越分隔线。 |
| 异常处理 | ![]() |
当受保护的活动发生异常时,触发异常处理节点 |
| 设定参数 | ![]() |
动作状态节点侧面的突出表示设置的参数 |
| 事前处理/事后处理 | ![]() |
表示活动前的状态后之后的状态 |
| 中断可能领域 | ![]() |
表示领域内的的流程可能被中断 |
| 扩张领域 | ![]() |
分别处理输入的复数对象,然后再集合到一起输出 这时,处理每个对象的流程叫做 令牌(token) 令牌的控制方式有下面三种 iterative 按顺序一个一个地处理 parallel 并行处理 stream 多个令牌一次性处理 |
| 送信节点 | ![]() |
表示向对象发送信号,事件 |
| 受信节点 | ![]() |
表示接受信号或事件 |
| 待机节点 | ![]() |
表示计时器控制 |
TOP构造化活动节点
TOP例子


TOP状态迁移图(Statechart Diagram)
TOP构成要素
| 元素 | 图形 | 意义 |
|---|---|---|
| 开始状态(begin state) | ![]() |
表示范围内开始 |
| 终了状态(sink state) | ![]() |
表示范围内结束 |
| 状态1 | ![]() |
表示实体状态 |
| 状态2 | ![]() |
状态中表明功能 entry/进入状态动作 do/执行动作 exit/状态终了动作 |
| 状态迁移(transaction) | ![]() |
Trigger [guard] / effect 引起状态迁移的事件 【迁移的条件】/ 伴随迁移的行为动作 |
| 平行(concurrent) | ![]() ![]() ![]() |
fork pseudostate : 疑似分支状态 join pseudostate : 疑似结合状态 |
| 选择状态(conditional pseudo state) | ![]() ![]() ![]() |
表示接受到前面的状态后,为了选择下面的状态而进入一个虚拟的状态。根据条件,至少有一个状态被选中。 |
| 交叉状态(junction) | ![]() |
表示两个以上状态迁移的集成,或者是两个以上状态的发散状态,或者表示这两种情况。 |
| 合成状态(1)(composite state) | ![]() |
表示包含两个以上状态的合成状态。 |
| 合成状态(2)(composite state) | ![]() |
合成状态(1)的简略形式。 |
| 合成状态的入口状态(entry state) | ![]() |
表示合成状态的入口。 |
| 合成状态的出口状态(exit state) | ![]() |
表示合成状态的出口。 |
| 停止状态(terminate node) | ![]() |
终了状态是指针对某一处理的开始状态的终了状态,而停止状态表示状态机图中定义的所有完了的状态。 |
| 领域(region) | ![]() |
表示由多个独立的状态统合的某一综合状态。 |
| 状态链表(state list) | ![]() |
将复数的状态连接起来,表示某一共通的行为。比如反复重复处理该状态时使用。 |
| 浅的履历状态(history, shallow pseudo state) | ![]() |
表示返回到以前的状态。浅的履历表示只是形式上的返回,实际状态迁移后并不一定是迁移前的状态。 |
| 深度履历状态(history, deep pseudo state) | ![]() |
表示返回到以前的状态。深度履历表示实际状态迁移后一定是迁移前的状态。 |
TOP状态迁移表
状态迁移表可以从状态图中得到,反之也可以由状态迁移表得到具体的状态图。基本上基于C语言的嵌入式开发中,状态迁移表是必不可少的,同样在源代码中就有依赖于该表的map。
TOP状态 - 触发器(事件)

TOP状态 - next状态

TOP代码例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
static const p_func_void_void funcTbl[/* state */_STATE_NUM][/* event */_EVENT_NUM] = { /* event */ /* 0 */ /* 1 */ /* 2 */ /* 3 */ /* 4 */ /* 5 */ /* 6 */ /* 7 */ /* 8 */ /* 9 */ /* 10 */ /* 11 */ /* 12 */ /* 0 */ {FuncOpen, FuncClose , FuncReplyDummy, FuncReplyDummy, FuncReplyDummy, FuncIgnore, FuncIgnore, FuncIgnore, FuncIgnore, FuncIgnore, FuncIgnore, FuncIgnore, FuncIgnore }, /* 1 */ {FuncReplyDummy, FuncClose , FuncReplyDummy, FuncPageThumbnailListing, FuncReplyDummy, FuncReplyList, FuncIgnore, FuncIgnore, FuncIgnore, FuncIgnore, FuncTimeoutWaitStartList, FuncStorageUndetect, FuncIgnore }, /* 2 */ {FuncReplyDummy, FuncClose , FuncReplyDummy, FuncPageThumbnail, FuncSetSlideshowInThumbnail, FuncIgnore, FuncIgnore, FuncIgnore, FuncReplyThumbnail, FuncIgnore, FuncTimeoutWaitList, FuncStorageUndetect, FuncIgnore }, /* 3 */ {FuncReplyDummy, FuncClose , FuncChgSetting, FuncPageThumbnail, FuncSetSlideshowInThumbnail, FuncIgnore, FuncIgnore, FuncIgnore, FuncReplyThumbnail, FuncIgnore, FuncTimeoutWaitList, FuncStorageUndetect, FuncIgnore }, /* 4 */ {FuncReplyDummy, FuncClose , FuncReplyDummy, FuncReplyDummy, FuncSetSlideshowInSlideshow, FuncIgnore, FuncIgnore, FuncIgnore, FuncIgnore, FuncReplySetSlideshow, FuncTimeoutSlideshow, FuncStorageUndetect, FuncIgnore }, /* 5 */ {FuncReplyDummy, FuncClose , FuncReplyDummy, FuncReplyDummy, FuncSetSlideshowInSlideshow, FuncIgnore, FuncIgnore, FuncIgnore, FuncIgnore, FuncReplySetSlideshow, FuncTimeoutSlideshow, FuncStorageUndetect, FuncIgnore }, /* 6 */ {FuncReplyDummy, FuncClose , FuncReplyDummy, FuncReplyDummy, FuncSetSlideshowInDecode, FuncIgnore, FuncIgnore, FuncIgnore, FuncIgnore, FuncReplySetSlideshow, FuncTimeoutDecode, FuncStorageUndetect, FuncIgnore }, /* 7 */ {FuncReplyDummy, FuncClose , FuncReplyDummy, FuncReplyDummy, FuncReplyDummy, FuncIgnore, FuncIgnore, FuncIgnore, FuncIgnore, FuncIgnore, FuncIgnore, FuncStorageDetect, FuncIgnore }, /* 8 */ {FuncReplyDummy, FuncReplyDummy , FuncReplyDummy, FuncReplyDummy, FuncReplyDummy, FuncIgnore, FuncReplyClose, FuncIgnore, FuncIgnore, FuncIgnore, FuncIgnore, FuncIgnore, FuncIgnore }, /* 9 */ {FuncReplyDummy, FuncClose , FuncChgSettingInSorting, FuncReplyDummy, FuncReplyDummy, FuncIgnore, FuncReplyClose, FuncIgnore, FuncIgnore, FuncIgnore, FuncTimeoutWaitSort, FuncStorageUndetect, FuncReplySort }, /* 10 */ {FuncReplyDummy, FuncClose , FuncReplyDummy, FuncReplyDummy, FuncSetSlideshowInIllegalFile, FuncIgnore, FuncIgnore, FuncIgnore, FuncIgnore, FuncIgnore, FuncTimeoutSlideshow, FuncStorageUndetect, FuncIgnore }, }; ... while (1) { uint8_t event_id = 0xff; /* 等待Task到RUN状态 */ if (info->stat == _TASKSTAT_READY) { _task_yield(); continue; } /* 等待事件 */ _event = (event_t*)_msgq_receive_timed(g_evt_queue, g_timeout_evttask); /* 将event转换为ID */ _EventType2Id(_event, &event_id); /* 处理事件 */ if (event_id != 0xff) { funcTbl[g_state][event_id](&_event); } } ... |
TOP例子





TOP类図(Class diagram)
系统构成之间用类图来表述,各个类中有相应的属性和方法。
TOP构成元素
| 元素 | 图形 | 意义 |
|---|---|---|
| 基本类图元素 | ![]() |
类、接口,结构,枚举类型等 |
| 依存(Dependency Overview) | ![]() |
箭头指向功能提供一端 |
![]() ![]() ![]() |
||
| 关联(Association Overview) | ![]() |
关联端可以认为是类中的属性 |
![]() |
||
![]() |
||
![]() ![]() ![]() |
||
| 要求接口(Required Interface) | ![]() |
|
![]() |
接口实现 | |
| 实现接口(Interface Realization) | ![]() |
|
![]() |
接口使用 |
TOP属性
- 可视性 属性名称 : 类型 = 初期值 { 限制条件 }
+ public - private # protected ~ package
TOP方法
- 可视性 方法名称 ( 参数名 : 参数类型 ) : 返回值类型
TOP例子



TOP包图(Package Diagram)
TOP时序图(Sequence Diagram)
TOP构成元素
| 元素 | 图形 | 意义 |
|---|---|---|
| 生命线(Lifeline) | ![]() |
至少写明对象和类中的其中一个 |
| 执行式样(ExecutionSpecification) | ![]() |
执行状态的生命周期 |
| 停止(Stop) | ![]() |
生命线结束 |
| 同步消息(Synchronous) | ![]() |
同步函数调用 |
| 异步消息(Asynchronous) | ![]() |
异步函数调用 |
| 应答消息(Reply) | ![]() |
调用返回 |
| 创建消息(Create) | ![]() |
创建对象 |
| 销毁消息(Destruction Event) | ![]() |
销毁对象 |
| Found消息(Found) | ![]() |
消息由其他图上没反映的模块调用 |
| 终止消息(Lost) | ![]() |
调用其他图上没有反映的模块 |
| 状态变化 (State Invariant) | ![]() |
TOP复合段落
| InteractionOperator | 概念 | 图 | 意义 |
|---|---|---|---|
| ref | 相互作用(InteractionUse) | ![]() |
引用其他的时序图 |
| alt | 分歧处理(Alternative) | ![]() |
分支处理 |
| opt | 条件(Option) | ![]() |
满足条件时处理 |
| par | 并行(Parallel) | ![]() |
执行并列处理 |
| par-coregion | 并行(Parallel) | ![]() |
执行并列处理 |
| loop | 循环(Loop) | ![]() |
执行循环处理 |
| loop | 循环(Loop) | ![]() |
执行循环处理 |
| loop | 循环(Loop) | ![]() |
执行循环处理 |
| break | 返回(Break) | ![]() |
返回处理 |
| critical | 临界(Critical) | ![]() |
多进程时,表示排他处理 |
| assert | 断言(Assert) | ![]() |
表示处理是否妥当 |
| neg | 否定(negation) | ![]() |
表示不应该执行的处理 |
| ignore | 无效(ignore) | ![]() |
表示不重要的处理 |
| consider | 有效(Consider) | ![]() |
表示重要的处理 |
| seq | 弱时序(weak sequence) | ![]() |
表示没有严格的顺序限制 |
| strict | 强时序(Strict) | ![]() |
表示严格的顺序限制 |


















































































