Professional Documents
Culture Documents
苹果乔布斯的名言:“创造无非就是把事物联系起来”。
人们怎样才能更好地建立这类联系呢?
乔布斯又说:“你不可能在眺望未来时把生活中的每个点连接起来,
只有回顾时能才连点成线 。
第 3章
30 分钟认识 UML 顺序图
38
Android 架構師手冊_建模與圖形思考 By 高煥堂 2012
接着,点选<Sequence Diagram>,就会出现一张空白的顺序图,如下:
在空白的顺序图上方,有一排顺序图的元素(Element),简称「图素」,如下:
此列元素中的左边第 2 个就是「生命线」(Lifeline)图素,表达出一个对象
(或类别)生命周期里攸关事件(Event)的发生顺序线,简称生命线。当你点选此
图素(如上图所示),然后移动鼠标(Cursor)到图表上,按下鼠标键,就出现一
个生命线图素,如下:
39
Android 架構師手冊_建模與圖形思考 By 高煥堂 2012
这让你输入对象(或类别)的名称,例如输入名称:Activity, 如下:
同样地,还可以再拉出更多的生命线,如下:
40
Android 架構師手冊_建模與圖形思考 By 高煥堂 2012
当某个对象触发了事件(Event),发出讯息(Message),可能会引发另一个
对象的事件。UML 顺序图能表达这种事件的发生和连动顺序,所以又称为事
件追踪(Event-Trace)图。由于其形状很像栅栏,又俗称为栅栏图。
你可以在图形上表达上述的讯息传递关系。例如,选取<Message>图素,
如下:
41
Android 架構師手冊_建模與圖形思考 By 高煥堂 2012
就可以填入讯息名称了;例如 onCreate(),如下:
42
Android 架構師手冊_建模與圖形思考 By 高煥堂 2012
如果对照到大家所熟悉的程序码:
上图就表达了这段程序码里的:
z Activity 调用 myActivity 的 onCreate()函数。
z myActivity 执 行 onCreate()函 数 时 , 反 过 来 调 用 Activity 的
setContentView()函数。
43
Android 架構師手冊_建模與圖形思考 By 高煥堂 2012
Step-2. 选取<Message>图素,如下:
44
Android 架構師手冊_建模與圖形思考 By 高煥堂 2012
就能输入「诞生对象」的讯息名称,例如:new(),如下:
45
Android 架構師手冊_建模與圖形思考 By 高煥堂 2012
此时可以使用<Reply Message>图素,如下:
按键之后,出现如下:
46
Android 架構師手冊_建模與圖形思考 By 高煥堂 2012
47
Android 架構師手冊_建模與圖形思考 By 高煥堂 2012
上图就表达了这段程序码里的:
并取名为:Sequence DiagramA,就存档如下:
48
Android 架構師手冊_建模與圖形思考 By 高煥堂 2012
就产生一张新的顺序图了:
49
Android 架構師手冊_建模與圖形思考 By 高煥堂 2012
兹拉出 4 条生命线,如下:
50
Android 架構師手冊_建模與圖形思考 By 高煥堂 2012
在顺序图里填入讯息名称,并在左边属性表(Attribute Table)里填入条件
(Guard)名称,如下:
就得到顺序图:
51
Android 架構師手冊_建模與圖形思考 By 高煥堂 2012
52
Android 架構師手冊_建模與圖形思考 By 高煥堂 2012
如果,WMS 发现用户触摸(Click)屏幕上按钮,而且所按下的是<StopBtn>
按钮;就传递 onClick()讯息给 Button。此时,Button 又将此 onClick 讯息传送
给 myActivity,触发 myActivity 去执行 onClick()函数。如下图:
53
Android 架構師手冊_建模與圖形思考 By 高煥堂 2012
54
Android 架構師手冊_建模與圖形思考 By 高煥堂 2012
慶祝新開班,搶鮮特惠價,請勿錯過良機
詳細說明,請看<Android 論壇技術教育中心>網頁:
http://www.android1.net/?Forum32/thread-22965-1-1
或詢問:
AndroidEdu520@gmail.com (劉智勇收)
55
Android 架構師手冊_建模與圖形思考 By 高煥堂 2012
第 4 章
30 分钟认识 UML 用例图
56
Android 架構師手冊_建模與圖形思考 By 高煥堂 2012
接着,点选<UseCase Diagram>,就会出现一张空白的类别图,如下:
在空白的类别图上方,有一排类别图的元素(Element),简称「图素」,如下:
57
Android 架構師手冊_建模與圖形思考 By 高煥堂 2012
一个用例(Use Case)就是用户(User)来使用系统时,该用户期望系统提供
的一项功能或服务。所以每一个用例都会联结到它的用户,在 UML 里称之为
启动者(Actor)。这 Actor 的图素如下:
先点选了这个<Actor>图素,接着将鼠标移动到用例图里的任何位置,并
替它取个名称(例如“User”)按键,就出现如下:
58
Android 架構師手冊_建模與圖形思考 By 高煥堂 2012
每一个用例都会连结到它的用户。为了表达这项连结关系,可选取
<Association>图素如下:
刚才提到过,用户(User)对一个系统服务的期待(Expectation)就是一个用
例。一般而言,用户可能会对系统怀有多项的期待,此时该用户会连结到多
个用例。比方说,一个用户使用播放器的两项服务:Play MP4 和 Stop MP4。
就能在用例图上表达如下:
59
Android 架構師手冊_建模與圖形思考 By 高煥堂 2012
60
Android 架構師手冊_建模與圖形思考 By 高煥堂 2012
61
Android 架構師手冊_建模與圖形思考 By 高煥堂 2012
这意味着,用户怀着「播放 MP4」的目的(或期待)来使用播放系统,此时
系统必须提供服务来满足用户的这项目的。而所提供的服务里,包含了 Loading
和 Playing 两项小服务。再看下图:
62
Android 架構師手冊_建模與圖形思考 By 高煥堂 2012
这图说明了,有些情形下,小用例事先已经存在了,后来才出现大用例。
此时就能直接从新的大服务去包含(Include)已存在的小用例,可以减少对小用
例的重复描述(Description)。例如,用户提出一项新用例:Load MP3,其从云
端下载 MP3 的过程与下载 MP4 是一样的,于是就让新的 Load MP3 用例去包
含(Include)已存在的 Loading 小用例(如上图)。这意味着,Loading 小用例是
Load MP3 大用例里的一个片段,而且是必要的片段。换句话说,在执行 Load
MP3 服务的过程中,必然会去执行 Loading 小服务。
上述的<<include>>图素表达了两个用例之间「必要性」包含关系。此外,
UML 还 提 供 了 「 可 选 择 性 」 的 包 含 关 系 , 又 称 为 扩 充 (Extend) 关 系 , 以
<<Extend>>图素表示之,如下:
使用这个图素,可表达两个用例之间的扩充关系,如下图:
63
Android 架構師手冊_建模與圖形思考 By 高煥堂 2012
買漢堡特餐
Normal Scenario
Alternative Scenario
<<extend>>
贈送玩具
4.2 细说<<Include>>与<<Extend>>图素
通常,大用例表达出正常的情境(Normal Scenario),而新附加的小表达出
特殊或例外的程序(Alternative Scenario)。有些情形下,大用例事先已经存在了,
后来才出现小用例来做补充。此时就很轻松地让小用例去补充(Extend)已存在
的 大 用 例 , 可 以 减 少 对 大 用 例 的 重 复 描 述 。 为 了 让 你 对 <<Include>> 和
<<Extend>>两个图素有更精致的体会,兹再举一个例子来说明之:
64
Android 架構師手冊_建模與圖形思考 By 高煥堂 2012
此图说明了,当购买有一部多功能咖啡机时,用户有三种目的:煮热开
水、主温开水和煮咖啡;就以 UML 的用例图表示如上图所示。
也是因为这些功能,顾客才会买这咖啡机。其中,煮热开水和主温开水
两项用例,共同拥有一项服务片段(如 Boiling Water),就独立出来如下图:
接着又发现,在使用煮咖啡功能时,有些用户不想加糖、有些则不想奶
精;于是,使用<<Extend>>图素表达如下:
65
Android 架構師手冊_建模與圖形思考 By 高煥堂 2012
66
Android 架構師手冊_建模與圖形思考 By 高煥堂 2012
67
Android 架構師手冊_建模與圖形思考 By 高煥堂 2012
就建立了一个新的空白用例图,如下:
兹建立一个简单的用例图,如下:
68
Android 架構師手冊_建模與圖形思考 By 高煥堂 2012
从这个用例里,独立出一个小用例:
再独立出另一个小用例:
69
Android 架構師手冊_建模與圖形思考 By 高煥堂 2012
70
Android 架構師手冊_建模與圖形思考 By 高煥堂 2012
(ac01_layout 布局 ) (pu_layout 布局 )
现在,就来将这两个类别,表达于类别图里。先点选 package0,并选取<Create
Diagram><Add Class Diagram>来诞生一个新的空白类别图,如下:
71
Android 架構師手冊_建模與圖形思考 By 高煥堂 2012
72
Android 架構師手冊_建模與圖形思考 By 高煥堂 2012
然后,将它拖拉到右边的顺序图里,得到:
73
Android 架構師手冊_建模與圖形思考 By 高煥堂 2012
然后,将它拖拉到右边的顺序图里,得到:
74
Android 架構師手冊_建模與圖形思考 By 高煥堂 2012
填入布局名称之后,得到:
75
Android 架構師手冊_建模與圖形思考 By 高煥堂 2012
最后,从图素表里点选<Lifeline>图素,如下:
就 可 以 建 立 一 个 新 的 生 命 线 , 并 取 名 为 : SP, 其 表 示 Android 里 的
SharedPreferences 资料暂存机制。如下图:
76
Android 架構師手冊_建模與圖形思考 By 高煥堂 2012
现在,来表达这些对象的互动,及其讯息传递顺序。
z 用户启动 App 程序时,透过 Android 框架传送 Create()讯息给 ac01,触发
它去执行 onCreate()函数来建立 ac01_layout 布局。
77
Android 架構師手冊_建模與圖形思考 By 高煥堂 2012
78
Android 架構師手冊_建模與圖形思考 By 高煥堂 2012
79
Android 架構師手冊_建模與圖形思考 By 高煥堂 2012
以上完成了范例的建模过程。
// pickup.java
import android.app.Activity;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
80
Android 架構師手冊_建模與圖形思考 By 高煥堂 2012
其中,ac01 类别里的指令:
Intent in = new Intent(ac01.this, pickup.class);
startActivity(in);
就启动了 pickup。在 pickup 类别里的指令:
Editor passwdfile = getSharedPreferences("ITEM", 0).edit();
passwdfile.putString("ITEM",item.getTitle().toString());
passwdfile.commit();
finish();
~~ Continued ~~
81