1. 程式人生 > 實用技巧 >面向物件建模語言UML

面向物件建模語言UML

自從面向物件程式語言在軟體開發中成為主流之後,遵循面向物件技術特點的軟體設計工作,也一併發展了起來。

面向物件設計

自從面向物件程式語言在軟體開發中成為主流之後,遵循面向物件技術特點的軟體設計工作,也一併發展了起來。

首先要提出一個問題,就是設計的工作是要做什麼?

它包括的範圍其實是很廣泛的,從蒐集使用者需求,進行業務分析,到繪製系統流程圖等。可以說,在動手編寫程式碼之前,程式設計師要做的都屬於設計工作。

就像建造房屋一樣,先確定要造的房屋型別,然後是選址,設計樣式。最後工程師帶領施工隊按照設計圖紙將房子造出來。

而面向物件技術,因為其封裝、繼承、多型等特點,在對現實世界建模時,可以方便地以自然思維將事物抽象為計算機可處理的資料。關於面向物件技術的詳細說明,可參看往期文章學好面向物件程式語言的關鍵,在於掌握它們的共通結構與特性 。

要做的事情清楚了,思維工具也有了,接下來就是如何將工作成果表述出來。一個相當有力的工具就是統一建模語言(Unified Modeling Language,簡稱UML),下一節會對其進行入門級的介紹。

最後會以一個示例講述在面向物件設計中,如何應用UML來完成建模工作。

UML概述

UML雖然也是一門“語言”,但它其實是一套圖形化的符號系統。UML最主要的作用,就是在現實世界與程式程式碼之間建起一座橋樑。

這就是UML的“統一”所要求的,所以它的各種圖形都有著嚴格的定義。包括形狀、連線線的方向、方法與屬性的標明等。

遵循統一標準的好處,就是方便了溝通。當設計的各個階段的成果繪製成UML圖儲存下來時,那麼無論是團隊內部協作,還是對外交流,大家都省去了學習符號表示法的時間,可以直接掌握設計意圖。

面向物件建模語言UML面向物件建模語言UML

UML 2 定義了13種圖形,我們可以瞭解一下,對於重要的圖形,會給出圖示。所有圖形採用bouml工具繪製。

用例圖:表示系統提供的功能和使用者之間的關係。

面向物件建模語言UML面向物件建模語言UML

用例圖

類圖:表示類的規格和類之間的關係。

面向物件建模語言UML面向物件建模語言UML

類圖

物件圖:表示例項之間的關係。

面向物件建模語言UML面向物件建模語言UML

物件圖

時序圖:將例項之間的相互作用表示為時間序列。

面向物件建模語言UML面向物件建模語言UML

時序圖

活動圖:表示一系列處理中的控制流程。

面向物件建模語言UML面向物件建模語言UML

活動圖

通訊圖:將例項之間的相互作用表示為組織結構。

面向物件建模語言UML面向物件建模語言UML

通訊圖

狀態機圖:表示例項的狀態變化。

面向物件建模語言UML面向物件建模語言UML

狀態機圖

元件圖:表示檔案和資料庫、程序和執行緒等軟體的實現結構。

面向物件建模語言UML面向物件建模語言UML

元件圖

部署圖:表示硬體、網路等系統的物理結構。

面向物件建模語言UML面向物件建模語言UML

部署圖

複合結構圖:表示具有整體-部分結構的類的執行時結構。

包圖:表示包之間的關係。

互動概覽圖:將根據不同條件執行不同動作的時序圖放到活動圖中進行表示。

定時圖:採用帶數字刻度的時間軸來表示例項之間的狀態遷移和相互作用。

建模

什麼是統一說了,用到的圖形語言也說了,最後就得說一說怎麼建模了。我們進行面向物件的設計工作,終歸是要讓計算機來幫助我們處理那些繁瑣、重複性的工作。

那麼,接下來我們就以一個租車業務為示例,使用UML工具進行設計過程吧。我們模仿實現一個線上租車應用,為了簡化討論,只提及最關鍵的幾個功能點。

業務分析階段

使用者想要租一輛車開,第一步是要先挑選合適的車。例如是城市代步,還是郊遊遠行等。選好車之後,就是預約下單。使用者辦理好手續,將車開走使用,最後完成歸還手續。

那麼,對以上場景分析之後,可以通過活動圖把整體流程畫出來。

面向物件建模語言UML面向物件建模語言UML

租車業務整體流程

需求定義階段

從上述業務分析可知,這個線上租車系統可以承擔的自動化工作,包括展示車輛資訊,處理預訂訂單,車輛出庫,跟蹤車輛行駛情況,以及車輛歸還入庫這些功能。

使用用例圖展示客戶與服務提供商可以使用的功能。

面向物件建模語言UML面向物件建模語言UML

租車業務功能用例

系統設計階段

系統功能點梳理出來之後,就是對系統中的各個關鍵物件進行定義。車輛物件(Car)是基本單元,所有的租賃業務都要圍繞它展開。接下來是汽車展示物件(ShowCar),它可以從車輛物件取得可供展示的資訊,例如車型、廠商、顏色等。

當用戶選定車輛之後,就可以執行預訂功能。租賃管理物件(RentServer)將會接受訂單、收取押金和預付款。使用者取車時RentServer則進行出庫處理,並通知車輛跟蹤物件(TraceCar)持續監控車輛執行情況。

使用者使用完,歸還車輛時,RentServer則從TraceCar查詢車況,確認無誤後則執行入庫處理,退還使用者押金。

據以上描述,我們可以先畫出類圖。

面向物件建模語言UML面向物件建模語言UML

租車業務類圖

從上圖可以看到,Car作為系統的基本單元,被其他類聚合使用。關於聚合,這是一種整體與個體之間的關係,即has-a關係。而組合則要更高一級,是包含關係。例如汽車與發動機就是組合關係,因為離開了發動機,汽車就不可用了。

關聯關係則比聚合還要弱一級,但需要注意的是,在程式程式碼中,關聯與聚合的語法是一樣的,它們的差異是存在於語義上的。這也是UML設計能比程式碼包含更多資訊的優勢。

類圖表示的是類之間的靜態關係,要看到物件例項之間的訊息呼叫,則還要使用時序圖。下面分步驟繪製,先看預訂流程的時序圖。

面向物件建模語言UML面向物件建模語言UML

租車預訂時序圖

接下來是使用者歸還車輛的時序圖。

面向物件建模語言UML面向物件建模語言UML

歸還車輛時序圖

物件間的互動已經有了,接下來就是具體方法的實現過程。說明方法的執行過程,使用活動圖比較適合。下面選取CheckOut方法,對其繪製活動圖進行說明。

面向物件建模語言UML面向物件建模語言UML

CheckOut流程活動圖

至於其他功能,有興趣的同學們可以自行繪製。實際專案所產出的UML設計,則會複雜得多,但只要掌握好面向物件設計的理念,以及UML工具的圖形細節,那麼無論是閱讀既有設計,還是自己通過繪圖表達設計想法,都能夠做到得心應手。

本文地址:https://www.linuxprobe.com/modeling-language-uml.html