| C++編程雜談之四:漫談UML 作者:xulion UML對很多人來(lái)說(shuō)應該不是一個(gè)陌生的概念,這一兩年來(lái),UML被大家越來(lái)越多的討論著(zhù)。本來(lái)UML跟我這個(gè)主題似乎并不能扯上多大的關(guān)系(它是語(yǔ)言無(wú)關(guān)的,甚至可以說(shuō)其本身就是一種語(yǔ)言——用于交流的)。我在此談到它有兩個(gè)目的: 1. UML是針對面向對象軟件開(kāi)發(fā)的,而C++正是這樣的一種語(yǔ)言 2. UML在設計中被越來(lái)越多的使用著(zhù),而下一篇雜談準備討論設計模式,如果不了解UML,那么無(wú)法進(jìn)行下去 UML, 全稱(chēng):Unified Modeling Language,其目的是為了對軟件密集型的制品進(jìn)行可視化、詳述、構造和文檔化的圖形語(yǔ)言。UML是依據許多前人的思想總結出的成果,1997年被 OMG通過(guò)并成為標準(所以在《設計模式》書(shū)中如果你看到與標準不一樣的地方,不要奇怪,那本書(shū)是95年的)。關(guān)于UML的歷史和更詳細的描述,可以參考 《UML 參考手冊》。UML主要由一系列視圖組成,其中包括靜態(tài)視圖(Static view),用例視圖(Use case view)活動(dòng)視圖(Activity view)等,不同的圖用處自然也不一樣,而對開(kāi)發(fā)人員來(lái)講(或者說(shuō)為我的下一篇來(lái)說(shuō)),更重要的應該是靜態(tài)視圖中的類(lèi)圖(class diagram)和交互視圖(Interaction view)中的順序圖(Sequence diagram),請注意view和diagram的區別。 類(lèi)圖 靜態(tài)視圖說(shuō)明了對象的結構,其中最常用的就是類(lèi)圖,類(lèi)圖可以幫助我們更直觀(guān)的了解一個(gè)系統的體系結構,有時(shí)侯,描述系統快照的對象圖(Object diagram)也是很有用的。在這里,我們主要介紹類(lèi)圖,下面的圖就是一個(gè)簡(jiǎn)單的類(lèi)圖: 在類(lèi)圖中,類(lèi)由矩形框來(lái)表示,如上圖中,定義了4個(gè)類(lèi),分別為Base、A、B、C,類(lèi)之間的關(guān)系通過(guò)各種線(xiàn)條和其他符號來(lái)表示,在上圖中,空心的三角表 示繼承關(guān)系,在UML的術(shù)語(yǔ)中,這種關(guān)系被稱(chēng)為泛化(Generalization),所以上面的類(lèi)用等價(jià)代碼表示為: class Base{…}; class A:public Base{…}; class B:public Base{…}; class C:public Base{…}; 我們再看下一幅圖: 這幅圖與上幅幾乎沒(méi)有什么區別,唯一的不同就是Base類(lèi)中增加了成員,一個(gè)私有的integer _x(UML術(shù)語(yǔ)為property)和一個(gè)公有的fun()的函數(method),是否需要這些類(lèi)的內部細節UML本身并沒(méi)有限制,完全取決于你自己 如何使用,UML的用處在于幫助你了解系統,所以只要你自己覺(jué)得足夠清楚,那么夠了,不要再復雜了。 接著(zhù)看第三幅圖: 上面圖中的箭頭表示一種關(guān)系,箭頭另一邊有一個(gè)菱形(空心)表示聚合(aggregation),聚合的意義表示has-a關(guān)系,其等價(jià)代碼如下: class A{…}; class B{ A* theA;…}; 聚合是一種相對松散的關(guān)系,聚合類(lèi)B不需要對被聚合的類(lèi)A負責。 下面的圖: 這幅圖與上面的唯一區別是菱形為實(shí)心的,它代表了一種更為堅固的關(guān)系——組合(composition)。組合表示的關(guān)系也是has-a,不過(guò)在這里,A的生命期受B控制,通常情況,等價(jià)代碼如下: class A{…}; class B{A theA;…}; 即A會(huì )隨著(zhù)B的創(chuàng )建而創(chuàng )建,隨B的消亡而消亡。 下圖: 這里B與A的關(guān)系只是一種依賴(lài)關(guān)系,這種關(guān)系表明,如果類(lèi)A被修改,那么類(lèi)B會(huì )受到影響,一個(gè)簡(jiǎn)單的例子就是: class A{…}; class B{fun(A params);…}; 常用的關(guān)系就是我們上面用的這些,通過(guò)這些關(guān)系和類(lèi)表示的類(lèi)圖,我們可以用圖形化的方式描述一個(gè)系統的設計部分,當你習慣使用UML后,你會(huì )發(fā)現,這往往比你告訴同伴某某類(lèi)從某某類(lèi)派生,派生類(lèi)又和某某類(lèi)具有什么關(guān)系容易的多。 順序圖: UML中另外一個(gè)常用的圖形就是交互視圖中的順序圖,在以往的過(guò)程化語(yǔ)言中,我們通常使用流程圖來(lái)描述一個(gè)函數(系統)是如何工作的,而在面向對象的系統中,這顯然是不可行的,而順序圖正是來(lái)解決這個(gè)問(wèn)題的。 假設有如下的偽代碼: class circle { public: void fillcolor() { // ... }; void draw() { fillcolor(); }; }; class window { public: void drawcircle() { _circle.draw(); }; private: circle _circle; }; 對于下面的調用: window wnd; wnd.drawcircle(); 對應的順序圖如下: 圖中上方的方塊表示參與的對象,垂直的虛線(xiàn)表示對象的生命線(xiàn),方框表示激活,其中箭頭表示了一個(gè)調用消息(也可以有回送return),如果是異步的消息,則用半箭頭表示,其中draw表示了一個(gè)自調用(self call) 至 此,UML中最常用的(從開(kāi)發(fā)人員的角度),當然UML的內容遠遠不只這些,這里的介紹只是一些簡(jiǎn)單的概括,并且UML本身也在不斷的發(fā)展之中,無(wú)論怎 樣,我覺(jué)得UML會(huì )越來(lái)越多的深入我們的開(kāi)發(fā)過(guò)程中,特別是對下一篇我們要介紹的設計模式而言,類(lèi)圖是主要的描述工具(到那個(gè)時(shí)候你會(huì )體會(huì )到UML描述的 優(yōu)越)。 如果你看過(guò)《設計模式》著(zhù)本書(shū),你會(huì )發(fā)現與我上面所描述的有一些細微的不同,不要緊張,《設計模式》是GOF95年的作品,那時(shí)候UML還沒(méi)有形成,而 且,其中也明確那是OMT方法(Jim Rumbaugh在通用電氣發(fā)表的建模技術(shù)——Object Modeling Technique)和Booch方法。如果你覺(jué)得UML有些讓你無(wú)所適從,也不必緊張,UML本身只是一個(gè)輔助工具,它的目的是幫助你描述系統,不是復 雜你的工作,如果你的系統很簡(jiǎn)單,一句話(huà)可以說(shuō)的很清楚,那么不要用UML,如果你只想說(shuō)明類(lèi)之間的關(guān)系,而不是類(lèi)的接口描述,那么像第一副圖那樣簡(jiǎn)單的 描述就很好,總之不要去追求細節,只要能說(shuō)明問(wèn)題,那么你的目的就達到了(甚至你沒(méi)有必要完全遵守規范)。 參考書(shū)目: 《設計模式——可復用面向對象軟件的基礎》 作者: Erich Gamma 等 譯者:李英軍 馬曉星 蔡敏 劉建中 機械工業(yè)出版社2000 《UML參考手冊》作者: James Rumbaugh Ivar Jacobson Grady Booch 譯者: 姚淑珍 唐發(fā)根 機械工業(yè)出版社2001 《UML精粹——標準對象建模語(yǔ)言簡(jiǎn)明指南(第2版)》 作者: Martin Fowler&Kendall Scott 譯者: 徐家福 清華大學(xué)出版社 2002 《Design Patterns Explained》Alan Shalloway, James R. Trott Addison-Wesley Pub 2001 |