分析业务模型-类图(Class Diagram)(上)
摘要:類圖(Class Diagram)可能是用得最多的一種UML圖。類圖的基本語法并不復(fù)雜,你可能最多學(xué)習(xí)兩三天就可以掌握,然而要真正做到活用類圖則可能需要幾年的功力。類圖是鍛煉面向?qū)ο蠓治?#xff08;OOA:Object-Oriented Analysis)和面向?qū)ο笤O(shè)計(jì)(OOD:Object-Oriented Design)思想的重要的工具,是業(yè)務(wù)結(jié)構(gòu)建模的重要工具。本章將會(huì)有大量的實(shí)戰(zhàn)練習(xí),你的OOA思想將會(huì)接受極大的考驗(yàn)和提升。
本文全長1萬6千多字,并且有幾十張插圖,由于篇幅過長特分為上、下兩篇發(fā)出。
本文來自新書《活用UML——需求分析高手》的第3章。
作者:張傳波
www.umlonline.org
大綱:
上篇:
3.1 面向過程與面向?qū)ο?br />3.2 類圖的基礎(chǔ)知識(shí)
3.3 類之間的關(guān)系
3.4 演練類之間的關(guān)系
下篇:
3.5 類的“遞歸”關(guān)系與“三角”關(guān)系
3.6 考試管理系統(tǒng)——類圖綜合訓(xùn)練
3.7 關(guān)于對象圖
3.8 小結(jié)與練習(xí)
?
3.1??面向過程與面向?qū)ο?br />
本小節(jié)的內(nèi)容涉及到編程方面的知識(shí),如果你有相關(guān)經(jīng)驗(yàn),請認(rèn)真閱讀本小節(jié),本小節(jié)目的是澄清開發(fā)人員的一些面向過程和面向?qū)ο蟮睦斫庹`區(qū)。如果你沒有編程經(jīng)驗(yàn)或者對此不感興趣,可忽略本小節(jié)直接閱讀下一小節(jié),忽略本小節(jié)并不影響你對后文的理解。
上世紀(jì)90年代初,當(dāng)我讀高中的時(shí)候首次接觸電腦,并且學(xué)習(xí)了第一門編程語言Basic。當(dāng)時(shí)不知道什么是面向過程,也不知道何為面向?qū)ο?#xff0c;只知道不斷地學(xué)習(xí)Basic語言的算法,感受編程的樂趣。當(dāng)時(shí)學(xué)習(xí)的Basic語言,現(xiàn)在看來是很老土的面向過程的語言。
后來學(xué)習(xí)了C語言,不久后朋友告訴我應(yīng)該學(xué)習(xí)C++,我問:C和C++有什么不同?于是朋友告訴我:C是面向過程的語言,C++是面向?qū)ο蟮恼Z言,C++比C最不同的地方就是C++有類(Class),C沒有……
這就是我對面向過程和面向?qū)ο蟮牡谝挥∠?#xff0c;后來又學(xué)習(xí)了一些面向?qū)ο蟮闹R(shí),似乎將很多東西變成類,類里面有特性和操作,就是面向?qū)ο蟆H欢ぷ骱蟀l(fā)現(xiàn)完全不是那么回事,面向?qū)ο笳娴氖侵豢梢鈺?huì)難以言傳啊。下面說說我對面向過程和面向?qū)ο蟮睦斫?#xff0c;希望對你有幫助。
很多年前的程序只有一行行的代碼,后來出現(xiàn)代碼難以組織、不好閱讀、重復(fù)代碼多等問題。于是“發(fā)明”了方法,將一段代碼放到方法里面,實(shí)現(xiàn)一定的功能,供別的地方調(diào)用。方法的“發(fā)明”是編程史上的一大進(jìn)步,其實(shí)方法就是一定程度上的封裝,只要調(diào)用者給出符合要求的輸入,方法就會(huì)返回合適的輸出,調(diào)用者完全不用理會(huì)方法的具體實(shí)現(xiàn),而方法里面又可以調(diào)用方法。隨著后來的發(fā)展,出現(xiàn)了結(jié)構(gòu)化編程,將編程的藝術(shù)更推進(jìn)一步。
無論是方法還是結(jié)構(gòu)化編程,都是我們提高編程技術(shù)以更好地解決復(fù)雜的、高難度的問題的一種手段而已。但后來發(fā)現(xiàn)問題越來越復(fù)雜,結(jié)構(gòu)化編程開始招架不住了,于是有人提出面向?qū)ο缶幊獭C嫦驅(qū)ο缶幋a是一種基于類的編程方法,每一個(gè)類有特定的作用,類中有屬性和方法,一條條語句只存在于屬性或方法中。用面向?qū)ο蟮乃悸穪砬蠼鈫栴},就是要設(shè)計(jì)出能解決問題的一個(gè)或多個(gè)類,通過類之間的相互操作和協(xié)作來解決問題。類是對代碼的進(jìn)一步封裝,比方法對代碼的封裝要進(jìn)一大步,類的出現(xiàn)要求我們編程的思想更進(jìn)一步。
對于面向過程和面向?qū)ο缶幊檀嬖谶@樣的一些誤區(qū):
1) 面向?qū)ο蟊让嫦蜻^程更高級(jí),無需注重結(jié)構(gòu)化編程和編程基本功。
前面提到的編碼發(fā)展史,簡單說就是以下幾個(gè)階段:
? 一行行的代碼
? 用方法組織起來的代碼
? 結(jié)構(gòu)化代碼
? 面向?qū)ο蟮拇a(用類來組織的代碼)
看上去似乎后面的可以取代前面的,特別是到了面向?qū)ο缶幊屉A段,似乎人人都可以喊自己是面向?qū)ο蟮?#xff0c;真正能寫出好代碼的人并不多。其實(shí)編碼基本功相當(dāng)重要,結(jié)構(gòu)化編程也相當(dāng)重要,如果這些基礎(chǔ)不行,面向?qū)ο笾荒芎昂岸选N以谝郧肮菊衅赋绦騿T,編程基本功是必考的。
2) 面向?qū)ο缶幊叹褪菍⒋a放進(jìn)一個(gè)個(gè)類而已。
我最開始對面向?qū)ο缶幊痰目捶ɑ旧暇褪沁@樣,后來用VB編程還是未能真正體會(huì)面向?qū)ο缶幊?#xff0c;直到后來使用真正面向?qū)ο蟮恼Z言C#以及學(xué)習(xí)了UML和設(shè)計(jì)模式,才開始真正體會(huì)。如何設(shè)計(jì)、提煉、規(guī)劃類,是很講技巧和功力的事情,面向?qū)ο笠稽c(diǎn)都不容易。
3) 將業(yè)務(wù)概念直接轉(zhuǎn)變?yōu)轭?#xff0c;賦予合適的屬性和操作,就可以解決問題。
需求階段的建模與設(shè)計(jì)階段的建模是很不一樣的,需求建模是對業(yè)務(wù)和需求的提煉,優(yōu)秀的需求建模是設(shè)計(jì)建模的良好開始,但優(yōu)秀的設(shè)計(jì)建模還需要考慮更多的設(shè)計(jì)上的事情,并不是簡單地將業(yè)務(wù)模型直接轉(zhuǎn)變化設(shè)計(jì)模型就可以解決問題的。
本書不會(huì)具體介紹如何面向?qū)ο蟮鼐幊?#xff0c;而是如何面向?qū)ο蟮剡M(jìn)行需求分析,我們將會(huì)借鑒面向?qū)ο缶幊痰乃枷胗糜谛枨蠓治龉ぷ髦小S虚_發(fā)經(jīng)驗(yàn)的人士從事需求分析工作時(shí),受面向過程和面向?qū)ο缶幊痰乃季S習(xí)慣影響,容易處于“技術(shù)實(shí)現(xiàn)”的角度來分析問題。這需要一個(gè)轉(zhuǎn)變過程,我強(qiáng)烈建議你先忘掉自己的開發(fā)經(jīng)歷。本書接下來的內(nèi)容,將會(huì)通過一個(gè)又一個(gè)的具體案例和練習(xí),讓你體會(huì)面向?qū)ο蠓治鲂枨蟮姆椒ā.?dāng)完成這個(gè)轉(zhuǎn)變時(shí),你會(huì)發(fā)現(xiàn)編程思想和分析需求的思想有共通之處但又不太一樣,你在編程時(shí)養(yǎng)成的嚴(yán)謹(jǐn)、全面、深入的分析方法會(huì)讓你在需求分析工作中受益不淺。
?
3.2 類圖的基礎(chǔ)知識(shí)
?
類圖有什么用?
某項(xiàng)目客戶提供的原始需求文檔中,有下面這樣的一段話,請你仔細(xì)閱讀,看看能不能將你搞暈?
“本項(xiàng)目是在一期的基礎(chǔ)上增加對電纜、通訊工程的管理和施工詳細(xì)數(shù)據(jù)的記錄和統(tǒng)計(jì),使整個(gè)系統(tǒng)更好的管理各工程項(xiàng)目從中標(biāo)開始到竣工驗(yàn)收的全部過程和資料和分析施工過程的數(shù)據(jù)。 本系統(tǒng)將一條或一個(gè)標(biāo)段的架空電力線路工程定為一個(gè)單位工程,即系統(tǒng)中的一個(gè)工程項(xiàng)目;每個(gè)單位工程分為若干個(gè)分部工程;每個(gè)分部工程分為若干個(gè)分項(xiàng)工程;每個(gè)分項(xiàng)工程中又分為若干相同單元工程。”
這段話中帶下劃線的文字,可能是本系統(tǒng)的一些關(guān)鍵業(yè)務(wù)概念。
如果你還沒有暈的話,請回答下面的問題:
1) 你能用一句話描述這個(gè)系統(tǒng)是做什么的嗎?
2) 這段話有什么業(yè)務(wù)概念?每個(gè)業(yè)務(wù)概念是什么意思?
3) 這些業(yè)務(wù)概念之間是怎樣的關(guān)系?
上面那段文字充斥了大量的術(shù)語、概念(帶下劃線的字),如果你不是專業(yè)人士,恐怕難以讀懂上述文字。項(xiàng)目初期,我們往往對業(yè)務(wù)一無所知,我們最急迫需要解決的問題就是理清楚這些業(yè)務(wù)概念以及它們的關(guān)系。
每個(gè)軟件系統(tǒng)都會(huì)涉及到很多人、業(yè)務(wù)概念和物品等,這些東西之間可能會(huì)有很多關(guān)系,發(fā)生很多事情。類圖能幫助我們識(shí)別出這些人、業(yè)務(wù)概念、物品和事情等,并理清它們的關(guān)系。
什么是類?
你大概了解了類圖的用途了吧?我們暫時(shí)不去深究那段讓人頭暈的業(yè)務(wù)描述,我們先看看什么是類?
需求中提到的各種業(yè)務(wù)概念、人物等,經(jīng)過抽象后我們都可以視之為類。為了更好地體驗(yàn)什么是類,請看下面這個(gè)練習(xí)。
練習(xí):如果對本書的讀者進(jìn)行分類,你會(huì)如何分類呢?
強(qiáng)烈建議你先思考寫下答案后才繼續(xù)往下看。
男人、女人?
人無非就是男人和女人兩種,所以本書的讀者不是男人就是女人。這樣分類合適嗎?
男人和女人在看這本書的時(shí)候,會(huì)有什么差異嗎?將書的讀者分為男人和女人,有什么好處?
如果不分為男人和女人,分為老人與年輕人,這樣合適嗎?
學(xué)生、在職人員?
學(xué)生和在職人士讀本書的時(shí)候應(yīng)該是有所差異的,畢竟兩者的基礎(chǔ)不太一樣。如果你是本書的作者,你覺得本書的目標(biāo)讀者是誰呢?編寫本書時(shí),你會(huì)更照顧學(xué)生還是在職人士呢?我們對讀者進(jìn)行分類,并不是為了分類而分類,而是希望通過對讀者這個(gè)群體進(jìn)行分析,寫出一本內(nèi)容更精彩銷量更好的書。
將某類東西歸納為一起,可以稱為一個(gè)類。類有很多種提煉角度,我們需要根據(jù)系統(tǒng)的目標(biāo)、業(yè)務(wù)的場景等,選取合適的角度對事物進(jìn)行歸納。
什么是類圖?
只有一個(gè)類的類圖,可能就是最簡單的類圖了,請看下圖:
圖 3.1??只有一個(gè)類的類圖
一個(gè)類就是一個(gè)矩形的方框,最上面是類的名字,中間是屬性(Attribute),最下面是操作(Operation)。表示一個(gè)類時(shí),可只顯示類名,也可以只顯示類名和屬性,或者是類名和操作。
我們看看這個(gè)屬性:+屬性1:int。
前面的“+”號(hào)表示這個(gè)屬性是public類型的,實(shí)際上在需求分析時(shí),不需要管屬性是public還是private,全部畫成public就可以了。
冒號(hào)后面的int,表示屬性的類型是int型(整數(shù)型),往往在需求分析初始階段,可不必標(biāo)識(shí)屬性的類型。
至于操作,用類圖進(jìn)行業(yè)務(wù)建模時(shí),一般不需要標(biāo)識(shí)出來。
一個(gè)類圖通常不止有一個(gè)類,有多個(gè)類時(shí),我們還需要表達(dá)出類之間的關(guān)系,后面我們將介紹類之間的關(guān)系。
如何識(shí)別類?
用類圖獲取需求的大致步驟如下:
1) 識(shí)別出類。
2) 識(shí)別出類的主要屬性。
3) 描繪出類之間的關(guān)系。
4) 對各類進(jìn)行分析、抽象、整理。
我們通過下面這個(gè)練習(xí)來體驗(yàn)一下步驟1、2。
練習(xí):你需要做一個(gè)培訓(xùn)管理系統(tǒng),請你用類圖識(shí)別出課室中有什么人?這些人有什么關(guān)鍵屬性?
強(qiáng)烈建議你先獨(dú)立完成才繼續(xù)閱讀下文。
課室中有以下兩類人:
圖 3.2??學(xué)生與講師1
說明:該圖是類圖的簡單畫法,只表達(dá)了類名。
這兩個(gè)類有這樣的關(guān)鍵屬性:
圖 3.3??學(xué)生與講師2
說明:上面的類圖同時(shí)表達(dá)了類名和類的屬性。屬性沒有標(biāo)記public還是private,也沒有被標(biāo)記屬性的類型。業(yè)務(wù)建模時(shí)類圖的屬性可以看成全部是公開的,也不必標(biāo)記屬性的類型。
這個(gè)練習(xí)的場景是:你需要做一個(gè)培訓(xùn)管理系統(tǒng),所以你識(shí)別出類以及他們的屬性的時(shí)候,務(wù)必從這個(gè)角度出發(fā)。如果你得到的類是男人和女人,那就可能沒有什么意義了。
如果你識(shí)別出來的屬性是身高、體重,這些屬性無論是屬于學(xué)生還是老師,對于培訓(xùn)管理系統(tǒng)來說,可能是沒有什么價(jià)值的。思考你識(shí)別出來的類的屬性,能幫助你判斷這個(gè)類是否合適。每一個(gè)類應(yīng)該具備能表征它核心特點(diǎn)的關(guān)鍵屬性,而一般的無特別意義的屬性,可不必標(biāo)記進(jìn)去。
類圖的基本語法是很簡單的,但要體會(huì)什么是類,準(zhǔn)確識(shí)別出類就不是那么簡單了。實(shí)際工作中,我們需要將需求調(diào)研中了解到的所有業(yè)務(wù)對象、人物等列出來,畫出他們的關(guān)系,反復(fù)推敲,逐步才能得到合適的業(yè)務(wù)模型。下面我們將開始學(xué)習(xí)類之間的關(guān)系。
?
3.3 類之間的關(guān)系
?
表達(dá)類之間關(guān)系時(shí),類只需要畫出名字就可以了,屬性和方法可以省略顯示。
“直線”關(guān)系
A、B兩個(gè)類,它們之間有關(guān)系,但又不能確定是怎樣的關(guān)系,我們可以這樣畫:
圖 3.4??“直線”關(guān)系
這個(gè)“直線”關(guān)系其實(shí)就是關(guān)聯(lián)(Association)關(guān)系,“關(guān)聯(lián)”是UML中文術(shù)語的標(biāo)準(zhǔn)說法,但為了能讓大家更容易理解和記憶,我會(huì)使用一些“老土”的說法。
做軟件需求分析時(shí),如果覺得兩個(gè)業(yè)務(wù)概念之間有聯(lián)系,但暫時(shí)不能確定具體是怎樣的,那么就先畫一條線將兩者連起來再說。隨著你對業(yè)務(wù)的理解,這條線條會(huì)進(jìn)一步具體化,你可以為這條線添加更多的元素。
圖 3.5??一對一關(guān)系
這個(gè)圖C、D兩個(gè)類有一條直線相連,但在直線兩端各有一個(gè)數(shù)字1,表示一個(gè)C對應(yīng)一個(gè)D。
圖 3.6??一對多關(guān)系
這個(gè)圖表示一個(gè)E對應(yīng)0到多個(gè)F,*號(hào)的意思就是表示0到多個(gè)。
圖 3.7??一對零到三個(gè)關(guān)系
這個(gè)圖表示一個(gè)G對應(yīng)0到3個(gè)M,“0..3”表示0到3個(gè),“1..4”表示1到4個(gè),“x..y”表示x到y(tǒng)個(gè)(x,y表示任意自然數(shù),而且x < y),注意有兩個(gè)點(diǎn)(“..”)而不是一個(gè)點(diǎn)(“.”)。
圖 3.8??角色關(guān)系
這個(gè)圖表示I和J之間有關(guān)系,在這個(gè)關(guān)系中I的身份是上司,J的身份是下屬。我們可以在線條的兩端標(biāo)記在這個(gè)關(guān)系中,兩者分別是處在怎樣的角色。
你可能會(huì)留意到,為什么“上司”、“下屬”前面有一個(gè)“+”號(hào)?“+”號(hào)表示這個(gè)角色的類型是public的,“-”號(hào)表示private,這些符號(hào)在軟件設(shè)計(jì)時(shí)才需要用到,我們做軟件需求分析時(shí),不需要理會(huì)這些符號(hào),全部畫成“+”號(hào)就可以了。
這條直線如果變成帶箭頭的,又是表示怎樣的意思呢?請看下圖:
圖 3.9??“導(dǎo)航”關(guān)系
這個(gè)圖表示由A可找到B,箭頭表示方向,由A可“導(dǎo)航”到B。
寫代碼時(shí),如果A類有一個(gè)成員變量保存的是類B的引用,也就是說由類A可以找到類B,那么可以畫成圖3.9的樣子。這是從軟件設(shè)計(jì)的角度來解釋這個(gè)箭頭的意義,如果是軟件需求分析,這個(gè)箭頭是怎樣的意思呢?下面是一個(gè)實(shí)例:
圖 3.10??請假單與請假者的關(guān)系
請假單上會(huì)列明是誰請的假,所以我們由請假單可以找到請假者。進(jìn)行業(yè)務(wù)分析時(shí),往往會(huì)發(fā)現(xiàn)由業(yè)務(wù)概念A(yù)可找到B,這時(shí)可以使用帶箭頭的線條。
直線關(guān)系是最常見的關(guān)系,最簡單的直線關(guān)系就是兩個(gè)類之間畫條線就可以了。我們也可以進(jìn)一步細(xì)化這條直線關(guān)系:在這條直線的兩端,可以標(biāo)記上數(shù)字和名稱,數(shù)字表示是幾對幾的關(guān)系,名稱則表示在這個(gè)關(guān)系中,直線兩端的兩個(gè)類分別是怎樣的一個(gè)角色,而這條直線也可以變成帶箭頭的直線。直線、幾對幾的關(guān)系、角色、箭頭可以搭配使用,只要能準(zhǔn)確反應(yīng)出業(yè)務(wù)關(guān)系就可以了。
直線關(guān)系只是一種老土的說法,UML中文術(shù)語標(biāo)準(zhǔn)是關(guān)聯(lián)(Association)關(guān)系。另外要說明的是,有時(shí)候因?yàn)轭愄?#xff0c;為了讓類圖更容易閱讀,需要將“直線”畫成“折線”,如下圖:
圖 3.11??“折線”關(guān)系
“包含”關(guān)系
一個(gè)部門有多個(gè)員工,用類圖可以這樣表示:
圖 3.12??“包含”關(guān)系
這里有兩種表示法,一種是空心菱形,一種是實(shí)心菱形。兩種菱形表示包含的強(qiáng)烈程度不同,空心菱形是“弱”包含,實(shí)心菱形則是“強(qiáng)”包含。你可以這樣記憶:空心菱形是空心的,顯得虛弱一點(diǎn),這是“弱”包含;實(shí)心菱形是實(shí)心的,顯得更加強(qiáng)壯,這是“強(qiáng)”包含。
“弱”包含表示如果部門沒有了,員工也可以繼續(xù)存在;“強(qiáng)”包含表示如果部門沒有了,員工也不再存在。關(guān)于這兩者的另外一個(gè)重要區(qū)別是:如果是“弱”包含關(guān)系,兒子可以有多個(gè)父親(當(dāng)然只有一個(gè)父親也是可以的);如果是“強(qiáng)”包含關(guān)系,則兒子只能有一個(gè)父親。
做軟件需求分析時(shí),我往往會(huì)將所有的包含關(guān)系畫成“弱包含”,如果后面發(fā)現(xiàn)某些關(guān)系可以表示為“強(qiáng)包含”時(shí),我才轉(zhuǎn)為實(shí)心菱形。
請留意包含的方向,誰包含誰,剛學(xué)習(xí)的朋友很容易把方向畫反了。
在員工這邊的“*”號(hào)表示零到多名的意思,如果是“1..100” 則表示1到100名;而部門這邊沒有具體的數(shù)字,則表示是“1”,則一名員工只能屬于一個(gè)部門。如果一名員工同屬于多個(gè)部門,那應(yīng)該怎樣畫呢?
圖 3.13??部門與員工的多對多關(guān)系
部門這邊的“*”表示一名員工可同屬于多個(gè)部門,請注意,在“強(qiáng)包含”關(guān)系中,一名員工只能屬于一個(gè)部門。
“弱包含”、“強(qiáng)包含”的說法只是一種方便大家記憶和理解的老土說法而已,空心菱形的UML中文術(shù)語標(biāo)準(zhǔn)說法是聚合(Aggregation),實(shí)心菱形是組合(Composition)。以前看UML資料遇到聚合和組合兩個(gè)詞都會(huì)讓我頭暈一番,因?yàn)槟切┙忉屨f得太復(fù)雜了,就算是現(xiàn)在我遇到這兩個(gè)詞也需要稍微停頓一下來想一想。剛學(xué)習(xí)包含關(guān)系的朋友,建議你只需要記住“弱包含”“強(qiáng)包含”的說法就可以了。
“繼承”關(guān)系
我以前的公司有一個(gè)每日培訓(xùn)的制度,由公司內(nèi)部員工做講師,分享知識(shí)和經(jīng)驗(yàn)。員工可以做學(xué)生,也可以上臺(tái)做老師,下面是學(xué)生和老師的類圖:
圖 3.14??學(xué)生和老師
請思考,學(xué)生和講師有什么共性呢?
學(xué)生和講師不都是員工嗎,凡是員工都有這樣的屬性了:
圖 3.15??員工
說明:此圖只列了三個(gè)員工的屬性,僅作示意。
員工、學(xué)生、講師可以表示為以下的關(guān)系:
圖 3.16??員工、學(xué)生、老師關(guān)系
學(xué)生、講師都“繼承”了員工,他們具備員工的屬性,同時(shí)也有自己特有的屬性。另外一種說法是:學(xué)生、講師是員工的一種。
“繼承”的基本畫法如下:
圖 3.17??“繼承”關(guān)系
這表示A繼承了B,A具備B的特點(diǎn),同時(shí)也有自己特有的特點(diǎn),注意不要搞錯(cuò)繼承方向。
“繼承”同樣是一種老土的說法,UML中文術(shù)語標(biāo)準(zhǔn)是泛化(Generalization),該圖可這樣讀:A泛化為B。泛化這個(gè)詞比較難理解,你可以理解為抽象、提煉等。
在實(shí)際的軟件需求分析工作中,我們往往有兩種認(rèn)識(shí)事物的角度,我們以員工、學(xué)生、老師的關(guān)系為例子來說明。
角度一:在培訓(xùn)現(xiàn)場,我們看到的是學(xué)生和老師,后來你發(fā)現(xiàn),原來老師是內(nèi)部員工來的!于是你可以從學(xué)生和老師這兩個(gè)類出發(fā),發(fā)現(xiàn)學(xué)生和老師其實(shí)都是員工!
角度二:作為這個(gè)公司的領(lǐng)導(dǎo),希望公司形成一種學(xué)習(xí)和進(jìn)步的風(fēng)氣,促進(jìn)公司的進(jìn)步,于是領(lǐng)導(dǎo)希望員工之間能互相分享知識(shí)和經(jīng)驗(yàn)。從這個(gè)角度看來,領(lǐng)導(dǎo)先想到的是員工,然后再進(jìn)一步發(fā)現(xiàn)員工可以當(dāng)學(xué)生也可以當(dāng)老師。
在泛化關(guān)系中,以圖1.17為例,我們有可能先發(fā)現(xiàn)A,然后導(dǎo)出B,這時(shí)可以說由A泛化為B;也有可能是先發(fā)現(xiàn)B,然后導(dǎo)出A,這時(shí)可以說A繼承B。泛化(繼承)是我們進(jìn)行業(yè)務(wù)提煉的重要手段,后面我們將有更多的具體例子和練習(xí)。
依賴關(guān)系
如果一個(gè)煙鬼嗜煙如命,沒有煙不能生活,用類圖可以這樣表示:
圖 3.18??煙鬼與香煙的關(guān)系
這個(gè)虛線箭頭就是依賴(Dependency)關(guān)系,這虛線箭頭與導(dǎo)航關(guān)系的實(shí)線箭頭很相似,注意不要搞混了,兩者表示的意思是完全不一樣的。
如果說類A依賴于類B,類圖表示如下:
圖 3.19??依賴關(guān)系
所謂的依賴關(guān)系,依賴的程度是相當(dāng)而言的,不一定是A沒有B就不能“生存”了。在具體的業(yè)務(wù)邏輯中,對于某個(gè)事情,A需要B來協(xié)助才能完成,這樣也是一種依賴。
這個(gè)小節(jié)內(nèi)容非常多,你可能有點(diǎn)消化不良了。上面介紹的內(nèi)容其實(shí)在需求分析工作中是經(jīng)常需要用到的,而其中最常用的是直線關(guān)系。
下面開始你將會(huì)通過一個(gè)個(gè)的練習(xí)來幫助你理解和鞏固這些知識(shí),強(qiáng)烈建議你看完題目后先獨(dú)立思考完成,然后再繼續(xù)看參考答案。
?
3.4 演練類之間的關(guān)系
練習(xí)1、2、3是簡單的小練習(xí),而練習(xí)4的難度會(huì)有所增加。這些練習(xí)不僅僅是讓你鞏固上小節(jié)學(xué)習(xí)的知識(shí),中間還會(huì)穿插一些前面還沒有介紹的基礎(chǔ)知識(shí),而且會(huì)讓你體驗(yàn)什么是面向?qū)ο蠓治?#xff0c;領(lǐng)悟用類圖分析需求的要訣。你準(zhǔn)備好接受挑戰(zhàn)沒有?
練習(xí)1:你和你另外一半的關(guān)系
你結(jié)婚了嗎?如果你已婚,那么請你用類圖描繪你和你的另外一半的關(guān)系?
如果你是單身的,你有男朋友或女朋友嗎?有的話,請你用類圖畫出你們兩人的關(guān)系?
如果你還沒有另外一半,而你又已經(jīng)到了適合戀愛的年齡,那請你虛擬一位你的意中人,用類圖畫出你和你的虛擬意中人的關(guān)系。
如果你還沒有到戀愛或結(jié)婚年齡,那么你不需要完成這個(gè)練習(xí),直接看后面的參考答案。
如果你是已婚人士,那么你們的關(guān)系應(yīng)該是:
圖 1.20??你和你的另外一半關(guān)系1
如果你是男生,你在這個(gè)關(guān)系中的角色就是老公,如果你是女生你就是老婆。一個(gè)老公只能對應(yīng)一個(gè)老婆,你應(yīng)該不會(huì)畫出1對多吧?
這個(gè)圖也可以畫成這樣:
圖 1.21??你和你的另外一半關(guān)系2
這個(gè)圖在直線上面的“夫妻關(guān)系”表示這個(gè)關(guān)系的名稱,你可以為關(guān)聯(lián)關(guān)系命名,但這不是必須的,在需求分析工作中也很少有這種需要。
如果你未婚,但你同時(shí)有多個(gè)男朋友或者女朋友,那么你們的關(guān)系可以這樣表示:
圖 1.22??你和你的另外一半關(guān)系3
“1..*”表示1到多個(gè),不要因?yàn)槟隳?對多個(gè)男朋友(或女朋友)就很開心,這是一種很不好的關(guān)系,強(qiáng)烈建議你將1對多的關(guān)系變?yōu)?對1,而且說不定有朝一日你會(huì)被別人1對多。
如果你還沒有另外一半,你可以畫成這樣:
圖 1.23??你和你的另外一半關(guān)系3
你的另外一半是作為“虛擬情人”存在的。
如果你很愛你的另外一半,你依賴于你的另外一半,沒有她(他)你簡直不能活,她(他)是你的生存必需品,你可以畫成這樣:
圖 1.24??你和你的另外一半關(guān)系4
你可以跟你的另外一半畫畫這個(gè)圖,跟她(他)解釋一下是什么意思,你的另外一半一定開心死了。
用類圖表達(dá)你和你的另外一半的關(guān)系,并沒有固定的標(biāo)準(zhǔn)答案,你畫出來的可能跟上述的參考答案不一樣,只要你的邏輯正確,這個(gè)圖也就是合適的。
下面介紹讀圖檢查法,能幫助你檢查類圖畫得是否合適。
你可以分別從左到右、從右到左來讀圖,看看有沒有不合理的地方。以圖1.22為例,從左到右讀:1個(gè)你對應(yīng)1個(gè)到多個(gè)你的另外一半。從右到左讀:1個(gè)你的另外一半對應(yīng)1個(gè)你,而不要讀成:多個(gè)你的另外一半對應(yīng)1個(gè)你。注意由“多”的一邊往另外一邊讀時(shí),仍然是1個(gè)什么對應(yīng)多少個(gè)什么,無論你從哪邊開始讀起,都是以“1個(gè)……”開頭。
練習(xí)2:公司與雇員的關(guān)系
前面學(xué)習(xí)了部門與員工的關(guān)系,公司與雇員是怎樣的關(guān)系呢?請用類圖畫出來。
圖 1.25??公司與雇員的關(guān)系
這個(gè)圖表示公司“包含”多名員工,而公司這邊也有一個(gè)“*”號(hào),這表示一名雇員可受雇于多個(gè)公司。事實(shí)上很多公司是禁止員工同時(shí)受雇于另外一個(gè)公司或者是兼職的,這樣公司這邊就不能畫“*”號(hào)。
這里的包含是弱包含,能不能畫成強(qiáng)包含呢?公司如果不存在了,雇員還存在嗎?一個(gè)公司沒有了,這個(gè)公司應(yīng)該就不會(huì)有任何雇員,但不代表原來的雇員都消失了,他們還是存在的。這個(gè)問題就比較糾結(jié)了,到底是弱包含還是強(qiáng)包含,每個(gè)人的標(biāo)準(zhǔn)可能不一樣,我不建議在弱包含還是強(qiáng)包含上過于糾結(jié),我做需求分析時(shí)絕大部分情況只會(huì)用弱包含,強(qiáng)包含只會(huì)在很明顯的情況下才用。
練習(xí)3:香蕉、蘋果、梨子的關(guān)系
你吃過香蕉、蘋果和梨子嗎?這三個(gè)東西有怎樣的關(guān)系?請用類圖畫出來。
你可能覺得這個(gè)練習(xí)有點(diǎn)“無厘頭”,這三種水果能有怎樣的關(guān)系?它們無非都是可以吃的羅!
圖 1.26??香蕉、蘋果、梨子的關(guān)系
此圖表示香蕉、蘋果、梨子都是水果的一種,這就是這三者的關(guān)系。用專業(yè)一點(diǎn)的說法就是香蕉、蘋果、梨子泛化為水果。和前面提到的老師、學(xué)生泛化為員工不一樣,員工是確實(shí)存在的,而水果只是一種泛稱,沒有一樣?xùn)|西的名字直接叫水果的,我們見到的水果都是具體的一種水果。泛化以后的類,有可能是一種經(jīng)過“抽象”后的東西,這個(gè)東西是看不到摸不著的,是我們腦袋里面提煉出來的一種概念。
香蕉、蘋果、梨子泛化為水果,水果可以再泛化為食物,食物又可以進(jìn)一步泛化。有沒有必要不斷泛化呢?泛化到怎樣的程度才是合適的呢?一般來說,如果有A、B、C等兩個(gè)或者以上的業(yè)務(wù)概念,我們發(fā)現(xiàn)它們有一些共同的特征,則可以考慮將它們泛化為另外一個(gè)東西, 這樣能幫助我們發(fā)現(xiàn)食物的本質(zhì);但如果只有一個(gè)A時(shí),就沒有必要對A再進(jìn)行泛化,例如:香蕉、蘋果、梨子已經(jīng)泛化為水果了,而水果則沒有必要泛化為食物。當(dāng)然這只是一般準(zhǔn)則,具體要泛化到怎樣的層次要看具體的業(yè)務(wù)分析需要,要靠你自己來把握。
練習(xí)4:公司的組織架構(gòu)
這個(gè)練習(xí)開始有點(diǎn)復(fù)雜了,請你用類圖描述你所在公司的組織架構(gòu)。如果你們公司比較龐大,你不是很了解整個(gè)公司的組織架構(gòu),那么請你選擇你熟悉的部分用類圖來描述它的組織架構(gòu)。如果你是學(xué)生,那么請你描述你所在大學(xué)、學(xué)院或?qū)W系的組織架構(gòu)。
我們可以用組織架構(gòu)圖來描繪組織架構(gòu),為什么要用類圖來表達(dá)呢?組織架構(gòu)圖畫起來很方便,用類圖的畫反而覺得有點(diǎn)別扭,用類圖來表達(dá)組織架構(gòu),是不是應(yīng)該有更大的好處呢?請你帶著這些問題來完成這個(gè)練習(xí)。
某公司只是一個(gè)中小型的公司,該公司由一個(gè)一個(gè)的部門組成,用類圖表達(dá)其組織架構(gòu)可能是這樣的:
圖 1.27??公司的組織架構(gòu)1
該公司有一個(gè)行政人事部、一個(gè)研發(fā)部、一個(gè)服務(wù)部、一個(gè)銷售部、一個(gè)財(cái)務(wù)部。這個(gè)圖似乎公司有多少個(gè)部門,就多畫一個(gè)包含就搞定了,這樣畫似乎一點(diǎn)都顯示不出類圖的優(yōu)勢。
下面這種畫法又如何呢?
圖 1.28??公司的組織架構(gòu)2
注意圖中抽象部門這四個(gè)字是斜體字,這表明這個(gè)類是抽象類(Abstract Class),抽象類表示這個(gè)類是提煉出來的一種概念,是不具體存在的,具體存在的是繼承抽象部門的各個(gè)具體的部門。
前面提到的香蕉、蘋果、梨子泛化為水果,水果其實(shí)也是一種抽象的概念,前面那個(gè)圖的水果可以畫成抽象類。
這個(gè)組織架構(gòu)圖已經(jīng)一定程度地揭示了公司組織架構(gòu)的本質(zhì),一個(gè)公司無非就是由一個(gè)個(gè)部門組成的,只是每個(gè)公司具體的部門可能不一樣而已。這樣的表達(dá)效果,用普通的組織架構(gòu)圖是表達(dá)不出來的,而類圖就可以發(fā)揮抽象和提煉的優(yōu)勢。
下面這個(gè)圖將更進(jìn)一步揭示公司組織架構(gòu)的本質(zhì):
圖 1.29??公司的組織架構(gòu)3
公司由一個(gè)個(gè)的部門組成,但要構(gòu)成一個(gè)完整的公司,這些部門應(yīng)該分為三類:
市場類部門:負(fù)責(zé)公司形象推廣、產(chǎn)品營銷方面的部門。
生產(chǎn)類部門:直接生產(chǎn)公司產(chǎn)品的部門。
支持類部門:不直接生產(chǎn)公司產(chǎn)品,但是支持產(chǎn)品生產(chǎn)或支撐公司運(yùn)作必不可少的部門。
在這個(gè)圖中,市場類部門有策劃部、銷售部,生產(chǎn)類部門有研發(fā)部、實(shí)施部、IT部,支持類部門有:IT部、質(zhì)量部、財(cái)務(wù)部、行政人事部,其中IT部既是生產(chǎn)類部門,也是支持類部門。
下面對其中一些具體部門進(jìn)行解釋:
實(shí)施部是負(fù)責(zé)將軟件系統(tǒng)安裝到客戶現(xiàn)場,保障系統(tǒng)上線運(yùn)行的部門。
IT部主要負(fù)責(zé)兩方面的職能,一方面要保障公司內(nèi)部的辦公軟硬件環(huán)境,另一方面會(huì)承接一些外部的網(wǎng)絡(luò)工程,為公司直接盈利。第一方面的工作是屬于支持類方面的工作,而第二方面的工作則是生產(chǎn)類的工作。
質(zhì)量部負(fù)責(zé)測試及過程保障的工作,這個(gè)部門是支援研發(fā)部和實(shí)施部工作的,故也屬于支持類的部門。
將部門分為市場類、生產(chǎn)類和支持類,只是其中一種的抽象方法,每個(gè)人可能會(huì)有不同的標(biāo)準(zhǔn),遇到不同情況可能會(huì)有不同的抽象辦法。以上這個(gè)僅是一個(gè)例子,你千萬不要將其當(dāng)成一個(gè)固定的標(biāo)準(zhǔn)。
總體來說,上述三個(gè)用類圖表示的公司組織架構(gòu),所針對的公司都不是大型的公司,大型的公司可能會(huì)有分公司、子公司、事業(yè)部等等不同的劃分辦法,組織架構(gòu)異常復(fù)雜,想用類圖準(zhǔn)確地表達(dá)出來并且能揭示其本質(zhì)相當(dāng)不容易。希望通過上述三個(gè)例子,能讓你初步體會(huì)用類圖提煉業(yè)務(wù)的優(yōu)勢。
上面四個(gè)練習(xí),基本覆蓋了你在前面小節(jié)學(xué)習(xí)到的類之間關(guān)系的知識(shí)。在我的經(jīng)驗(yàn)看來,直線(關(guān)聯(lián))關(guān)系、包含關(guān)系是最常用的,泛化(繼承)關(guān)系用得也比較多,而依賴關(guān)系用得不是很多。而從使用的難度來說,泛化(繼承)關(guān)系是最考驗(yàn)人的了,很考驗(yàn)?zāi)惆l(fā)掘事物本質(zhì)的能力。
類圖是不是很有意思呢?下面小節(jié)將會(huì)更加有意思,但同時(shí)難度也會(huì)進(jìn)一步增大,喜歡挑戰(zhàn)的你一定是不會(huì)退縮的了!
?
作者:張傳波
www.umlonline.org/school/
?
---上篇到此結(jié)束,請看下篇---
下篇鏈接:http://www.cnblogs.com/umlonline/archive/2011/10/17/2215866.html
轉(zhuǎn)載于:https://www.cnblogs.com/umlonline/archive/2011/10/18/2215850.html
總結(jié)
以上是生活随笔為你收集整理的分析业务模型-类图(Class Diagram)(上)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 论windows + asp.net性能
- 下一篇: delphi函数,识别字符集编码