面向?qū)ο笤O(shè)計與統(tǒng)一建模語言UML
面向?qū)ο笤O(shè)計
自從面向?qū)ο缶幊陶Z言在軟件開發(fā)中成為主流之后,遵循面向?qū)ο蠹夹g(shù)特點的軟件設(shè)計工作,也一并發(fā)展了起來。
首先要提出一個問題,就是設(shè)計的工作是要做什么?

它包括的范圍其實是很廣泛的,從搜集用戶需求,進行業(yè)務(wù)分析,到繪制系統(tǒng)流程圖等??梢哉f,在動手編寫代碼之前,程序員要做的都屬于設(shè)計工作。
就像建造房屋一樣,先確定要造的房屋類型,然后是選址,設(shè)計樣式。最后工程師帶領(lǐng)施工隊按照設(shè)計圖紙將房子造出來。
而面向?qū)ο蠹夹g(shù),因為其封裝、繼承、多態(tài)等特點,在對現(xiàn)實世界建模時,可以方便地以自然思維將事物抽象為計算機可處理的數(shù)據(jù)。關(guān)于面向?qū)ο蠹夹g(shù)的詳細說明,可參看往期文章學好面向?qū)ο缶幊陶Z言的關(guān)鍵,在于掌握它們的共通結(jié)構(gòu)與特性 。
要做的事情清楚了,思維工具也有了,接下來就是如何將工作成果表述出來。一個相當有力的工具就是統(tǒng)一建模語言(Unified Modeling Language,簡稱UML),下一節(jié)會對其進行入門級的介紹。
最后會以一個示例講述在面向?qū)ο笤O(shè)計中,如何應用UML來完成建模工作。
UML概述
UML雖然也是一門“語言”,但它其實是一套圖形化的符號系統(tǒng)。UML最主要的作用,就是在現(xiàn)實世界與程序代碼之間建起一座橋梁。
這就是UML的“統(tǒng)一”所要求的,所以它的各種圖形都有著嚴格的定義。包括形狀、連接線的方向、方法與屬性的標明等。
遵循統(tǒng)一標準的好處,就是方便了溝通。當設(shè)計的各個階段的成果繪制成UML圖保存下來時,那么無論是團隊內(nèi)部協(xié)作,還是對外交流,大家都省去了學習符號表示法的時間,可以直接掌握設(shè)計意圖。

UML 2 定義了13種圖形,我們可以了解一下,對于重要的圖形,會給出圖示。所有圖形采用bouml工具繪制。
用例圖:表示系統(tǒng)提供的功能和使用者之間的關(guān)系。

用例圖
類圖:表示類的規(guī)格和類之間的關(guān)系。

類圖
對象圖:表示實例之間的關(guān)系。

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

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

活動圖
通信圖:將實例之間的相互作用表示為組織結(jié)構(gòu)。

通信圖
狀態(tài)機圖:表示實例的狀態(tài)變化。

狀態(tài)機圖
組件圖:表示文件和數(shù)據(jù)庫、進程和線程等軟件的實現(xiàn)結(jié)構(gòu)。

組件圖
部署圖:表示硬件、網(wǎng)絡(luò)等系統(tǒng)的物理結(jié)構(gòu)。

部署圖
復合結(jié)構(gòu)圖:表示具有整體-部分結(jié)構(gòu)的類的運行時結(jié)構(gòu)。
包圖:表示包之間的關(guān)系。
交互概覽圖:將根據(jù)不同條件執(zhí)行不同動作的時序圖放到活動圖中進行表示。
定時圖:采用帶數(shù)字刻度的時間軸來表示實例之間的狀態(tài)遷移和相互作用。
建模
什么是統(tǒng)一說了,用到的圖形語言也說了,最后就得說一說怎么建模了。我們進行面向?qū)ο蟮脑O(shè)計工作,終歸是要讓計算機來幫助我們處理那些繁瑣、重復性的工作。
那么,接下來我們就以一個租車業(yè)務(wù)為示例,使用UML工具進行設(shè)計過程吧。我們模仿實現(xiàn)一個線上租車應用,為了簡化討論,只提及最關(guān)鍵的幾個功能點。
業(yè)務(wù)分析階段
用戶想要租一輛車開,第一步是要先挑選合適的車。例如是城市代步,還是郊游遠行等。選好車之后,就是預約下單。用戶辦理好手續(xù),將車開走使用,最后完成歸還手續(xù)。
那么,對以上場景分析之后,可以通過活動圖把整體流程畫出來。

租車業(yè)務(wù)整體流程
需求定義階段
從上述業(yè)務(wù)分析可知,這個線上租車系統(tǒng)可以承擔的自動化工作,包括展示車輛信息,處理預訂訂單,車輛出庫,跟蹤車輛行駛情況,以及車輛歸還入庫這些功能。
使用用例圖展示客戶與服務(wù)提供商可以使用的功能。

租車業(yè)務(wù)功能用例
系統(tǒng)設(shè)計階段
系統(tǒng)功能點梳理出來之后,就是對系統(tǒng)中的各個關(guān)鍵對象進行定義。車輛對象(Car)是基本單元,所有的租賃業(yè)務(wù)都要圍繞它展開。接下來是汽車展示對象(ShowCar),它可以從車輛對象取得可供展示的信息,例如車型、廠商、顏色等。
當用戶選定車輛之后,就可以執(zhí)行預訂功能。租賃管理對象(RentServer)將會接受訂單、收取押金和預付款。用戶取車時RentServer則進行出庫處理,并通知車輛跟蹤對象(TraceCar)持續(xù)監(jiān)控車輛運行情況。
用戶使用完,歸還車輛時,RentServer則從TraceCar查詢車況,確認無誤后則執(zhí)行入庫處理,退還用戶押金。
據(jù)以上描述,我們可以先畫出類圖。

租車業(yè)務(wù)類圖
從上圖可以看到,Car作為系統(tǒng)的基本單元,被其他類聚合使用。關(guān)于聚合,這是一種整體與個體之間的關(guān)系,即has-a關(guān)系。而組合則要更高一級,是包含關(guān)系。例如汽車與發(fā)動機就是組合關(guān)系,因為離開了發(fā)動機,汽車就不可用了。
關(guān)聯(lián)關(guān)系則比聚合還要弱一級,但需要注意的是,在程序代碼中,關(guān)聯(lián)與聚合的語法是一樣的,它們的差異是存在于語義上的。這也是UML設(shè)計能比代碼包含更多信息的優(yōu)勢。
類圖表示的是類之間的靜態(tài)關(guān)系,要看到對象實例之間的消息調(diào)用,則還要使用時序圖。下面分步驟繪制,先看預訂流程的時序圖。

租車預訂時序圖
接下來是用戶歸還車輛的時序圖。

歸還車輛時序圖
對象間的交互已經(jīng)有了,接下來就是具體方法的實現(xiàn)過程。說明方法的執(zhí)行過程,使用活動圖比較適合。下面選取CheckOut方法,對其繪制活動圖進行說明。

CheckOut流程活動圖
至于其他功能,有興趣的同學們可以自行繪制。實際項目所產(chǎn)出的UML設(shè)計,則會復雜得多,但只要掌握好面向?qū)ο笤O(shè)計的理念,以及UML工具的圖形細節(jié),那么無論是閱讀既有設(shè)計,還是自己通過繪圖表達設(shè)計想法,都能夠做到得心應手。