wordpress添加郵件輸入列表廈門網(wǎng)站優(yōu)化公司
DDD領(lǐng)域驅(qū)動設(shè)計批評文集
做強(qiáng)化自測題獲得“軟件方法建模師”稱號
《軟件方法》各章合集
《分析模式》中模型圖的UML改編,之前也有人做過,Martin Fowler網(wǎng)站上給出了部分改編成果。
這些改編成果只覆蓋了部分章節(jié),而且只是把類型圖(Type Diagram)改編成類圖。書中的動態(tài)模型圖,包括交互圖(Interaction Diagram)、事件圖(Event Diagram)和狀態(tài)圖(State Diagram)沒有改編。
網(wǎng)絡(luò)上其他地方也未搜到把書中的動態(tài)模型圖改編成UML模型圖的嘗試。
之前的改編只是把類型圖(Type Diagram)改編成類圖,原因可能是這個相對來說比較容易,而動態(tài)模型圖的改編更難一些。
動態(tài)模型圖中,交互圖和UML序列圖的對應(yīng),狀態(tài)圖和UML狀態(tài)機(jī)圖的對應(yīng)還是比較直接的,事件圖又更復(fù)雜一些。
2024中譯本(可能要到2025年初出版)將用UML改編全部模型圖,覆蓋全部章節(jié),包括靜態(tài)模型圖和動態(tài)模型圖。
**********
下面,我們來展示如何把事件圖轉(zhuǎn)成UML的活動圖。
全書第一張事件圖是圖3.15:?
圖1 《分析模式》圖3.15
Fowler在書中說,他是遵循James Odell的用法,并給出了參考書:James Martin和James Odell的Object-Oriented Methods: A Foundation(1995)。
UML1中的活動圖來源是比較復(fù)雜的。以下文字摘自Martin Fowler的UML Distilled第2版(1999):
the activity diagram combines ideas from several techniques: the event diagrams of Jim Odell, SDL state modeling techniques, workflow modeling, and Petri nets.
可以看到,UML1的活動圖參考了Odell的事件圖、SDL狀態(tài)建模、工作流建模和Petri網(wǎng)。
UML2的活動圖做了大變革,改為基于Petri網(wǎng)的語義,解除了和其他表示法的綁定。
**********
我們先給出改編后的結(jié)果:?
圖2 原書圖3.15的UML改編
并把圖3.15的活動參數(shù)類型和圖3.14的類圖上的類對應(yīng):?
圖3 圖3.15的活動圖和圖3.14類圖的對應(yīng)
改編后的圖3.15看起來比原圖復(fù)雜,但更嚴(yán)謹(jǐn)一些。
幾個值得一提的地方:
(1)事件改為數(shù)據(jù)
下圖是《分析模式》中給出的事件圖規(guī)范:?
圖4 《分析模式》中給出的事件圖規(guī)范
Odell的事件圖上,結(jié)點是操作,是動詞,輸出是事件類型(event type,區(qū)分于事件發(fā)生event occurrence),還是動詞。名詞(對象、數(shù)據(jù))呢?這個定義是有問題的。
Fowler可能也覺察到了這一點。圖1給出的原圖3.15中,Fowler在輸出的地方寫的是associated observation concepts(關(guān)聯(lián)觀察概念),這怎么看也不像是“事件類型”的命名,更像是輸出的數(shù)據(jù)。?
圖5 associated observation concepts怎么看也不像“事件類型”
(2)把evaluate proposal(評估提案)合并到“提議觀察”中
根據(jù)圖4的事件圖規(guī)范,菱形處應(yīng)該是一個布爾表達(dá)式,這是合理的。但《分析模式》原圖3.15中,菱形處所標(biāo)的evaluate proposal看起來像是行為,不是一個條件表達(dá)式,這應(yīng)該是Fowler的問題。?
圖6 《分析模式》原圖3.15的菱形處看起來不像條件表達(dá)式
在UML活動圖改編中,我們把evaluate proposal變成更合適的條件表達(dá)式。即使Fowler可能有這樣的原意,想在evaluate proposal中包含一些行為,也應(yīng)該把這些行為合并到Propose Observation中。
(3)添加了一個datastore(數(shù)據(jù)存儲)結(jié)點
“做觀察”活動應(yīng)該有兩個輸出,一個是關(guān)聯(lián)的觀察概念(一個“觀察概念”的對象集合),另外還應(yīng)該產(chǎn)生觀察的結(jié)果(一個“觀察”的對象集合)。
前者Fowler原圖有表達(dá),并作為“提議觀察”的輸入;后者Fowler原圖沒有表達(dá),所以添加一個datastore(數(shù)據(jù)存儲)結(jié)點接收“做觀察”產(chǎn)生的觀察結(jié)果數(shù)據(jù)及令牌。
(4)釘耙符號
改編的圖3.15中,結(jié)點圖標(biāo)右下角有一個釘耙形狀的符號,說明這是一個Action(動作),是對Activity(活動)的調(diào)用,而不是Activity本身。?
圖7 圖上是Action,不是Activity
Activity(活動)是定義。Activity Diagram(活動圖)描述活動的實現(xiàn),活動圖上并沒有“活動”,只有活動的調(diào)用(Action),調(diào)用的活動可以是其他活動,也可以是自己(遞歸)。
所以,平時我們見到的“流程圖”或“活動圖”,很多是不嚴(yán)謹(jǐn)?shù)?#xff0c;把定義和使用混在了一起。
**********
一些參考:
(1)2002年4月,James J. Odell在UMLChina做的交流
交流實錄在:umlchina.com/Chat/odell.htm
翻譯整理發(fā)表在《非程序員》2002年第5期,所有各期《非程序員》雜志的pdf下載:umlchina.com/xprogrammer/index1.html
(2)“水蒸餾器”案例
如果想深入學(xué)習(xí)活動圖,可以參考此案例,里面大量而且深入地使用了活動圖。
umlchina.com/url/video.html,里面的SYS-001番號。