《UML用户指南第二版》再次温读笔记(一)(downmoon)
前言:最近,花點時間重讀(也不知道是第幾遍了)《UML用戶指南第二版》這本書,感覺雖然對WEB程序開發(fā)而言,UML的應(yīng)用是一個極大的挑戰(zhàn),然而,其中蘊含的基本原理和指導(dǎo)性卻是歷久彌新,耐人回味。
在此,特地摘錄了部分讓邀月留下印象的章節(jié),以作備忘。
首先,先重復(fù)幾個老掉牙的觀點。
?建模的重要性?
如果你想搭一個狗窩,你備好木料、釘子和一些基本工具(如錘子、鋸和卷尺)?,就可以開始工作。從制定一點初步的計劃到完成一個滿足適當(dāng)功能的狗窩,你 可能不用別人幫助,在幾個小時內(nèi)就能夠?qū)崿F(xiàn)。只要狗窩夠大且不太漏水,你的狗就可以安居。如果不制定一個計劃你總是可以返工,或是讓你的狗受些委屈。
如果你想為你的家庭建造一所房子,你備好木料、釘子和一些基本工具,也能開始工作。但這將需要較多的時間,并且你家庭對于房子的需求肯定比狗對于狗窩的需求 要多。在這種情況下,除非你曾經(jīng)多次建造過房子,否則就需要事先制定出一些詳細(xì)的計劃,再開始動工,你才能夠成功。至少你應(yīng)該繪制一些表明房子是什么樣子 的簡圖。如果你想建造一所能滿足你家庭的需要并符合當(dāng)?shù)亟ㄖ?guī)范的合格房屋,你就需要畫一些建筑圖,使你能想清楚房間的使用目的以及照明、取暖和水管裝置 等實際細(xì)節(jié)問題。作出這些計劃后,你就能對這項工作所需的時間和物料作出合理的估計。你自己也可能建造出這樣的房屋,但若有其他人協(xié)作(可能要將工程中的 許多關(guān)鍵部分轉(zhuǎn)包出去或購買預(yù)制的材料)?,效率就會高得多。只要你按計劃行事,不超出時間和財務(wù)的預(yù)算,你的新房就可能非常令人滿意。如果不制定計劃, 新房就不會完全令人滿意。因此,最好在早期就制定計劃,并謹(jǐn)慎地處理好所發(fā)生的變化。
如果你要建造一座高層辦公大廈,若還是先備好木料、釘子 和一些基本工具就開始工作,那將是非常愚蠢的。因為你所使用的資金可能是別人的,他們會對建筑物的規(guī)模、形狀和風(fēng)格作出要求。同時,他們經(jīng)常會改變想法, 甚至是在工程已經(jīng)開工之后。由于失敗的代價太高了,因此你必須要做大量的計劃。負(fù)責(zé)建筑物設(shè)計和施工的組織機構(gòu)是龐大的,你只是其中的一個
組成部 分。這個組織將需要各種各樣的設(shè)計圖和模型,以供各方相互溝通。只要你得到了合適的人員和工具,并對把建筑概念轉(zhuǎn)換為實際建筑的過程進行積極的管理,你將 會建成這座滿足使用要求的大廈。如果你想繼續(xù)從事建筑工作,那么你將一定要在使用要求和實際的建筑技術(shù)之間做好平衡,并且處理好組員們的休息問題,既不能 把他們置于風(fēng)險之中,也不能驅(qū)使他們
過份辛苦地工作以至于精疲力盡。
奇怪的是,很多軟件開發(fā)組織開始想建造一座大廈式的軟件,而在動手處理時卻好像他們正 在倉促地造一個狗窩。有時你是幸運的。如果你在恰當(dāng)?shù)臅r間有足夠的合適人員,并且其他的事情都很如意,你可能(僅是可能)使你的團隊推出一個令用戶眼花繚 亂的軟件產(chǎn)品。然而,一般的情況是:你不能得到所有的合適人員(這樣的人員經(jīng)常供不應(yīng)求)?,時間并不總是恰當(dāng)?shù)?#xff08;昨天可能更好)?,其他的事情也并不盡 如人意(常常由不得自己)?。在因特網(wǎng)時代,對軟件開發(fā)的要求正在日益增加,而開發(fā)團隊卻還是經(jīng)常單純地依靠他們唯一真正知道如何做好的一件事—產(chǎn)生程序 代碼。英雄式的編程努力成為這一行業(yè)的傳奇,人們似乎經(jīng)常認(rèn)為:更努力地工作是面對開發(fā)中出現(xiàn)的各種危機的正常反映。然而這未必能產(chǎn)生正確的程序代碼,而 且一些項目是非常巨大的,無論怎樣延長工作時間,也不足以完成所需的工作。
如果你真正想建造一個相當(dāng)于房子或大廈類的軟件系統(tǒng),問題可不是僅僅要寫許多軟件。事實上,關(guān)鍵是要編出正確的軟件,并考慮怎樣少寫軟件。要生產(chǎn)合格的軟件 就要有一套關(guān)于體系結(jié)構(gòu)、過程和工具的規(guī)范。即使如此,很多項目開始看起來像狗窩,但隨后發(fā)展得像大廈,原因很簡單,它們是自己成就的犧牲品。如果對體系結(jié)構(gòu)、過程或工具的規(guī)范沒有作任何考慮,總有一天狗窩會膨脹成大廈,并會由于其自身的重量而倒塌。狗窩的倒塌可能會使你的狗惱怒,同理不成功的大廈將會對大廈的擁有者造成嚴(yán)重的影響。不成功的軟件項目失敗的原 因各不相同,而所有成功的項目的成功原因在很多方面都是相似的。一個成功的軟件組織有很多成功的因素,其中共同的一點就是對建模的采用。
建模是一項經(jīng)過檢驗并被廣為接受的工程技術(shù)。我們建立的房屋和大廈的建筑模型能幫助用戶得到實際建筑物的印像。為了分析大風(fēng)或地震對建筑物造成的影響,我們甚至可以建立數(shù)學(xué)模型。
建 模不只是用于建筑業(yè)。如果不首先構(gòu)造模型(從計算機模型到物理風(fēng)洞模型以及與實物大小一樣的原型)?,就裝配新型的飛機或汽車,那簡直是難以想像的。為了 更好地了解系統(tǒng)并與他人交流思想,開發(fā)新型的電氣設(shè)備(從微處理器到電話交換系統(tǒng))都需要一定程度的建模。在電影業(yè)里,劇本是產(chǎn)品的核心,這也是建模的一 種形式。在社會學(xué)、經(jīng)濟學(xué)和商業(yè)管理領(lǐng)域中,為了證實理論或用最小限度的風(fēng)險和代價實驗新的理論,我們也要建模。
那么,模型是什么?簡單地說,模型是對現(xiàn)實的簡化。
模型提供了系統(tǒng)的藍圖。模型既可以包括詳細(xì)的計劃,也可以包括從很高的層次考慮系統(tǒng)的總體計劃。一個好的模型包括那些有廣泛影響的主要元素,而忽略那些 與給定的抽象水平不相關(guān)的次要元素。每個系統(tǒng)都可以從不同的方面用不同的模型來描述,因而每個模型都是一個在語義上閉合的系統(tǒng)抽象。模型可以是結(jié)構(gòu)性的, 強調(diào)系統(tǒng)的組織;它也可以是行為性的,強調(diào)系統(tǒng)的動態(tài)方面。
我們?yōu)槭裁匆?#xff1f;一個基本理由是:我們建模是為了能夠更好地理解我們正在開發(fā)的系統(tǒng)。
通過建模,要達到四個目的:
1)模型幫助我們按照實際情況或按照我們所需要的樣式對系統(tǒng)進行可視化。
2)模型允許我們詳細(xì)說明系統(tǒng)的結(jié)構(gòu)或行為。
3)模型給出了一個指導(dǎo)我們構(gòu)造系統(tǒng)的模板。
4)模型對我們作出的決策進行文檔化。
【后面討論U?M?L如何完成這四項事情。?】
建模并不只是針對大的系統(tǒng)。甚至像狗窩那樣的軟件也能從一些建模中受益。然而,可以明確地講,系統(tǒng)越大、越復(fù)雜,建模的重要性就越大,一個很簡單的原因是:因為我們不能完整地理解一個復(fù)雜的系統(tǒng),所以我們要對它建模。
人對復(fù)雜問題的理解能力是有限的。通過建模,縮小所研究問題的范圍,一次只著重研究它的一個方面。這就是Edsger?Dijkstra幾年前講的“各個擊 破”的基本方法,即先把一個要解決的難題劃分成一系列小問題,解決了這些小問題也就解決了這個難題。
此外,通過建模可以增強人的智力。一個適當(dāng)選擇的模型 可以使建模人員在較高的抽象層次上工作。
任何情況下都應(yīng)該建模的說法也未必盡然。事實上,一些研究指出:大多數(shù)軟件組織沒有做正規(guī)的建模,即使做了也很少。按項目的復(fù)雜性劃分一下建模的使用情況,你還會發(fā)現(xiàn):項目越簡單,采用正規(guī)建模的就越少。這 里強調(diào)的是“正規(guī)化”這個詞。雖然很不正規(guī),但實際上,開發(fā)者甚至對一些非常簡單的項目也要做一些建模工作。開發(fā)者可能在一塊黑板上或一小片紙上勾畫出他 的想法,以對部分系統(tǒng)進行可視化表示,或者開發(fā)組可能使用C?R?C卡片描述一個劇本或機械設(shè)計。使用任何一種這樣的模型都沒有什么錯。如果它能行得通, 就有理由使用它。然而,這些非正規(guī)的模型經(jīng)常是太特別了,它沒有提供一種容易讓他人理解的共同語言。建筑業(yè)、電機工程業(yè)和數(shù)學(xué)建模都有通用的建模語言,在 軟件開發(fā)中使用一種共同的建模語言進行軟件建模也能使開發(fā)組織獲益匪淺。
每個項目都能從一些建模中受益。即使在可隨意使用軟件的領(lǐng)域里,由于可視化編程語言的效率,有時扔掉不適合的軟件是更有效的,建模能幫助開發(fā)組更好地對 系統(tǒng)計劃進行可視化,這有助于他們正確地實施工作,使開發(fā)工作進展得更快。如果根本不建模,項目越復(fù)雜,就越有可能失敗或做錯事情。有一個自然趨勢:隨著 時間的推移,所有引人關(guān)注的實用系統(tǒng)都變得越來越復(fù)雜。雖然你今天可能認(rèn)為不需要建模,但隨著你的系統(tǒng)的演化,你會對這個決定感到后悔,但那時為時已晚。
????? 再來溫習(xí)一下,建模原理
各種工程學(xué)科都有其豐富的建模使用歷史。這些經(jīng)驗形成了建模的四項基本原理,分別敘述如下。
第一,選擇要創(chuàng)建什么模型對如何動手解決問題和如何形成解決方案有著意義深遠的影響。
換句話說,就是要好好地選擇模型。正確的模型將清楚地闡明難以對付的開發(fā)問題,提供不能輕易地從別處獲得的洞察力;錯誤的模型將誤導(dǎo)你,使你把精力花在不相關(guān)的問題上。對于軟件而言,你所選擇的模型將在很大程度上影響你對世界的看法。如果你以數(shù)據(jù)庫開發(fā)者的觀點建造一個系統(tǒng),你將可能注意實體 -關(guān)系模型,該模型把行為放入觸發(fā)器和存儲過程中。如果你以結(jié)構(gòu)化開發(fā)者的觀點建造一個系統(tǒng),你將可能得到以算法為中心的模型,即從處理到處理的數(shù)據(jù)流。如果你以面向?qū)ο箝_發(fā)者的觀點建造一個系統(tǒng),你將可能得到這樣一個系統(tǒng),它的體系結(jié)構(gòu)以眾多的類及交互模式(描述了類間的協(xié)同工作)為中心。對于一個給定的應(yīng)用系統(tǒng)和開發(fā)氛圍,使用上述的任何一種方法都可能是正確的。經(jīng)驗表明,在需求易變的系統(tǒng)中面向?qū)ο蟮姆椒ū憩F(xiàn)得更為出眾,甚至對使用大型數(shù)據(jù)庫或計算單元的系統(tǒng)也是如此。盡管事實如此,但要強調(diào)一點,不同的方法將導(dǎo)致不同種類的系統(tǒng),并且代價和受益也是不同的。
第二,每一種模型可以在不同的精度級別上表示。
如果你正在建造一座大廈,有時你需要從宏觀上讓投資者看到大廈的樣子,感覺到大廈的總體效果。而有時你又需要認(rèn)真考慮細(xì)節(jié)問題,例如,對復(fù)雜棘手的管道的鋪設(shè),或?qū)ι僖姷慕Y(jié)構(gòu)件的安置等。對于軟件模型也是如此。有時一個快速簡潔且是可執(zhí)行的用戶接口模型正是你所需要的,而有時你必須耐著性子對付比特,例如,描述跨系統(tǒng)接口或解決網(wǎng)絡(luò)瓶頸問題就是如此。在任何情況下,最好的模型應(yīng)該是這樣的:它可以讓你根據(jù)觀察的角色以及觀察的原因選擇它的詳細(xì)程度。分析人員或最終用戶主要考慮“做什么”的問題;開發(fā)人員主要考慮“怎樣做”的問題。這兩類人員都要在不同的時間以不同的詳細(xì)程度對系統(tǒng)進行可視化。
第三,最好的模型是與現(xiàn)實相聯(lián)系的。
如果一所建筑的物理模型不能以與真實的建筑相同的方式作出反映,則它的價值是很有限的。一架飛機的數(shù)學(xué)模型,如果只是假定了理想條件和完美制造,可能會掩蓋一些潛在的、致命的現(xiàn)實特征。最好是有一個能夠清晰地聯(lián)系實際的模型,而當(dāng)聯(lián)系很薄弱時能夠精確地知道這些模型怎樣與現(xiàn)實相脫離。所有的模型都對現(xiàn)實進行了簡化,但有一點要記住,不能簡化掉任何重要的細(xì)節(jié)。對軟件領(lǐng)域結(jié)構(gòu)化分析的唯一致命弱點是在分析模型和系統(tǒng)設(shè)計模型之間沒有基本的聯(lián)系。隨著時間的推移,這個不可填充的裂縫會使系統(tǒng)構(gòu)思階段和實施階段出現(xiàn)不一致。在面向?qū)ο蟮南到y(tǒng)中,可以把各個幾乎獨立的系統(tǒng)視圖連結(jié)成一個完整的語義整體。
第四,單個模型是不充分的。對每個重要的系統(tǒng)最好用一組幾乎獨立的模型去處理。
如果你正在建造一所建筑物,你會發(fā)現(xiàn)沒有任何一套單項設(shè)計圖能夠描述該建筑的所有細(xì)節(jié)。至少你需要基礎(chǔ)計劃、電梯計劃、電氣計劃、供熱計劃和水管裝置計劃。在這里的重要短語是“幾乎獨立的” 。在這個語境中,它意味著各種模型能夠被分別進行研究和構(gòu)造,但它們?nèi)匀皇窍嗷ヂ?lián)系的。如同搞建筑一樣,你能夠單獨地研究電氣計劃,但你也能看到它與之對照的基礎(chǔ)計劃,甚至它與水管裝置計劃中的管子排布的相互影響。
面向?qū)ο蟮能浖到y(tǒng)也如此。為了理解系統(tǒng)的體系結(jié)構(gòu),你需要幾個互補和連鎖的視圖:用況視圖(揭示系統(tǒng)的需求) 、設(shè)計視圖(捕獲問題空間和解空間里的詞匯) 、進程視圖(對系統(tǒng)的進程和線程的分布建模) 、實現(xiàn)視圖(描述系統(tǒng)的物理實現(xiàn))和實施視圖(著重于系統(tǒng)的工程方面的組織) 。每一種視圖都可能有結(jié)構(gòu)方面和行為方面。這些視圖一起從整體上描繪了軟件藍圖。
根據(jù)系統(tǒng)的性質(zhì),一些模型可能比另一些模型要重要。例如,對于數(shù)據(jù)密集型系統(tǒng),表達靜態(tài)設(shè)計視圖的模型將占主導(dǎo)地位。對于圖形用戶接口密集型系統(tǒng),靜態(tài)和動態(tài)用況視圖就顯得相當(dāng)重要。在實時系統(tǒng)中,動態(tài)進程視圖尤為重要。在分布式系統(tǒng)中,例如Web密集型的應(yīng)用,實現(xiàn)模型和實施模型是最重要的。
當(dāng)然, 我們要了解的最重要的一點是“面向?qū)ο蟮慕?/span>” 。
對于軟件,有幾種建模的方法。最普通的兩種方法是從算法的角度建模和從面向?qū)ο蟮慕嵌冉!?br />傳統(tǒng)的軟件開發(fā)是從算法的角度進行建模,所有的軟件都用過程或函數(shù)作為其主要構(gòu)造塊。現(xiàn)代的軟件開發(fā)采用面向?qū)ο蟮慕嵌冗M行建模,所有軟件系統(tǒng)都用對象或類作為其主要構(gòu)造塊。簡單地講,通常要從問題空間或解空間的詞匯中找出對象;類是對具有共同性質(zhì)的一組對象的描述。每一個對象都有標(biāo)識(你能夠?qū)λ?#xff0c;以區(qū)別于其他對象) 、狀態(tài)(通常有一些數(shù)據(jù)與它相聯(lián)系)和行為(使你能對該對象做某些事,它也能為其他對象做某些事) 。
例如,可考慮把一個簡單的計賬系統(tǒng)的體系結(jié)構(gòu)分成三層:用戶接口層、中間件層和數(shù)據(jù)庫層。在用戶層,你將找出具體的對象,如按鈕、菜單和對話框。在數(shù)據(jù)庫層,你將找出具體的對象,如從問題域中找出描述實體的表,它包含顧客、產(chǎn)品和訂單項。在中間件層,你將找出諸如交易、商業(yè)規(guī)則等對象,以及更高層次上的問題實體,如顧客、產(chǎn)品和訂單。
可以肯定地說,面向?qū)ο蠓椒ㄊ擒浖_發(fā)方法的主流部分,其原因很簡單,因為事實已經(jīng)證明,它適合于在各種問題域中建造各種規(guī)模程度和復(fù)雜度的系統(tǒng)。此外,當(dāng)前的大多數(shù)程序語言、操作系統(tǒng)和工具在一定的方式上都是面向?qū)ο蟮?#xff0c;并給出更多按對象來觀察世界的理由面向?qū)ο蟮拈_發(fā)為使用構(gòu)件技術(shù)(如Java Beans或 C O M +)裝配系統(tǒng)提供了概念基礎(chǔ)。
選擇按面向?qū)ο蟮姆绞接^察世界,會產(chǎn)生一系列的問題:什么是優(yōu)秀的面向?qū)ο蟮捏w系結(jié)構(gòu)?項目會創(chuàng)造出什么樣的制品?誰創(chuàng)造它們?怎樣度量它們?
對面向?qū)ο笙到y(tǒng)進行可視化、詳述、構(gòu)造和文檔化正是統(tǒng)一建模語言( U M L)的目的。
明天繼續(xù)讀,呵呵
總結(jié)
以上是生活随笔為你收集整理的《UML用户指南第二版》再次温读笔记(一)(downmoon)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。