UML輔助網(wǎng)站規(guī)劃和設(shè)計(jì)指南
當(dāng)前位置:點(diǎn)晴教程→知識(shí)管理交流
→『 技術(shù)文檔交流 』
[b]一、概述[/b]
[p][color=#000000] web網(wǎng)站往往具有復(fù)雜與高度動(dòng)態(tài)的特點(diǎn)。為了讓web應(yīng)用在短時(shí)間之內(nèi)開(kāi)始運(yùn)作,開(kāi)發(fā)周期應(yīng)該盡量地短。許多時(shí)候,開(kāi)發(fā)者直接進(jìn)入編寫代碼這一階段,卻不去仔細(xì)考慮自己想要構(gòu)造的是什么樣的網(wǎng)站以及準(zhǔn)備如何構(gòu)造:服務(wù)器端代碼往往是毫無(wú)準(zhǔn)備的即興式編寫,數(shù)據(jù)庫(kù)表也是隨需隨加,整個(gè)應(yīng)用的體系有時(shí)候呈現(xiàn)一種無(wú)規(guī)劃狀態(tài)。然而,只要我們運(yùn)用一些建模技術(shù)和軟件工程技術(shù),就能夠讓開(kāi)發(fā)過(guò)程更加流暢,確保web應(yīng)用將來(lái)更容易維護(hù)。[/color][/p] [p][color=#000000] uml(unified modeling language,統(tǒng)一建模語(yǔ)言)是一種通用的可視化建模語(yǔ)言,用于對(duì)軟件進(jìn)行描述、可視化處理、構(gòu)造和建立軟件系統(tǒng)的文檔。uml適用于各種軟件開(kāi)發(fā)方法、軟件生命周期的各個(gè)階段、各種應(yīng)用領(lǐng)域以及各種開(kāi)發(fā)工具。uml能夠描述系統(tǒng)的靜態(tài)結(jié)構(gòu)和動(dòng)態(tài)行為:靜態(tài)結(jié)構(gòu)定義了系統(tǒng)中重要對(duì)象的屬性和操作以及這些對(duì)象之間的相互關(guān)系;動(dòng)態(tài)行為定義了對(duì)象的時(shí)間特性和對(duì)象為完成目標(biāo)任務(wù)而相互進(jìn)行通信的機(jī)制。uml不是一種程序設(shè)計(jì)語(yǔ)言,但我們可以用代碼生成器將uml模型轉(zhuǎn)換為多種程序設(shè)計(jì)語(yǔ)言代碼,或使用反向生成器工具將程序源代碼轉(zhuǎn)換為uml模型。[/color][/p] [p][color=#000000] 本文介紹用uml為web網(wǎng)站建模的一些方法。全面采用uml技術(shù)是一個(gè)復(fù)雜的過(guò)程,但uml的某些部分很容易使用,而且它能夠幫助你用更少的時(shí)間構(gòu)造出更好的系統(tǒng)。[/color][/p] [p][color=#000000] 為了示范uml在網(wǎng)站建設(shè)中的應(yīng)用,本文將構(gòu)造一個(gè)支持無(wú)線用戶、提供各個(gè)地區(qū)天氣報(bào)表和交通流量報(bào)表的網(wǎng)站。本文不準(zhǔn)備詳細(xì)介紹uml本身。但為了方便起見(jiàn),附錄中簡(jiǎn)要介紹了常見(jiàn)的uml符號(hào)和術(shù)語(yǔ)。要了解更多有關(guān)uml的信息,請(qǐng)參見(jiàn)文章最后的參考資源。[/color][/p][color=#000000][b] 二、規(guī)劃階段[/b] [/color] [p][color=#000000] 不論你是從頭開(kāi)始構(gòu)造網(wǎng)站、移植網(wǎng)站還是增加某個(gè)重要的功能,為了確保設(shè)計(jì)決策的最優(yōu)化,進(jìn)行一些先期規(guī)劃是必要的。如果你和其他人協(xié)作完成一項(xiàng)工程,就工作總量及其分配達(dá)成明確的共識(shí)具有不可估量的作用。在規(guī)劃期間,你應(yīng)該努力對(duì)系統(tǒng)的以下方面形成正確的認(rèn)識(shí):[/color][/p] [p][/p] [color=#000000]用戶和角色。 [/color] [color=#000000]應(yīng)用需求。 [/color] [color=#000000]各個(gè)界面之間的轉(zhuǎn)換流程。 [/color] [li][color=#000000]要用到的工具和技術(shù)。[/color] [/li] [p][/p] [color=#000000] [b]2.1 用戶[/b] [/color] [p][color=#000000] 了解使用系統(tǒng)的用戶是很重要的。不僅系統(tǒng)分析要求你接觸一些用戶(通過(guò)問(wèn)卷調(diào)查、email,或者面對(duì)面交談),而且你經(jīng)常還要讓系統(tǒng)能夠控制不同的用戶角色和權(quán)限。通過(guò)對(duì)用戶進(jìn)行分類并了解他們的需求,你就可以找出線索來(lái)確定數(shù)據(jù)庫(kù)的安全機(jī)制、功能限制方法、用戶界面分組、培訓(xùn)和幫助需求、對(duì)具體內(nèi)容的需求,甚至還可以從側(cè)面了解到潛在廣告客戶的分布。[/color][/p] [p][/p] [color=#000000][img]http://yesky.com/softchannel/72342376189788160/20021114/softfz201114_01.gif[/img][br][br]圖1:參與者/角色 層次圖 [/color] [p][/p] [p][color=#000000] 上圖顯示了幾組不同的網(wǎng)站用戶(在uml中稱為actor,即參與者)。在這里,最普通的用戶類型(“site user”)位于圖的頂端,實(shí)線箭頭表示generalization關(guān)系(“泛化”關(guān)系,參見(jiàn)本文附錄說(shuō)明,下同),它表示site user又可以具體分成兩類用戶:guest,registered user。這兩類用戶共有的特征在“site user”參與者中說(shuō)明,而guest和registered user各自私有的特征則在對(duì)應(yīng)的參與者中說(shuō)明。通常,你可以直接為參與者加上說(shuō)明文檔,無(wú)需單獨(dú)編寫說(shuō)明用戶的文檔,但具體與你所用的uml工具有關(guān)。在本例中,registered user又可以細(xì)分為wireless user和administrator兩種類型,系統(tǒng)對(duì)這些用戶的處理方式應(yīng)有所不同。[/color][/p] [p][color=#000000]2.2 定義需求 [/color][/p] [p][color=#000000] 在正式開(kāi)始編寫代碼之前,你應(yīng)該對(duì)準(zhǔn)備構(gòu)造一個(gè)怎樣的系統(tǒng)有一個(gè)清晰的認(rèn)識(shí)。雖然在編寫代碼的同時(shí)也可以逐步完成這一工作,而且這種做法也很有吸引力,但借助圖形和文字資料事先集體進(jìn)行討論效率要高得多。為網(wǎng)站編寫詳細(xì)的需求說(shuō)明往往不那么合算,但你應(yīng)該有時(shí)間畫出幾個(gè)草圖、寫下幾段注解去說(shuō)明網(wǎng)站準(zhǔn)備提供的服務(wù)。這就要用到use case圖(用例圖)。use case可以看成一組功能——它可能對(duì)應(yīng)網(wǎng)站上的一個(gè)頁(yè)面、一個(gè)必須編寫的程序,或者網(wǎng)站上可能發(fā)生的一個(gè)動(dòng)作(比如,驗(yàn)證用戶登錄,改變用戶的配置文件,清除過(guò)期的帳號(hào),等等)。下面就是一個(gè)能夠幫助你規(guī)劃網(wǎng)站的use case圖。注意,該圖并沒(méi)有顯示出網(wǎng)站的所有use case,通常我們需要多個(gè)use case圖才能描述完整的網(wǎng)站功能。[/color][/p] [p][/p] [color=#000000][img]http://yesky.com/softchannel/72342376189788160/20021114/softfz201114_02.gif[/img][br][br]圖2:use case圖 [/color] [p][/p] [p][color=#000000] 即使是在這樣一個(gè)簡(jiǎn)單的use case圖中,我們也能夠輕松地表達(dá)出大量的信息。例如,include關(guān)系說(shuō)明兩個(gè)use case包含同樣的身份驗(yàn)證功能;extend關(guān)系說(shuō)明天氣頁(yè)面可能以wml或者h(yuǎn)tml格式顯示;generalization關(guān)系說(shuō)明各個(gè)具體的表現(xiàn)過(guò)程將遵從“render html page”或者“render wml page”所描述的基本行為規(guī)則以達(dá)到維持統(tǒng)一的風(fēng)格效果和統(tǒng)一宏觀行為模式的目的。[/color][/p] [p][color=#000000] 上圖也顯示出無(wú)線用戶能夠訪問(wèn)網(wǎng)站中其他用戶不能訪問(wèn)的某些區(qū)域。在這個(gè)use case圖中,只有無(wú)線用戶能夠訪問(wèn)交通流量報(bào)表。這是因?yàn)槲覀円呀?jīng)得知只有在旅途中的移動(dòng)用戶才需要交通流量報(bào)表,而且不想再花時(shí)間把交通流量報(bào)表制作成其他標(biāo)記語(yǔ)言形式。由此,“get traffic report”use case不需要分成wml和html兩種顯示形式,它可以直接包含“render wml traffic report”這個(gè)use case。[/color][/p] [p][color=#000000] 一般地,你應(yīng)該為這些use case加上簡(jiǎn)單的說(shuō)明。具體地說(shuō),你應(yīng)該描述每一個(gè)use case里將要發(fā)生什么,誰(shuí)可以使用它,它如何啟動(dòng)、如何停止,以及某些時(shí)候可能發(fā)生的特殊事件(稱為variation,即變化)。[/color][/p] [color=#000000] [b]2.3 用戶界面組織[/b] [/color] [p][color=#000000] 在制作use case的過(guò)程中,你會(huì)得到一些指示網(wǎng)站需要哪些用戶界面的線索。也許你早就有了設(shè)計(jì)某些頁(yè)面的絕妙主意,但use case幫助我們從另外一個(gè)角度來(lái)看問(wèn)題。用戶是否確實(shí)需要那么多的界面?某個(gè)頁(yè)面是否過(guò)于復(fù)雜?網(wǎng)站的導(dǎo)航設(shè)施是否簡(jiǎn)單易用,即從主頁(yè)訪問(wèn)常用服務(wù)是否很方便?在勾畫界面草圖、制作網(wǎng)站原型之前,你應(yīng)該先在use case圖中解決這些問(wèn)題。[/color][/p] [p][color=#000000] 當(dāng)use case逐漸清晰時(shí),我們就可以開(kāi)始勾畫出網(wǎng)站的大致結(jié)構(gòu)。有些人會(huì)強(qiáng)調(diào)說(shuō)頁(yè)面和文件應(yīng)該用相應(yīng)的構(gòu)件圖(component diagram)建模,其實(shí)類圖(class diagram)工具也很方便。請(qǐng)參見(jiàn)下圖:[/color][/p] [p][/p] [color=#000000][img]http://yesky.com/softchannel/72342376189788160/20021114/softfz201114_03.gif[/img][br][br]圖3:用戶界面及其布局 [/color] [p][/p] [p][color=#000000] 在上圖中,各種網(wǎng)站服務(wù)被捆綁到了不同的網(wǎng)站區(qū)域:[/color][/p] [p][/p] [color=#000000]/ - 網(wǎng)站的根 [/color] [color=#000000]/common/ - 公用的圖形、腳本、css文件等 [/color] [color=#000000]/maps/ - 地圖數(shù)據(jù) [/color] [color=#000000]/traffic/ - 交通流量報(bào)表 [/color] [li][color=#000000]/weather/ - 天氣報(bào)表[/color] [/li] [p][/p] [p][color=#000000] 該圖還顯示了在頁(yè)面之間傳遞的參數(shù)。regionid是一個(gè)很重要的參數(shù),它代表著用戶感興趣的地區(qū)(可能是一個(gè)國(guó)家、城市或者省份)。regionid在頁(yè)面之間傳遞地區(qū)信息,使得用戶能夠從指定地區(qū)的天氣報(bào)表跳轉(zhuǎn)到交通流量信息。至于網(wǎng)站的common區(qū)域,你可以看到指針指向的是整個(gè)包(package)而不是區(qū)域中的單個(gè)文件,這是一種減少混亂的簡(jiǎn)化方法,因?yàn)樗衅渌陌家玫酱蟛糠郑ㄈ绻皇侨康脑挘?common/區(qū)域中的文件。[/color][/p] [p][color=#000000] 用戶界面布局圖能夠幫助你避免網(wǎng)站混亂,它對(duì)于規(guī)劃網(wǎng)站是很有用的。而且,一旦確定了一種有效的網(wǎng)站結(jié)構(gòu)組織方式,它還可以作為一個(gè)固定的模式在多個(gè)網(wǎng)站上應(yīng)用。[/color][/p] [p][color=#000000]2.4 工具選擇 [/color][/p] [p][color=#000000] 對(duì)于小型網(wǎng)站,選擇工具和技術(shù)相當(dāng)簡(jiǎn)單。特別是由于投資的原因,只有少數(shù)幾種工具組合才具有現(xiàn)實(shí)意義——apache,mysql或者postgresql,php、perl或jsp/servlet。當(dāng)前最流行的組合是apache + php + mysql,有許多低價(jià)位的web托管服務(wù)支持并主要集中在這種工具組合上。而對(duì)于規(guī)模較大的網(wǎng)站,在投資應(yīng)用軟件之前,它必須對(duì)各種工具進(jìn)行更嚴(yán)格的評(píng)估和測(cè)試。下面是一個(gè)構(gòu)件圖的例子,它可以用來(lái)說(shuō)明網(wǎng)站的體系結(jié)構(gòu)。這個(gè)圖形雖然簡(jiǎn)單,但它已經(jīng)描述出了當(dāng)前大多數(shù)網(wǎng)站的體系結(jié)構(gòu),對(duì)于你的網(wǎng)站,重新制作該圖可能也沒(méi)有必要,因?yàn)樵僖矝](méi)有什么與眾不同的內(nèi)容值得加入這個(gè)圖形了。[/color][/p] [p][/p] [color=#000000][img]http://yesky.com/softchannel/72342376189788160/20021114/softfz201114_04.gif[/img][br][br]圖4:網(wǎng)站體系結(jié)構(gòu)圖 [/color] [p][/p] [p][color=#000000] 討論軟件的整個(gè)生命周期已經(jīng)超出了本文的范圍,但應(yīng)該指出的是,建立應(yīng)用原型和界面模型應(yīng)該在這個(gè)時(shí)候就開(kāi)始。務(wù)必記下有關(guān)網(wǎng)站結(jié)構(gòu)和頁(yè)面布局的一些想法,因?yàn)樽罱K你會(huì)想要為布局(菜單,導(dǎo)航條,頁(yè)面整體布局等)編寫一些公用的代碼。另外,如果你正在轉(zhuǎn)到新的工具和技術(shù),建立原型的工作能夠讓你確保設(shè)計(jì)的可行性,確信已經(jīng)就新工具的使用對(duì)開(kāi)發(fā)組成員進(jìn)行了足夠的培訓(xùn)。[/color][/p] [p][b][color=#000000] [b]三、設(shè)計(jì)階段[/b] [/color][/b][/p] [p][color=#000000] 設(shè)計(jì)階段應(yīng)該與分析階段交迭。一旦對(duì)自己所要構(gòu)造的系統(tǒng)有了較多的認(rèn)識(shí),你就應(yīng)該開(kāi)始擬定設(shè)計(jì)思路。先100%地分析系統(tǒng)再進(jìn)入設(shè)計(jì)階段是沒(méi)有意義的。需求總是不斷地發(fā)展,而設(shè)計(jì)本身有時(shí)也會(huì)推動(dòng)需求的發(fā)展(反之亦然)。所有的開(kāi)發(fā)者都在進(jìn)行某種類型的設(shè)計(jì)——只不過(guò)有些開(kāi)發(fā)者直接以編程代碼的形式進(jìn)行設(shè)計(jì)。雖然這也能夠完成任務(wù),但它使得管理復(fù)雜工程和在工作組之內(nèi)分配任務(wù)變得非常困難。先花一點(diǎn)時(shí)間通過(guò)設(shè)計(jì)圖構(gòu)造系統(tǒng)模型,以后你將獲得巨大的回報(bào)。[/color][/p] [color=#000000] [b]3.1 為未來(lái)而設(shè)計(jì)[/b] [/color] [p][color=#000000] 許多開(kāi)發(fā)者花費(fèi)在代碼調(diào)試和改寫上的時(shí)間超過(guò)了編寫代碼的時(shí)間,如果從一個(gè)以上網(wǎng)站的建設(shè)來(lái)看這個(gè)問(wèn)題,情況就尤其嚴(yán)重了。好的網(wǎng)站設(shè)計(jì)能夠以結(jié)構(gòu)、組織方式和代碼重用的形式應(yīng)用到多個(gè)網(wǎng)站上。然而,如果代碼只是匆匆忙忙堆砌而成,從現(xiàn)有代碼長(zhǎng)期獲益的機(jī)會(huì)就減少了。要對(duì)網(wǎng)站進(jìn)行設(shè)計(jì)規(guī)劃,一種很有效的方法是畫出類圖(class diagram)。下圖顯示了類圖通常要用到的許多重要關(guān)系。[/color][/p] [p][/p] [color=#000000][img]http://yesky.com/softchannel/72342376189788160/20021114/softfz201114_05.gif[/img][br][br]圖5:類圖 [/color] [p][/p] [p][color=#000000] 說(shuō)明如下:[/color][/p] [p][/p] [p][/p] [p][/p] [color=#000000]renderer類是一個(gè)抽象類(用斜體字顯示)。這意味著renderer類不能直接使用,程序只能創(chuàng)建其子類的實(shí)例(即new region())。為了滿足把頁(yè)面內(nèi)容顯示到不同類型瀏覽器的需要,所有用來(lái)生成內(nèi)容的頁(yè)面都必須從renderer類派生。 [/color] [p][/p] [p][/p] [color=#000000]weatherreport類創(chuàng)建并擁有region對(duì)象,這通過(guò)代表聚合關(guān)系(aggregate relationship)的黑色菱形顯示出來(lái),它表示一個(gè)對(duì)象擁有并創(chuàng)建其他對(duì)象。 [/color] [p][/p] [p][/p] [color=#000000]方法名字前面的加號(hào)(“+”)表示該方法是公用方法,可以被其他對(duì)象或者函數(shù)調(diào)用;減號(hào)(“-”)表示方法或者變量是私有的,只能由同一對(duì)象內(nèi)部的成員函數(shù)訪問(wèn)。在php中方法和變量是公用的,但我們應(yīng)該總是把變量看成私有,避免從對(duì)象外部直接訪問(wèn)變量。 [/color] [p][/p] [p][/p] [color=#000000]htmlweatherreport類依賴于htmlutils類。依賴關(guān)系(dependency)表示一個(gè)類要?jiǎng)?chuàng)建另一個(gè)類的實(shí)例或者調(diào)用另一個(gè)類的方法。 [/color] [p][/p] [p][/p] [li][color=#000000]類圖中的每一個(gè)類應(yīng)該注明:所有的方法(以及所有的變量,如有的話),方法的訪問(wèn)屬性(public,private或者protected),方法的返回值類型,方法的參數(shù),變量的類型。函數(shù)寫在前面,如果類有變量的話,則一般隨后在一個(gè)分開(kāi)的方框中列出。[/color] [/li] [p][/p] [p][color=#000000] 即使你所構(gòu)造的不是一個(gè)面向?qū)ο蟮南到y(tǒng),你仍就可以用類圖建立系統(tǒng)的模型。類能夠方便地描述出各種包含關(guān)系和你所編寫的函數(shù)文件。雖然此時(shí)類圖不再顯示繼承、構(gòu)成/聚合等面向?qū)ο笙到y(tǒng)特有的關(guān)系,但它可以用依賴關(guān)系描述出文件之間的調(diào)用關(guān)系。[/color][/p] [color=#000000] [b]3.2 運(yùn)行時(shí)的系統(tǒng)模型[/b] [/color] [p][color=#000000] 有些時(shí)候,我們需要顯示出應(yīng)用的各個(gè)部件如何在運(yùn)行時(shí)協(xié)作完成任務(wù)。前面的類圖顯示了類之間的關(guān)系,但它沒(méi)有顯示出調(diào)用出現(xiàn)的次序,也沒(méi)有顯示出來(lái)自一個(gè)函數(shù)的結(jié)果可能決定下一次調(diào)用的目標(biāo)。為了在更動(dòng)態(tài)的層面上描述系統(tǒng),uml提供了許多其他類型的圖。對(duì)于web網(wǎng)站設(shè)計(jì)來(lái)說(shuō),情節(jié)圖(scenario diagram)特別有用。情節(jié)圖分成兩種:協(xié)作圖(collaboration diagram),序列圖(sequence diagram)。一般地,我們不會(huì)建立系統(tǒng)所有交互過(guò)程的模型,情節(jié)圖只用來(lái)描述系統(tǒng)最復(fù)雜的部分,或用來(lái)概括出代碼的一般調(diào)用模式。例如,我們可能要示范特定的頁(yè)面如何與驗(yàn)證用戶身份的代碼協(xié)作,或者要顯示頁(yè)面如何調(diào)用公用代碼(工具性的框架代碼)以保持統(tǒng)一的外觀和風(fēng)格。[/color][/p] [p][color=#000000] 協(xié)作圖和序列圖分別舉例如下。[/color][/p] [p][/p] [color=#000000][img]http://yesky.com/softchannel/72342376189788160/20021114/softfz201114_06.gif[/img][br][br]圖6:協(xié)作圖 [/color] [p][/p] [p][color=#000000] 上面的協(xié)作圖顯示了從web網(wǎng)站獲取天氣報(bào)表的一般過(guò)程。注意該圖忽略了一些不重要的方法,因?yàn)槲覀冎粚?duì)處理過(guò)程中的關(guān)鍵步驟感興趣。你可以根據(jù)編號(hào)“1”到“1.3.3.4”找出各個(gè)函數(shù)的執(zhí)行次序。一些人喜歡以“1,2,3,……”形式對(duì)執(zhí)行步驟編號(hào),但一般而言,用“1,1.1,1.2,2,2.1,……”的形式顯示出調(diào)用棧的深度是一種更好的選擇,這種編號(hào)方式能夠更清楚地顯示出程序的控制轉(zhuǎn)換過(guò)程。例如,上圖顯示出report()方法調(diào)用了wmlutil以及region對(duì)象中的許多方法:在通過(guò)一系列的查詢和內(nèi)容生成函數(shù)為指定地區(qū)生成報(bào)表之前,我們調(diào)用了wmlutil中的buildheader(...)函數(shù);最后我們調(diào)用的是wmlutil模塊的buildfooter(...),然后返回report()方法,最后返回getpage()。你可以為協(xié)作圖加上更多的細(xì)節(jié)說(shuō)明,比如返回值、約束、條件等。[/color][/p] [p][/p] [color=#000000][img]http://yesky.com/softchannel/72342376189788160/20021114/softfz201114_07.gif[/img][br][br]圖7:序列圖 [/color] [p][/p] [p][color=#000000] 就圖形所傳達(dá)的信息而言,次序圖和協(xié)作圖非常相似。事實(shí)上,許多uml建模工具能夠從協(xié)作圖生成次序圖,或者相反。次序圖與協(xié)作圖的主要不同之處在于:在次序圖上,事件的發(fā)生次序一目了然,非常直觀。另外,次序圖中還可以加入生存周期和時(shí)間方面的詳細(xì)信息,比如延遲、線程并發(fā)、對(duì)象的構(gòu)造和刪除等。[/color][/p] [p][color=#000000] 在決定選用次序圖還是協(xié)作圖的時(shí)候,考慮以下幾點(diǎn)有助于你作出最合適的選擇:[/color][/p] [p][/p] [color=#000000]如果要顯示代碼中與時(shí)間或線程密切相關(guān)的問(wèn)題,選擇次序圖。 [/color] [color=#000000]如果要顯示對(duì)象之間的交互模式,選擇協(xié)作圖。 [/color] [color=#000000]如果要顯示幾個(gè)或者大量對(duì)象之間的交互過(guò)程,選擇次序圖。 [/color] [li][color=#000000]如果要顯示少量對(duì)象之間的大量消息傳遞或交互過(guò)程,選擇協(xié)作圖。[/color] [/li] [p][color=#000000][b]3.3 應(yīng)用部署的規(guī)劃[/b] [/color][/p] [p][color=#000000] 正如本文前面“工具選擇”部分所提到的,大多數(shù)web網(wǎng)站的體系結(jié)構(gòu)并不復(fù)雜。盡管如此,部署圖(deployment diagram)在兩個(gè)方面仍舊很有用:網(wǎng)站結(jié)構(gòu),文件組織。對(duì)于文件組織,前面討論界面規(guī)劃時(shí)已經(jīng)提到它也可以用類建模工具進(jìn)行規(guī)劃。下面給出一個(gè)簡(jiǎn)單的構(gòu)件圖供參考,但根據(jù)網(wǎng)站的需要和復(fù)雜程度的不同,你可能不需要它。[/color][/p] [p][/p] [color=#000000][img]http://yesky.com/softchannel/72342376189788160/20021114/softfz201114_08.gif[/img][br][br]圖8:構(gòu)件圖 [/color] [p][/p] [p][color=#000000] [b]3.4 設(shè)計(jì)原則[/b] [/color][/p] [p][color=#000000] uml只是一個(gè)工具。如果使用得法,uml能夠幫助我們輕松地構(gòu)造出更好的網(wǎng)站。然而,要設(shè)計(jì)出優(yōu)秀的網(wǎng)站,關(guān)鍵仍在于要有一個(gè)好的設(shè)計(jì)原則或理念。[/color][/p] [p][color=#000000] “提高類的內(nèi)聚力,減少不同類之間的聯(lián)系”這一點(diǎn)在談到好的面向?qū)ο笤O(shè)計(jì)原則時(shí)經(jīng)常被反復(fù)引用。一個(gè)內(nèi)聚的類包含那些在目標(biāo)和作用域上都緊密相關(guān)的行為和信息。它意味著你不應(yīng)該把構(gòu)造ui的代碼和實(shí)現(xiàn)數(shù)學(xué)算法的代碼混合到一起,你應(yīng)該盡力把所有與用戶緊密相關(guān)的信息封裝到useraccount類。內(nèi)聚式設(shè)計(jì)是一個(gè)重要的設(shè)計(jì)原則,原因有很多:它有助于減少類之間的依賴關(guān)系,使得設(shè)計(jì)更直觀、更容易理解,方便了向其他開(kāi)發(fā)者介紹整個(gè)設(shè)計(jì),減少了開(kāi)發(fā)者同一時(shí)刻需要操作的類的數(shù)量,等等。例如,如果你要改變網(wǎng)站的用戶身份驗(yàn)證機(jī)制,只修改單個(gè)文件中的一個(gè)類無(wú)疑要比修改多個(gè)文件、多個(gè)類更加方便。[/color][/p] [p][color=#000000] “減少不同類之間的聯(lián)系”意味著使類或者文件之間的交互減到最少。它不僅使得整個(gè)設(shè)計(jì)容易理解,而且也方便了代碼的維護(hù)。請(qǐng)考慮下面這個(gè)例子:[/color][/p] [p][/p] [color=#000000][img]http://yesky.com/softchannel/72342376189788160/20021114/softfz201114_09.gif[/img][br][br]圖9:設(shè)計(jì)實(shí)例a [/color] [p][/p] [p][color=#000000] 除非深入了解了上述各個(gè)類的用途,要估計(jì)這些類的內(nèi)聚程度是不可能的。然而,從這些類之間的關(guān)系可以看出,這個(gè)設(shè)計(jì)方案已經(jīng)成功地減少了不同類之間的聯(lián)系。類之間的交互被減到了最少,從而使得系統(tǒng)的行為很容易理解。更重要的是,修改任意一個(gè)類時(shí)受影響的類數(shù)量都減到了最少(例如,修改d類只直接影響b類)。另外,要訪問(wèn)d類中的功能,我們無(wú)需知道任何有關(guān)e、f或g類的情況。作為比較,請(qǐng)考慮下圖:[/color][/p] [p][/p] [color=#000000][img]http://yesky.com/softchannel/72342376189788160/20021114/softfz201114_10.gif[/img][br][br]圖10 設(shè)計(jì)實(shí)例b [/color] [p][/p] [p][color=#000000] 顯然,在這個(gè)設(shè)計(jì)實(shí)例中,類之間的聯(lián)系是相當(dāng)緊密的。一旦對(duì)d1類作了修改,為了檢查這種修改對(duì)其他類的影響,我們必須對(duì)其他類進(jìn)行廣泛的測(cè)試。[/color][/p] [p][color=#000000] 只有在實(shí)踐中不斷鍛煉才能避免出現(xiàn)過(guò)于復(fù)雜的設(shè)計(jì),但注意以下幾點(diǎn)有助于達(dá)到這一目標(biāo):[/color][/p] [p][/p] [color=#000000]提高類的內(nèi)聚力。不要把密切相關(guān)的功能分散到多個(gè)文件和類之中。 [/color] [color=#000000]采用直觀、有意義的名字。如果其他人不能了解類、函數(shù)或者變量的作用,不管類的結(jié)構(gòu)是多么完美,整個(gè)設(shè)計(jì)仍缺乏直觀性。過(guò)多地采用縮寫詞會(huì)影響設(shè)計(jì)的可理解性。 [/color] [color=#000000]不要害怕改寫代碼。有些時(shí)候,在幾個(gè)類之間移動(dòng)一些函數(shù)能夠大大地簡(jiǎn)化代碼。 [/color] [color=#000000]類應(yīng)該保持緊湊、簡(jiǎn)潔。代碼膨脹是類缺乏內(nèi)聚力的一種征兆。過(guò)于龐大的類、模塊或者文件往往缺乏明確的用途和目標(biāo)。 [/color] [color=#000000]讓其他人復(fù)查你的設(shè)計(jì)。其他人可能有新的想法,或者為你指出你以為顯而易見(jiàn)但別人卻不能明白的問(wèn)題。 [/color] [li][color=#000000]在早期設(shè)計(jì)階段不要考慮太多的性能問(wèn)題。與一個(gè)笨拙的、為了昨天所出現(xiàn)的問(wèn)題而優(yōu)化的設(shè)計(jì)相比,一個(gè)簡(jiǎn)潔、經(jīng)過(guò)精心調(diào)整的設(shè)計(jì)更容易進(jìn)行性能優(yōu)化。注意這并不是建議把性能問(wèn)題拋到腦后,而是建議把細(xì)節(jié)優(yōu)化問(wèn)題留到工程后期考慮。[/color] [/li] [p][/p] [p][color=#000000] [b]四、uml工具 [/b][/color][/p] [p][color=#000000] 下面是一些值得考慮的uml建模工具:[/color][/p] [p][/p] [color=#000000]microsoft visio:visio professional 2000現(xiàn)在開(kāi)始提供內(nèi)建的uml支持。如果考慮visio繪圖工具的其他各種用途,這是一個(gè)相當(dāng)有價(jià)值的工具。如果你使用2000以前的版本,你可以在這里找到visio stencil and template for uml。 [/color] [color=#000000]rational rose:這是一個(gè)推薦使用的工具,但對(duì)于許多小型web工程來(lái)說(shuō)它顯得很昂貴。有了rational rose這樣的工具,改進(jìn)和維護(hù)設(shè)計(jì)、從模型生成報(bào)表、在平行協(xié)作環(huán)境中與他人共同進(jìn)行建模工作就很方便了。 [/color] [color=#000000]magicdraw:一個(gè)基于java的廉價(jià)uml建模工具。 [/color] [color=#000000]together:與c/c++和java聯(lián)系密切,支持uml建模。 [/color] [color=#000000]objecteering uml:一個(gè)免費(fèi)的個(gè)人uml產(chǎn)品。 [/color] [li][color=#000000]system architect:一個(gè)很受歡迎的高端uml建模工具,支持雙向工程(round-trip engineering)。[/color] [/li] [p][/p] [p][color=#000000][b] 五、附錄:常用uml符號(hào)和參考資源[/b] [/color][/p] [p][color=#000000] 下面這個(gè)表格簡(jiǎn)要介紹了常用的uml符號(hào)和關(guān)系。要了解有關(guān)uml概念和各種面向?qū)ο笮g(shù)語(yǔ)的詳細(xì)說(shuō)明,請(qǐng)參見(jiàn)后面的參考資源。[/color][/p] [color=#000000]符號(hào)[/color] [color=#000000]說(shuō)明[/color] [color=#000000][img]http://yesky.com/softchannel/72342376189788160/20021114/softfz201114_11.gif[/img][/color] [color=#000000]package[br]包。用來(lái)聚集和組織模型中的一個(gè)部分(use case,類,等等)。[/color] [color=#000000][img]http://yesky.com/softchannel/72342376189788160/20021114/softfz201114_12.gif[/img][/color] [color=#000000]actor[br]參與者。它代表一個(gè)用戶或者其他外部的激勵(lì)器。[/color] [color=#000000][img]http://yesky.com/softchannel/72342376189788160/20021114/softfz201114_13.gif[/img][/color] [color=#000000]use case[br]用例。use case描述了系統(tǒng)某一部分的行為。一般地,use case記錄對(duì)某個(gè)系統(tǒng)功能的需求,而這個(gè)功能由對(duì)動(dòng)作或者事件的應(yīng)答示范。[/color] [color=#000000][img]http://yesky.com/softchannel/72342376189788160/20021114/softfz201114_14.gif[/img][/color] <> relationship[br]包含關(guān)系。標(biāo)注為<>關(guān)系的use case關(guān)系能夠引入其他use case的功能。這是一種方便的分割use case、避免單個(gè)use case過(guò)于龐大的方法。 [color=#000000][img]http://yesky.com/softchannel/72342376189788160/20021114/softfz201114_15.gif[/img][/color] <> relationship[br]擴(kuò)充關(guān)系。標(biāo)注為<>關(guān)系的use case關(guān)系能夠在不重復(fù)現(xiàn)有use case的各種描述和需求的情況下,使現(xiàn)有use case的行為特殊化。 [color=#000000][img]http://yesky.com/softchannel/72342376189788160/20021114/softfz201114_16.gif[/img][/color] [color=#000000]dependency[br]依賴。正如其字面意義,它表示一個(gè)事物依賴另一個(gè)事物。這意味著一個(gè)事物了解另一個(gè)事物,并需要另外一個(gè)事物才能發(fā)揮功能。[/color] [color=#000000][img]http://yesky.com/softchannel/72342376189788160/20021114/softfz201114_17.gif[/img][/color] [color=#000000]note[br]注解。在uml圖中提供注解的目的是以簡(jiǎn)短的說(shuō)明闡明圖表的內(nèi)容。[/color] [color=#000000][img]http://yesky.com/softchannel/72342376189788160/20021114/softfz201114_18.gif[/img][/color] [color=#000000]component[br]構(gòu)件。構(gòu)件一般代表一個(gè)軟件單元,它可能是一個(gè)dll、一個(gè)執(zhí)行文件,或者是一個(gè)數(shù)據(jù)庫(kù)。[/color] [color=#000000][img]http://yesky.com/softchannel/72342376189788160/20021114/softfz201114_19.gif[/img][/color] [color=#000000]node[br]節(jié)點(diǎn)。節(jié)點(diǎn)一般代表一臺(tái)機(jī)器,這臺(tái)機(jī)器具有運(yùn)行一個(gè)或者多個(gè)系統(tǒng)構(gòu)件的能力。[/color] [color=#000000][img]http://yesky.com/softchannel/72342376189788160/20021114/softfz201114_20.gif[/img][/color] [color=#000000]class[br]類。uml中的類與面向?qū)ο缶幊讨械念愐粯?,即它定義并封裝了一組行為和屬性。類在運(yùn)行時(shí)被實(shí)例化從而創(chuàng)建出對(duì)象。[/color] [color=#000000][img]http://yesky.com/softchannel/72342376189788160/20021114/softfz201114_21.gif[/img][/color] [color=#000000]object[br]對(duì)象。對(duì)象是類的實(shí)例。例如,“myclass myobj = new myclass; ”創(chuàng)建了一個(gè)myobj對(duì)象。[/color] [color=#000000][img]http://yesky.com/softchannel/72342376189788160/20021114/softfz201114_22.gif[/img][/color] [color=#000000]generalization[br]泛化。父類能夠派生出(或稱為特殊化)具有更多特殊行為的子類,此時(shí)父類即為子類的超類(或子類的泛化版本)。[/color] [color=#000000][img]http://yesky.com/softchannel/72342376189788160/20021114/softfz201114_23.gif[/img][/color] [color=#000000]interface[br]接口。接口定義了一組可以從外部訪問(wèn)的行為。類、庫(kù)、執(zhí)行文件、數(shù)據(jù)文件都可以由接口來(lái)描述。接口本身并不實(shí)現(xiàn)任何功能,它只是和聲明實(shí)現(xiàn)該接口的對(duì)象訂立了一個(gè)必須實(shí)現(xiàn)哪些行為的契約。[/color] [color=#000000][img]http://yesky.com/softchannel/72342376189788160/20021114/softfz201114_24.gif[/img][/color] [color=#000000]abstract class[br]抽象類。抽象類不能直接實(shí)例化,但允許派生出具體的、有實(shí)際功能的類。[/color] [color=#000000][img]http://yesky.com/softchannel/72342376189788160/20021114/softfz201114_25.gif[/img][/color] [color=#000000]association[br]關(guān)聯(lián)。關(guān)聯(lián)就是把兩個(gè)或以上的類連接起來(lái)。你可以為兩個(gè)類之間的這種關(guān)系提供更具體的信息。關(guān)聯(lián)是兩個(gè)或多個(gè)特定類元之間的關(guān)系,它描述了這些類元的實(shí)例的聯(lián)系。在一個(gè)關(guān)聯(lián)中同一個(gè)類可以出現(xiàn)在多個(gè)位置上。[/color] [color=#000000][img]http://yesky.com/softchannel/72342376189788160/20021114/softfz201114_26.gif[/img][/color] [color=#000000]aggregation[br]聚合。聚合關(guān)系表示某個(gè)對(duì)象屬于其他對(duì)象所有。[/color] [p][/p] [p][color=#000000] 參考資源:[/color][/p] [color=#000000]uml 1.3 specification:uml規(guī)范,來(lái)自omg.org [/color] [color=#000000]uml resource pag 該文章在 2010/7/3 16:17:07 編輯過(guò) |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |