EMACS & 程序 编程点滴...

天下难事必作于易,天下大事必作于细

Lastupdated: 2011-01-01

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)
表示严格的顺序限制

TOP协作图(Collaboration Diagram)

TOP对象图(Object Diagram)

TOP构建图(Component Diagram)

TOP配置图(Deployment Diagram)

© www.yifeiyang.net
net tracking

                                                                                                 stats