決戰 OOAD 系列(一):使用 UML 分析的黃金三角

image

前言

最近,經由前前公司的同事介紹下,他目前所處的單位有一個教育訓練的需求,該需求是這樣的:

一、團隊中有許多人從 notes 轉換到.NET開發不久,目前工作為 SA ,但是對於從 SA 工作到 SD 的銜接總是有點卡卡的。

二、團隊中現有 SD 對於 ASP.NET MVC 的開發不甚了解,希望藉由課程能夠順便讓其了解在 .NET 平台上能夠做到那些事情 (泛指在 Architecture Design 上,.NET 平台上能提供什麼?)

三、但是聽眾中大部分為 SA,所以希望能從系統分析開始講,一路到設計、實作,希望是一個一條龍的課程。

四、加上目前團隊正在大量地使用 UML 作為系統分析的 notations,所以,希望系統分析 SA 的課程的部分已 UML 為主。

恩,所以此課程名稱最便成為:『ASP.NET MVC 與(SA 系統分析/SD 系統設計)與 OOAD/UML 軟體系統開發課程』,課程名稱非常長吧?沒錯!XDDDD 而且內容非常 非常 非常硬….. 因為課程必須使用真實的例子,最好是客戶目前實際地 Case,而且要從 SA 開始 (教如何繪製 Use Case + Domain Class Diagram + Sequence Diagram)、到 SD 該如何讓 UML 與平台 & 語言有關?MDA 是怎麼回事等,所有繪製的 UML 圖型必須能夠與程式撰寫銜接上喔,因為許多人會畫圖,但是,你畫的圖能寫程式嗎?多數人是不清楚的,而剛好,我對於 UML 中的 SA 與 SD 如何銜接,剛好有些研究,而且最近五年來我手上的所有專案均是這麼做的!我所畫的圖型絕對可以直接產 Code,而且非常非常的清楚,對我而言,這樣的設計方式我已經行之有年,於是我很爽快地就答應了這一次的企業內訓課程,雖然這個課程真的非常硬,哈哈,我說非常硬的原因是,在這十天的課程過程中,到最後一天,我必須帶著學員真的撰寫出一個線上房屋貸款申請系統!要可以申請,對你沒聽錯,課程結束,要真的把一個系統做出來…. 這就是我說非常硬的原因。不過,還好,我做到了!哈哈


對本文內容目前已錄製成線上課程:決戰 OOAD 系列課程、有興趣的讀者,可參考:

課程連結


進階使用案例分析技巧

在上一篇文章中『從使用者需求,談架構設計』我提到了軟體專案的核心架構必須由使用者需求出發,因為真正有用的軟體是對客戶有用的軟體、以及能替客戶解決問題的軟體,才是真正有價值的軟體,因此本課程中我告訴團隊成員說,我們只所取用的 UML 部分的圖形與 notations 來使用,只要運用的恰當,它可以幫助你在分析使用者需求時,釐清、切割清楚什麼是使用者最關心的問題,因為,後續的細部分析其實都會與你之後的架構設計息息相關。

圖(一)、軟體開發架構與使用者需求間的優先順序關係


如何收集使用者需求,我在前一篇文章中也有提到,現在,我慢慢搭配 User Story 來收集使用者需求,因為,並不是每個使用者都能夠使用 Use Case 與他溝通。

所以,面對不懂 Use Case 的客戶,我們瞭解客戶的 “need!”,回到公司內化為 “interaction between the user and the software”,這樣一來,我們更容易瞭解客戶的需求。

不過在進行使用案例 Use Case 的分析時,筆者常發現許多客戶,常會犯一種錯誤,就是以 CRUD 角度來設計使用案例,筆者在進行使用案例分析時,會盡量避免以 CRUD 角度來設計,這會衍伸許多問題而導致錯誤的分析,最後導致無法預期的情況。為什麼我這麼說呢?

因為:

資料異動是系統背後的事,不是這裡該關心的


再者,若使用 CRUD 角度設計使用案例,還會產生以下問題:

  • 限制了使用案例的思考範圍
  • 使用案例不該跟實作有關
  • CRUD 的使用案例容易讓人誤會、妨礙與 User 溝通
  • 使用案例不是只跟 UI 有關,也違反一個使用案例只完成一件事的規則
  • 好的使用案例應該是描述「企業交易」而非「資料庫交易」
  • 錯誤的使用案例將誤導後續各圖形「循序圖」、「類別圖」與程式設計的方向

最後一點尤其嚴重,這麼一來大家應該就比較清楚為什麼我說盡量不要用 CRUD 角度來設計使用案例了。


探討 UML 分析的運作機制

在 UML 裡面所採用的是反覆式(Iteration)、漸進式(Incremental),也就是,有錯必改、有誤就修,直到所有模型都貼近實際的需求為止。

而在更新穎的 UML 系統分析設計理論哩,我更引用了 MVP (Minimum Viable Product) 最小可行性產品的改念,因為一個反覆與漸進式的生命週期是以連續的系統擴大(enlargement)及改進(refinement)的方式為基礎進行的,其過程會穿越「分析」、「設計」、「實作」及「測試」的多個開發循環 (cycles),反覆與漸進式模型會利用幾個初步主要需求進行開發,以便快速建立初期版本的產品 (MVP, Minimum Viable Product)再交付給客戶,因為我們不可能一開始就完全清楚需求,但是透過 UML 的黃金三角關係,我們很容易抓出方向,爾後實際進行時,再針對客戶的回饋來修正系統,這麼一來,我們便容易盡早的發現、並導正系統發展的方向,以便符合客戶預期。

圖(二)、UML 圖形中具備彼此的關連性


從身為UML兩大重心的「使用案例圖」與「類別圖」來探討分析概念

所謂的使用案例圖,幾乎可為 UML 中所有圖形的起點,如上圖(二)中所示,所有的其他圖型更是都由黃金三角支撐出來的,因此我才不斷的強調這個黃金三角是快速建立初期版本的產品 (MVP, Minimum Viable Product)關鍵。

所以,也就是說,根據「使用案例圖」與「類別圖」可以衍伸出「循序圖」與「合作圖」,這是表現出物件間的動態關係,因為必須先有使用案例圖才可推導出「領域類別圖」或「類別圖」,再經由「類別圖」才可衍伸出「狀態圖」與「活動圖」,也就是說,您可以透過各種不同觀點、角度的圖形來呈現軟體系統,UML 的設計理念便在此,軟體系統不是用一張圖可以表達清楚的!


再談『領域類別圖(Domain Class Diagram)』

一般來說,找出領域類別有幾種方式:

  • 分析完畢的「使用案例圖」的 Scenario
  • 參與者(Actor)所互動的事物、所做的事情
  • 核對在 Use Case 與 (Scenario/User Story) 裡出現的,所謂的「名詞」物件

因為所謂的領域模型,其實就是一種初步的類別圖,又可稱為 Domain Class Diagram,也為一種 Conceptual Modeling,這在前一篇文章裡,筆者進行了一個,以 8 個 Iteration Modeling 的反覆分析過程的例子,並使用一個實際的房貸線上申請系統,將其說明得非常清楚,有興趣的讀者可返回參考。

對了,另外,針對候選類別部分,還有一幾個重點,除了將所找到的名詞物件列出之外,有些分析師會急於分析其關係(Associations),這是不對的,有機會,我很想開個課程說明清楚這個部分,雖然,我也會分析其關係,但這在初期並不是重點,更不用說強迫其加上關係。

圖(三)、找出類別 VS. 找出關係


如何運用穩健圖分析從「類別圖」順暢的到「循序圖」?

首先,我們先說明,究竟什麼事穩健圖( robustness diagram )?所謂的穩健圖為使用案例創始人 Ivar Jacobson 所創造,因為他認為,就實務上,初學者在於使用案例到循序圖之間一直有鴻溝存在,有可能是物件導向觀念不夠熟悉所致,嚴格來說,它其實不算是 UML 圖形的一部份,穩健圖是 ICONIX 中,從 Use Case 到 Sequence Diagram 的催化劑,它可以迫使分析師在繪製循序圖時,重新檢視使用案例,同時加入更多的物件思維,也因此可以更順暢地移動到純物件化的類別圖與循序圖設計,因此原作者希望透過穩健圖改善這段流程的順暢度。

使用穩健分析有那些好處?

  • 用 B-C-E 角度驗證合理性
  • 沒有真正的標準畫法,自由度高
  • 補強使用案例敘述、加強物件導向思維
  • 進行簡單的初步設計
  • 可透過穩健圖分析發現替代流程

至於實務上,如何使用穩健分析順暢的從類別圖到循序圖?這邊筆者先賣個關子,Gelis 的程式設計訓練營會在下一次開例課程為大家分曉,敬請期待!


何謂「正三角形法」與「倒三角形法」?

所謂的「正三角形法」事筆者在業界最常見的一種方式,但是其實並不完整,因為你只是用半套 UML 而已。

圖(四)、正三角形法

如果您有撰寫使用案例描述 Scenario 與 包含操作屬性的類別圖 再加上包含操作的循序圖,那麼我會說您做到了倒三角形法。

圖(五)、倒三角形法


真實世界中的「循環星形法」

但事實上,應該是兩者搭配起來使用較為全面,這稱作循環星形法。

圖(六)、循環星形法

循環星形法(詳細)開發流程 如下:
1. 建構使用案例圖
2. 編寫使用案例敘述
3. 繪製類別圖(Domain Class Diagram)
3.1. 找出類別(不含屬性及操作)
3.2. 建立類別之間的關係(不含個體數目)
4. 建立循序圖(不含參數)
5. 繪製細緻循序圖(含參數)
6. 繪製細緻類別圖
6.1. 定出操作(Operations)
6.2. 找出屬性(Attributes)
6.3. 畫面雛形(Prototype)使用者介面

在這次的企業內訊中,我挑戰帶著學員們使用循環星形法,真的實作出一個線上房貸申請系統,而且挑戰成功,有興趣的讀者可以期待一下筆者即將開的課程 XD。


進行 UML 進行分析時該注意的幾個警訊

以前,常常有朋友跟筆者抱怨 UML 根本不好用,開發的時候,如果使用 UML 不就一天到晚都在畫這個 UML 圖?事實上根本不會這樣,小編在畫 UML 圖型時,所花的時間相當相當的短,我通常半小時就可以畫完了,您一定不相信,如果您總是花很多時間在想 UML 圖怎麼畫,您肯定犯了以下幾個陷阱而不自知:

1. 在還沒弄清楚使用者需求時,別嘗試撰寫使用案例!
在不知道使用者的真正期望之前,所構思出來的使用案例都只算是預先設想。


2. 花費數週時間,只為了建造出精美的使用案例模式
使用案例最好畫的快、修的快,畫得太龐大會使專案人員抗拒修改,因此這裡著重於專案人員的(狀況)與(心態)問題,這有時很容易讓專案陷入分析癱瘓的窘境。


3. 花了很多時間去擔心,到底該使用「包含關係」、「擴充關係」
這也是我前面一直強調的,初期根本無需擔心具備何種關係,但首先要澄清的是,「使用關係」(uses)是UML早期的名稱,這項關係後來改稱為「包含關係」(includes),在新版的UML2裡頭,使用案例之間已經沒有「使用關係」了,而重點是:重用使用案例、相同之處可以抽離出來,使用「包含關係」連結原有使用案例即可。


4. 別把時間浪費在,冗長且複雜的使用案例樣版上頭
使用案例敘述並非 UML 2.0 標準的一部分,所以並沒有標準的使用案例敘述樣板,主要流程(basic flow),另一為替代流程(alternate flow),使用案例敘述是編寫功能性需求,而不是編寫使用腳本。


5. 使用案例可以描述「屬性」與「方法」,但不是描述使用情況

因為所謂的「功能性需求」(functional requirement)是系統該達成的一個事項,而所謂的「使用腳本」(usage scenario text)則是一段敘述,很多時候,功能性需求與使用案例不會一對一對應。

比如:

  • 有時,一個功能性需求會涉及數個使用案例
  • 或者,一個使用案例會達成數個功能性需求

所以,使用案例敘述過於簡潔,過於繁瑣都不好。


6. 使用案例可以描述「屬性」與「方法」,但不是描述使用情況

使用案例應該是「關注於使用者與系統之間的互動」,「而不是系統內部的運作細節」,所以不該過於關注在物件的屬性與方法上頭`.


7. 設計使用案例(撰寫敘述)時,根本變成 UI 的操作說明

這也是筆者在各大企業中,最常看見的錯誤,就像前面所提的 CRUD 思考模式,但是我必須要重申,在撰寫使用案例時,請脫離 UI 的思考模式,雖然不可否認,一邊思考使用者 UI,一邊思考使用案例有助於系統分析,但是不要忘了,一旦跟 UI 綁住的使用案例,一旦改 UI 變得牽連到使用案例,因為 UI 通常已經告訴使用者該怎麼做了,不是該做什麼?

所以,最好是最好是與 UI「有點黏」又「不會太黏」的使用案例。


8. 沒有為所有專業術語編寫「資料字典」(data dictionary)

在專案中,繪製 UML 所有圖型所使用到專業術語時,最好能夠一致性,最好能建立資料字典,並加入文件的版本控管之中,這甚至牽涉到需求管理部分,有機會筆者開另一篇文章來說明。


9. 未以使用者角度撰寫使用案例

這也是許多分析師最常犯的一個錯誤,因為分析師應該要站在使用者角度,當作自己在與系統互動?會想得到如何的結果。


10. 撰寫使用案例時總是遺漏了「替代流程」

這也是一個最常被遺漏的,但是在某些情況下,往往替代流程反而是重要的。然而,當然,您還是必須先寫主流程,再寫替代流程。


結語

以上均為筆者這些年來帶著企業進行開發的實務經驗,其實真的很希望能夠多帶幾場類似的課程,因為根據筆者經驗,大部分企業雖然會繪製 UML 圖型,但是真的要撰寫程式時,又不是參照自己畫的 UML 圖型來撰寫程式,也就是 SD ==> PG 時都是卡卡的,而事實上,這部分剛好是筆者的強項部分,一直以來,包括我手上進行的專案都是透過 UML 分析而撰寫程式的,所有程式碼都是有跡可循的,這部分也會在下次開的課程中為大家分曉。




關於 Gelis:

資深 .NET 技術顧問

FB 社團 (軟體開發之路):

https://www.facebook.com/groups/361804473860062/

FB 粉絲團 (Gelis 的程式設計訓練營):

https://www.facebook.com/gelis.dev.learning/

我講授過的課程 SlideShare:

https://www.slideshare.net/GelisWu


以下是我經營的項目與內容:

(1). 企業內訓課程

(2). 專業顧問


企業內訓課程:

1. .NET Core 3.1 從入門到進階

先前實體課程連結

2. 跨平台的 Web API Framework 框架設計

先前實體課程連結

3. 決戰 OOAD 系列課程 - 使用 UML

先前實體課程連結

4. 單元測試 UnitTest 與 Moq 物件實務課程

先前實體課程連結

5. 快速開發系列 - C# Project Templates 範本設計

留言

  1. Gelis~~
    我是samantha啦,我想問一下[團隊共同規範]內容大概有哪些阿??
    謝謝你!!

    回覆刪除
    回覆
    1. to Samantha

      之前我有發表過相關文章,給妳參考,哈哈

      https://dotblogs.com.tw/gelis/2017/03/26/204351

      刪除

張貼留言

這個網誌中的熱門文章

從 Semantic Kernel 談 AI 浪潮下的開發人員的挑戰

什麼是 gRPC ?

什麼是 gRPC(二)- 來撰寫第一個 Hello World 吧!