欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
分析業(yè)務(wù)模型類(lèi)圖

分析業(yè)務(wù)模型-類(lèi)圖(Class Diagram)(上)

摘要:類(lèi)圖(Class Diagram)可能是用得最多的一種UML圖。類(lèi)圖的基本語(yǔ)法并不復雜,你可能最多學(xué)習兩三天就可以掌握,然而要真正做到活用類(lèi)圖則可能需要幾年的功力。類(lèi)圖是鍛煉面向對象分析(OOA:Object-Oriented Analysis)和面向對象設計(OOD:Object-Oriented Design)思想的重要的工具,是業(yè)務(wù)結構建模的重要工具。本章將會(huì )有大量的實(shí)戰練習,你的OOA思想將會(huì )接受極大的考驗和提升。

大綱:

  • 3.1 面向過(guò)程與面向對象
  • 3.2 類(lèi)圖的基礎知識
  • 3.3 類(lèi)之間的關(guān)系
  • 3.4 演練類(lèi)之間的關(guān)系
  • 3.5 類(lèi)的“遞歸”關(guān)系與“三角”關(guān)系
  • 3.6 考試管理系統——類(lèi)圖綜合訓練
  • 3.7 關(guān)于對象圖
  • 3.8 小結與練習

3.1 面向過(guò)程與面向對象

本小節的內容涉及到編程方面的知識,如果你有相關(guān)經(jīng)驗,請認真閱讀本小節,本小節目的是澄清開(kāi)發(fā)人員的一些面向過(guò)程和面向對象的理解誤區。如果你沒(méi)有編程經(jīng)驗或者對此不感興趣,可忽略本小節直接閱讀下一小節,忽略本小節并不影響你對后文的理解。

上世紀90年代初,當我讀高中的時(shí)候首次接觸電腦,并且學(xué)習了第一門(mén)編程語(yǔ)言Basic。當時(shí)不知道什么是面向過(guò)程,也不知道何為面向對象,只知道不斷地學(xué)習Basic語(yǔ)言的算法,感受編程的樂(lè )趣。當時(shí)學(xué)習的Basic語(yǔ)言,現在看來(lái)是很老土的面向過(guò)程的語(yǔ)言。

后來(lái)學(xué)習了C語(yǔ)言,不久后朋友告訴我應該學(xué)習C++,我問(wèn):C和C++有什么不同?于是朋友告訴我:C是面向過(guò)程的語(yǔ)言,C++是面向對象的語(yǔ)言,C++比C最不同的地方就是C++有類(lèi)(Class),C沒(méi)有……

這就是我對面向過(guò)程和面向對象的第一印象,后來(lái)又學(xué)習了一些面向對象的知識,似乎將很多東西變成類(lèi),類(lèi)里面有特性和操作,就是面向對象。然而工作后發(fā)現完全不是那么回事,面向對象真的是只可意會(huì )難以言傳啊。下面說(shuō)說(shuō)我對面向過(guò)程和面向對象的理解,希望對你有幫助。

很多年前的程序只有一行行的代碼,后來(lái)出現代碼難以組織、不好閱讀、重復代碼多等問(wèn)題。于是“發(fā)明”了方法,將一段代碼放到方法里面,實(shí)現一定的功能,供別的地方調用。方法的“發(fā)明”是編程史上的一大進(jìn)步,其實(shí)方法就是一定程度上的封裝,只要調用者給出符合要求的輸入,方法就會(huì )返回合適的輸出,調用者完全不用理會(huì )方法的具體實(shí)現,而方法里面又可以調用方法。隨著(zhù)后來(lái)的發(fā)展,出現了結構化編程,將編程的藝術(shù)更推進(jìn)一步。

無(wú)論是方法還是結構化編程,都是我們提高編程技術(shù)以更好地解決復雜的、高難度的問(wèn)題的一種手段而已。但后來(lái)發(fā)現問(wèn)題越來(lái)越復雜,結構化編程開(kāi)始招架不住了,于是有人提出面向對象編程。面向對象編碼是一種基于類(lèi)的編程方法,每一個(gè)類(lèi)有特定的作用,類(lèi)中有屬性和方法,一條條語(yǔ)句只存在于屬性或方法中。用面向對象的思路來(lái)求解問(wèn)題,就是要設計出能解決問(wèn)題的一個(gè)或多個(gè)類(lèi),通過(guò)類(lèi)之間的相互操作和協(xié)作來(lái)解決問(wèn)題。類(lèi)是對代碼的進(jìn)一步封裝,比方法對代碼的封裝要進(jìn)一大步,類(lèi)的出現要求我們編程的思想更進(jìn)一步。

對于面向過(guò)程和面向對象編程存在這樣的一些誤區:

1) 面向對象比面向過(guò)程更高級,無(wú)需注重結構化編程和編程基本功。

前面提到的編碼發(fā)展史,簡(jiǎn)單說(shuō)就是以下幾個(gè)階段:

  • 一行行的代碼
  • 用方法組織起來(lái)的代碼
  • 結構化代碼
  • 面向對象的代碼(用類(lèi)來(lái)組織的代碼)

看上去似乎后面的可以取代前面的,特別是到了面向對象編程階段,似乎人人都可以喊自己是面向對象的,真正能寫(xiě)出好代碼的人并不多。其實(shí)編碼基本功相當重要,結構化編程也相當重要,如果這些基礎不行,面向對象只能喊喊而已。我在以前公司招聘程序員,編程基本功是必考的。

2) 面向對象編程就是將代碼放進(jìn)一個(gè)個(gè)類(lèi)而已。

我最開(kāi)始對面向對象編程的看法基本上就是這樣,后來(lái)用VB編程還是未能真正體會(huì )面向對象編程,直到后來(lái)使用真正面向對象的語(yǔ)言C#以及學(xué)習了UML和設計模式,才開(kāi)始真正體會(huì )。如何設計、提煉、規劃類(lèi),是很講技巧和功力的事情,面向對象一點(diǎn)都不容易。

3) 將業(yè)務(wù)概念直接轉變?yōu)轭?lèi),賦予合適的屬性和操作,就可以解決問(wèn)題。

需求階段的建模與設計階段的建模是很不一樣的,需求建模是對業(yè)務(wù)和需求的提煉,優(yōu)秀的需求建模是設計建模的良好開(kāi)始,但優(yōu)秀的設計建模還需要考慮更多的設計上的事情,并不是簡(jiǎn)單地將業(yè)務(wù)模型直接轉變化設計模型就可以解決問(wèn)題的。

本書(shū)不會(huì )具體介紹如何面向對象地編程,而是如何面向對象地進(jìn)行需求分析,我們將會(huì )借鑒面向對象編程的思想用于需求分析工作中。有開(kāi)發(fā)經(jīng)驗的人士從事需求分析工作時(shí),受面向過(guò)程和面向對象編程的思維習慣影響,容易處于“技術(shù)實(shí)現”的角度來(lái)分析問(wèn)題。這需要一個(gè)轉變過(guò)程,我強烈建議你先忘掉自己的開(kāi)發(fā)經(jīng)歷。本書(shū)接下來(lái)的內容,將會(huì )通過(guò)一個(gè)又一個(gè)的具體案例和練習,讓你體會(huì )面向對象分析需求的方法。當完成這個(gè)轉變時(shí),你會(huì )發(fā)現編程思想和分析需求的思想有共通之處但又不太一樣,你在編程時(shí)養成的嚴謹、全面、深入的分析方法會(huì )讓你在需求分析工作中受益不淺。

3.2 類(lèi)圖的基礎知識

類(lèi)圖有什么用?

某項目客戶(hù)提供的原始需求文檔中,有下面這樣的一段話(huà),請你仔細閱讀,看看能不能將你搞暈?

“本項目是在一期的基礎上增加對電纜、通訊工程的管理和施工詳細數據的記錄和統計,使整個(gè)系統更好的管理各工程項目從中標開(kāi)始到竣工驗收的全部過(guò)程和資料和分析施工過(guò)程的數據。 本系統將一條或一個(gè)標段的架空電力線(xiàn)路工程定為一個(gè)單位工程,即系統中的一個(gè)工程項目;每個(gè)單位工程分為若干個(gè)分部工程;每個(gè)分部工程分為若干個(gè)分項工程;每個(gè)分項工程中又分為若干相同單元工程?!?/p>

這段話(huà)中帶下劃線(xiàn)的文字,可能是本系統的一些關(guān)鍵業(yè)務(wù)概念。

如果你還沒(méi)有暈的話(huà),請回答下面的問(wèn)題:

1) 你能用一句話(huà)描述這個(gè)系統是做什么的嗎?

2) 這段話(huà)有什么業(yè)務(wù)概念?每個(gè)業(yè)務(wù)概念是什么意思?

3) 這些業(yè)務(wù)概念之間是怎樣的關(guān)系?

上面那段文字充斥了大量的術(shù)語(yǔ)、概念(帶下劃線(xiàn)的字),如果你不是專(zhuān)業(yè)人士,恐怕難以讀懂上述文字。項目初期,我們往往對業(yè)務(wù)一無(wú)所知,我們最急迫需要解決的問(wèn)題就是理清楚這些業(yè)務(wù)概念以及它們的關(guān)系。

每個(gè)軟件系統都會(huì )涉及到很多人、業(yè)務(wù)概念和物品等,這些東西之間可能會(huì )有很多關(guān)系,發(fā)生很多事情。類(lèi)圖能幫助我們識別出這些人、業(yè)務(wù)概念、物品和事情等,并理清它們的關(guān)系。

什么是類(lèi)?

你大概了解了類(lèi)圖的用途了吧?我們暫時(shí)不去深究那段讓人頭暈的業(yè)務(wù)描述,我們先看看什么是類(lèi)?

需求中提到的各種業(yè)務(wù)概念、人物等,經(jīng)過(guò)抽象后我們都可以視之為類(lèi)。為了更好地體驗什么是類(lèi),請看下面這個(gè)練習。

練習:如果對本書(shū)的讀者進(jìn)行分類(lèi),你會(huì )如何分類(lèi)呢?

強烈建議你先思考寫(xiě)下答案后才繼續往下看。

男人、女人?

人無(wú)非就是男人和女人兩種,所以本書(shū)的讀者不是男人就是女人。這樣分類(lèi)合適嗎?

男人和女人在看這本書(shū)的時(shí)候,會(huì )有什么差異嗎?將書(shū)的讀者分為男人和女人,有什么好處?

如果不分為男人和女人,分為老人與年輕人,這樣合適嗎?

學(xué)生、在職人員?

學(xué)生和在職人士讀本書(shū)的時(shí)候應該是有所差異的,畢竟兩者的基礎不太一樣。如果你是本書(shū)的作者,你覺(jué)得本書(shū)的目標讀者是誰(shuí)呢?編寫(xiě)本書(shū)時(shí),你會(huì )更照顧學(xué)生還是在職人士呢?我們對讀者進(jìn)行分類(lèi),并不是為了分類(lèi)而分類(lèi),而是希望通過(guò)對讀者這個(gè)群體進(jìn)行分析,寫(xiě)出一本內容更精彩銷(xiāo)量更好的書(shū)。

將某類(lèi)東西歸納為一起,可以稱(chēng)為一個(gè)類(lèi)。類(lèi)有很多種提煉角度,我們需要根據系統的目標、業(yè)務(wù)的場(chǎng)景等,選取合適的角度對事物進(jìn)行歸納。

什么是類(lèi)圖?

只有一個(gè)類(lèi)的類(lèi)圖,可能就是最簡(jiǎn)單的類(lèi)圖了,請看下圖:

圖 3.1 只有一個(gè)類(lèi)的類(lèi)圖

一個(gè)類(lèi)就是一個(gè)矩形的方框,最上面是類(lèi)的名字,中間是屬性(Attribute),最下面是操作(Operation)。表示一個(gè)類(lèi)時(shí),可只顯示類(lèi)名,也可以只顯示類(lèi)名和屬性,或者是類(lèi)名和操作。

我們看看這個(gè)屬性:+屬性1:int。

前面的“+”號表示這個(gè)屬性是public類(lèi)型的,實(shí)際上在需求分析時(shí),不需要管屬性是public還是private,全部畫(huà)成public就可以了。

冒號后面的int,表示屬性的類(lèi)型是int型(整數型),往往在需求分析初始階段,可不必標識屬性的類(lèi)型。

至于操作,用類(lèi)圖進(jìn)行業(yè)務(wù)建模時(shí),一般不需要標識出來(lái)。

一個(gè)類(lèi)圖通常不止有一個(gè)類(lèi),有多個(gè)類(lèi)時(shí),我們還需要表達出類(lèi)之間的關(guān)系,后面我們將介紹類(lèi)之間的關(guān)系。

如何識別類(lèi)?

用類(lèi)圖獲取需求的大致步驟如下:

1) 識別出類(lèi)。

2) 識別出類(lèi)的主要屬性。

3) 描繪出類(lèi)之間的關(guān)系。

4) 對各類(lèi)進(jìn)行分析、抽象、整理。

我們通過(guò)下面這個(gè)練習來(lái)體驗一下步驟1、2。

練習:你需要做一個(gè)培訓管理系統,請你用類(lèi)圖識別出課室中有什么人?這些人有什么關(guān)鍵屬性?

強烈建議你先獨立完成才繼續閱讀下文。

圖 3.2 學(xué)生與講師1

說(shuō)明:該圖是類(lèi)圖的簡(jiǎn)單畫(huà)法,只表達了類(lèi)名。

這兩個(gè)類(lèi)有這樣的關(guān)鍵屬性:

圖 3.3 學(xué)生與講師2

說(shuō)明:上面的類(lèi)圖同時(shí)表達了類(lèi)名和類(lèi)的屬性。屬性沒(méi)有標記public還是private,也沒(méi)有被標記屬性的類(lèi)型。業(yè)務(wù)建模時(shí)類(lèi)圖的屬性可以看成全部是公開(kāi)的,也不必標記屬性的類(lèi)型。

這個(gè)練習的場(chǎng)景是:你需要做一個(gè)培訓管理系統,所以你識別出類(lèi)以及他們的屬性的時(shí)候,務(wù)必從這個(gè)角度出發(fā)。如果你得到的類(lèi)是男人和女人,那就可能沒(méi)有什么意義了。

如果你識別出來(lái)的屬性是身高、體重,這些屬性無(wú)論是屬于學(xué)生還是老師,對于培訓管理系統來(lái)說(shuō),可能是沒(méi)有什么價(jià)值的。思考你識別出來(lái)的類(lèi)的屬性,能幫助你判斷這個(gè)類(lèi)是否合適。每一個(gè)類(lèi)應該具備能表征它核心特點(diǎn)的關(guān)鍵屬性,而一般的無(wú)特別意義的屬性,可不必標記進(jìn)去。

類(lèi)圖的基本語(yǔ)法是很簡(jiǎn)單的,但要體會(huì )什么是類(lèi),準確識別出類(lèi)就不是那么簡(jiǎn)單了。實(shí)際工作中,我們需要將需求調研中了解到的所有業(yè)務(wù)對象、人物等列出來(lái),畫(huà)出他們的關(guān)系,反復推敲,逐步才能得到合適的業(yè)務(wù)模型。下面我們將開(kāi)始學(xué)習類(lèi)之間的關(guān)系。

3.3 類(lèi)之間的關(guān)系

表達類(lèi)之間關(guān)系時(shí),類(lèi)只需要畫(huà)出名字就可以了,屬性和方法可以省略顯示。

“直線(xiàn)”關(guān)系

A、B兩個(gè)類(lèi),它們之間有關(guān)系,但又不能確定是怎樣的關(guān)系,我們可以這樣畫(huà):

圖 3.4 “直線(xiàn)”關(guān)系

這個(gè)“直線(xiàn)”關(guān)系其實(shí)就是關(guān)聯(lián)(Association)關(guān)系,“關(guān)聯(lián)”是UML中文術(shù)語(yǔ)的標準說(shuō)法,但為了能讓大家更容易理解和記憶,我會(huì )使用一些“老土”的說(shuō)法。

做軟件需求分析時(shí),如果覺(jué)得兩個(gè)業(yè)務(wù)概念之間有聯(lián)系,但暫時(shí)不能確定具體是怎樣的,那么就先畫(huà)一條線(xiàn)將兩者連起來(lái)再說(shuō)。隨著(zhù)你對業(yè)務(wù)的理解,這條線(xiàn)條會(huì )進(jìn)一步具體化,你可以為這條線(xiàn)添加更多的元素。

圖 3.5 一對一關(guān)系

這個(gè)圖C、D兩個(gè)類(lèi)有一條直線(xiàn)相連,但在直線(xiàn)兩端各有一個(gè)數字1,表示一個(gè)C對應一個(gè)D。

圖 3.6 一對多關(guān)系

這個(gè)圖表示一個(gè)E對應0到多個(gè)F,*號的意思就是表示0到多個(gè)。

圖 3.7 一對零到三個(gè)關(guān)系

這個(gè)圖表示一個(gè)G對應0到3個(gè)M,“0..3”表示0到3個(gè),“1..4”表示1到4個(gè),“x..y”表示x到y個(gè)(x,y表示任意自然數,而且x < y),注意有兩個(gè)點(diǎn)(“..”)而不是一個(gè)點(diǎn)(“.”)。

圖 3.8 角色關(guān)系

這個(gè)圖表示I和J之間有關(guān)系,在這個(gè)關(guān)系中I的身份是上司,J的身份是下屬。我們可以在線(xiàn)條的兩端標記在這個(gè)關(guān)系中,兩者分別是處在怎樣的角色。

你可能會(huì )留意到,為什么“上司”、“下屬”前面有一個(gè)“+”號?“+”號表示這個(gè)角色的類(lèi)型是public的,“-”號表示private,這些符號在軟件設計時(shí)才需要用到,我們做軟件需求分析時(shí),不需要理會(huì )這些符號,全部畫(huà)成“+”號就可以了。

這條直線(xiàn)如果變成帶箭頭的,又是表示怎樣的意思呢?請看下圖:

圖 3.9 “導航”關(guān)系

這個(gè)圖表示由A可找到B,箭頭表示方向,由A可“導航”到B。

寫(xiě)代碼時(shí),如果A類(lèi)有一個(gè)成員變量保存的是類(lèi)B的引用,也就是說(shuō)由類(lèi)A可以找到類(lèi)B,那么可以畫(huà)成圖3.9的樣子。這是從軟件設計的角度來(lái)解釋這個(gè)箭頭的意義,如果是軟件需求分析,這個(gè)箭頭是怎樣的意思呢?下面是一個(gè)實(shí)例:

圖 3.10 請假單與請假者的關(guān)系

請假單上會(huì )列明是誰(shuí)請的假,所以我們由請假單可以找到請假者。進(jìn)行業(yè)務(wù)分析時(shí),往往會(huì )發(fā)現由業(yè)務(wù)概念A可找到B,這時(shí)可以使用帶箭頭的線(xiàn)條。

直線(xiàn)關(guān)系是最常見(jiàn)的關(guān)系,最簡(jiǎn)單的直線(xiàn)關(guān)系就是兩個(gè)類(lèi)之間畫(huà)條線(xiàn)就可以了。我們也可以進(jìn)一步細化這條直線(xiàn)關(guān)系:在這條直線(xiàn)的兩端,可以標記上數字和名稱(chēng),數字表示是幾對幾的關(guān)系,名稱(chēng)則表示在這個(gè)關(guān)系中,直線(xiàn)兩端的兩個(gè)類(lèi)分別是怎樣的一個(gè)角色,而這條直線(xiàn)也可以變成帶箭頭的直線(xiàn)。直線(xiàn)、幾對幾的關(guān)系、角色、箭頭可以搭配使用,只要能準確反應出業(yè)務(wù)關(guān)系就可以了。

直線(xiàn)關(guān)系只是一種老土的說(shuō)法,UML中文術(shù)語(yǔ)標準是關(guān)聯(lián)(Association)關(guān)系。另外要說(shuō)明的是,有時(shí)候因為類(lèi)太多,為了讓類(lèi)圖更容易閱讀,需要將“直線(xiàn)”畫(huà)成“折線(xiàn)”,如下圖:

圖 3.11 “折線(xiàn)”關(guān)系

“包含”關(guān)系

一個(gè)部門(mén)有多個(gè)員工,用類(lèi)圖可以這樣表示:

圖 3.12 “包含”關(guān)系

這里有兩種表示法,一種是空心菱形,一種是實(shí)心菱形。兩種菱形表示包含的強烈程度不同,空心菱形是“弱”包含,實(shí)心菱形則是“強”包含。你可以這樣記憶:空心菱形是空心的,顯得虛弱一點(diǎn),這是“弱”包含;實(shí)心菱形是實(shí)心的,顯得更加強壯,這是“強”包含。

“弱”包含表示如果部門(mén)沒(méi)有了,員工也可以繼續存在;“強”包含表示如果部門(mén)沒(méi)有了,員工也不再存在。關(guān)于這兩者的另外一個(gè)重要區別是:如果是“弱”包含關(guān)系,兒子可以有多個(gè)父親(當然只有一個(gè)父親也是可以的);如果是“強”包含關(guān)系,則兒子只能有一個(gè)父親。

做軟件需求分析時(shí),我往往會(huì )將所有的包含關(guān)系畫(huà)成“弱包含”,如果后面發(fā)現某些關(guān)系可以表示為“強包含”時(shí),我才轉為實(shí)心菱形。

請留意包含的方向,誰(shuí)包含誰(shuí),剛學(xué)習的朋友很容易把方向畫(huà)反了。

在員工這邊的“*”號表示零到多名的意思,如果是“1..100” 則表示1到100名;而部門(mén)這邊沒(méi)有具體的數字,則表示是“1”,則一名員工只能屬于一個(gè)部門(mén)。如果一名員工同屬于多個(gè)部門(mén),那應該怎樣畫(huà)呢?

圖 3.13 部門(mén)與員工的多對多關(guān)系

部門(mén)這邊的“*”表示一名員工可同屬于多個(gè)部門(mén),請注意,在“強包含”關(guān)系中,一名員工只能屬于一個(gè)部門(mén)。

“弱包含”、“強包含”的說(shuō)法只是一種方便大家記憶和理解的老土說(shuō)法而已,空心菱形的UML中文術(shù)語(yǔ)標準說(shuō)法是聚合(Aggregation),實(shí)心菱形是組合(Composition)。以前看UML資料遇到聚合和組合兩個(gè)詞都會(huì )讓我頭暈一番,因為那些解釋說(shuō)得太復雜了,就算是現在我遇到這兩個(gè)詞也需要稍微停頓一下來(lái)想一想。剛學(xué)習包含關(guān)系的朋友,建議你只需要記住“弱包含”“強包含”的說(shuō)法就可以了。

“繼承”關(guān)系

我以前的公司有一個(gè)每日培訓的制度,由公司內部員工做講師,分享知識和經(jīng)驗。員工可以做學(xué)生,也可以上臺做老師,下面是學(xué)生和老師的類(lèi)圖:

圖 3.14 學(xué)生和老師

請思考,學(xué)生和講師有什么共性呢?

學(xué)生和講師不都是員工嗎,凡是員工都有這樣的屬性了:

圖 3.15 員工

說(shuō)明:此圖只列了三個(gè)員工的屬性,僅作示意。

員工、學(xué)生、講師可以表示為以下的關(guān)系:

圖 3.16 員工、學(xué)生、老師關(guān)系

學(xué)生、講師都“繼承”了員工,他們具備員工的屬性,同時(shí)也有自己特有的屬性。另外一種說(shuō)法是:學(xué)生、講師是員工的一種。

“繼承”的基本畫(huà)法如下:

圖 3.17 “繼承”關(guān)系

這表示A繼承了B,A具備B的特點(diǎn),同時(shí)也有自己特有的特點(diǎn),注意不要搞錯繼承方向。

“繼承”同樣是一種老土的說(shuō)法,UML中文術(shù)語(yǔ)標準是泛化(Generalization),該圖可這樣讀:A泛化為B。泛化這個(gè)詞比較難理解,你可以理解為抽象、提煉等。

在實(shí)際的軟件需求分析工作中,我們往往有兩種認識事物的角度,我們以員工、學(xué)生、老師的關(guān)系為例子來(lái)說(shuō)明。

角度一:在培訓現場(chǎng),我們看到的是學(xué)生和老師,后來(lái)你發(fā)現,原來(lái)老師是內部員工來(lái)的!于是你可以從學(xué)生和老師這兩個(gè)類(lèi)出發(fā),發(fā)現學(xué)生和老師其實(shí)都是員工!

角度二:作為這個(gè)公司的領(lǐng)導,希望公司形成一種學(xué)習和進(jìn)步的風(fēng)氣,促進(jìn)公司的進(jìn)步,于是領(lǐng)導希望員工之間能互相分享知識和經(jīng)驗。從這個(gè)角度看來(lái),領(lǐng)導先想到的是員工,然后再進(jìn)一步發(fā)現員工可以當學(xué)生也可以當老師。

在泛化關(guān)系中,以圖1.17為例,我們有可能先發(fā)現A,然后導出B,這時(shí)可以說(shuō)由A泛化為B;也有可能是先發(fā)現B,然后導出A,這時(shí)可以說(shuō)A繼承B。泛化(繼承)是我們進(jìn)行業(yè)務(wù)提煉的重要手段,后面我們將有更多的具體例子和練習。

依賴(lài)關(guān)系

如果一個(gè)煙鬼嗜煙如命,沒(méi)有煙不能生活,用類(lèi)圖可以這樣表示:

圖 3.18 煙鬼與香煙的關(guān)系

這個(gè)虛線(xiàn)箭頭就是依賴(lài)(Dependency)關(guān)系,這虛線(xiàn)箭頭與導航關(guān)系的實(shí)線(xiàn)箭頭很相似,注意不要搞混了,兩者表示的意思是完全不一樣的。

如果說(shuō)類(lèi)A依賴(lài)于類(lèi)B,類(lèi)圖表示如下:

圖 3.19 依賴(lài)關(guān)系

所謂的依賴(lài)關(guān)系,依賴(lài)的程度是相當而言的,不一定是A沒(méi)有B就不能“生存”了。在具體的業(yè)務(wù)邏輯中,對于某個(gè)事情,A需要B來(lái)協(xié)助才能完成,這樣也是一種依賴(lài)。

這個(gè)小節內容非常多,你可能有點(diǎn)消化不良了。上面介紹的內容其實(shí)在需求分析工作中是經(jīng)常需要用到的,而其中最常用的是直線(xiàn)關(guān)系。

下面開(kāi)始你將會(huì )通過(guò)一個(gè)個(gè)的練習來(lái)幫助你理解和鞏固這些知識,強烈建議你看完題目后先獨立思考完成,然后再繼續看參考答案。

3.4 演練類(lèi)之間的關(guān)系

練習1、2、3是簡(jiǎn)單的小練習,而練習4的難度會(huì )有所增加。這些練習不僅僅是讓你鞏固上小節學(xué)習的知識,中間還會(huì )穿插一些前面還沒(méi)有介紹的基礎知識,而且會(huì )讓你體驗什么是面向對象分析,領(lǐng)悟用類(lèi)圖分析需求的要訣。你準備好接受挑戰沒(méi)有?

練習1:你和你另外一半的關(guān)系

你結婚了嗎?如果你已婚,那么請你用類(lèi)圖描繪你和你的另外一半的關(guān)系?

如果你是單身的,你有男朋友或女朋友嗎?有的話(huà),請你用類(lèi)圖畫(huà)出你們兩人的關(guān)系?

如果你還沒(méi)有另外一半,而你又已經(jīng)到了適合戀愛(ài)的年齡,那請你虛擬一位你的意中人,用類(lèi)圖畫(huà)出你和你的虛擬意中人的關(guān)系。

如果你還沒(méi)有到戀愛(ài)或結婚年齡,那么你不需要完成這個(gè)練習,直接看后面的參考答案。

如果你是已婚人士,那么你們的關(guān)系應該是:

圖 1.20 你和你的另外一半關(guān)系1

如果你是男生,你在這個(gè)關(guān)系中的角色就是老公,如果你是女生你就是老婆。一個(gè)老公只能對應一個(gè)老婆,你應該不會(huì )畫(huà)出1對多吧?

這個(gè)圖也可以畫(huà)成這樣:

圖 1.21 你和你的另外一半關(guān)系2

這個(gè)圖在直線(xiàn)上面的“夫妻關(guān)系”表示這個(gè)關(guān)系的名稱(chēng),你可以為關(guān)聯(lián)關(guān)系命名,但這不是必須的,在需求分析工作中也很少有這種需要。

如果你未婚,但你同時(shí)有多個(gè)男朋友或者女朋友,那么你們的關(guān)系可以這樣表示:

圖 1.22 你和你的另外一半關(guān)系3

“1..*”表示1到多個(gè),不要因為你能1對多個(gè)男朋友(或女朋友)就很開(kāi)心,這是一種很不好的關(guān)系,強烈建議你將1對多的關(guān)系變?yōu)?對1,而且說(shuō)不定有朝一日你會(huì )被別人1對多。

如果你還沒(méi)有另外一半,你可以畫(huà)成這樣:

圖 1.23 你和你的另外一半關(guān)系3

你的另外一半是作為“虛擬情人”存在的。

如果你很愛(ài)你的另外一半,你依賴(lài)于你的另外一半,沒(méi)有她(他)你簡(jiǎn)直不能活,她(他)是你的生存必需品,你可以畫(huà)成這樣:

圖 1.24 你和你的另外一半關(guān)系4

你可以跟你的另外一半畫(huà)畫(huà)這個(gè)圖,跟她(他)解釋一下是什么意思,你的另外一半一定開(kāi)心死了。

用類(lèi)圖表達你和你的另外一半的關(guān)系,并沒(méi)有固定的標準答案,你畫(huà)出來(lái)的可能跟上述的參考答案不一樣,只要你的邏輯正確,這個(gè)圖也就是合適的。

下面介紹讀圖檢查法,能幫助你檢查類(lèi)圖畫(huà)得是否合適。

你可以分別從左到右、從右到左來(lái)讀圖,看看有沒(méi)有不合理的地方。以圖1.22為例,從左到右讀:1個(gè)你對應1個(gè)到多個(gè)你的另外一半。從右到左讀:1個(gè)你的另外一半對應1個(gè)你,而不要讀成:多個(gè)你的另外一半對應1個(gè)你。注意由“多”的一邊往另外一邊讀時(shí),仍然是1個(gè)什么對應多少個(gè)什么,無(wú)論你從哪邊開(kāi)始讀起,都是以“1個(gè)……”開(kāi)頭。

練習2:公司與雇員的關(guān)系

前面學(xué)習了部門(mén)與員工的關(guān)系,公司與雇員是怎樣的關(guān)系呢?請用類(lèi)圖畫(huà)出來(lái)。

圖 1.25 公司與雇員的關(guān)系

這個(gè)圖表示公司“包含”多名員工,而公司這邊也有一個(gè)“*”號,這表示一名雇員可受雇于多個(gè)公司。事實(shí)上很多公司是禁止員工同時(shí)受雇于另外一個(gè)公司或者是兼職的,這樣公司這邊就不能畫(huà)“*”號。

這里的包含是弱包含,能不能畫(huà)成強包含呢?公司如果不存在了,雇員還存在嗎?一個(gè)公司沒(méi)有了,這個(gè)公司應該就不會(huì )有任何雇員,但不代表原來(lái)的雇員都消失了,他們還是存在的。這個(gè)問(wèn)題就比較糾結了,到底是弱包含還是強包含,每個(gè)人的標準可能不一樣,我不建議在弱包含還是強包含上過(guò)于糾結,我做需求分析時(shí)絕大部分情況只會(huì )用弱包含,強包含只會(huì )在很明顯的情況下才用。

練習3:香蕉、蘋(píng)果、梨子的關(guān)系

你吃過(guò)香蕉、蘋(píng)果和梨子嗎?這三個(gè)東西有怎樣的關(guān)系?請用類(lèi)圖畫(huà)出來(lái)。

你可能覺(jué)得這個(gè)練習有點(diǎn)“無(wú)厘頭”,這三種水果能有怎樣的關(guān)系?它們無(wú)非都是可以吃的羅!

圖 1.26 香蕉、蘋(píng)果、梨子的關(guān)系

此圖表示香蕉、蘋(píng)果、梨子都是水果的一種,這就是這三者的關(guān)系。用專(zhuān)業(yè)一點(diǎn)的說(shuō)法就是香蕉、蘋(píng)果、梨子泛化為水果。和前面提到的老師、學(xué)生泛化為員工不一樣,員工是確實(shí)存在的,而水果只是一種泛稱(chēng),沒(méi)有一樣東西的名字直接叫水果的,我們見(jiàn)到的水果都是具體的一種水果。泛化以后的類(lèi),有可能是一種經(jīng)過(guò)“抽象”后的東西,這個(gè)東西是看不到摸不著(zhù)的,是我們腦袋里面提煉出來(lái)的一種概念。

香蕉、蘋(píng)果、梨子泛化為水果,水果可以再泛化為食物,食物又可以進(jìn)一步泛化。有沒(méi)有必要不斷泛化呢?泛化到怎樣的程度才是合適的呢?一般來(lái)說(shuō),如果有A、B、C等兩個(gè)或者以上的業(yè)務(wù)概念,我們發(fā)現它們有一些共同的特征,則可以考慮將它們泛化為另外一個(gè)東西, 這樣能幫助我們發(fā)現食物的本質(zhì);但如果只有一個(gè)A時(shí),就沒(méi)有必要對A再進(jìn)行泛化,例如:香蕉、蘋(píng)果、梨子已經(jīng)泛化為水果了,而水果則沒(méi)有必要泛化為食物。當然這只是一般準則,具體要泛化到怎樣的層次要看具體的業(yè)務(wù)分析需要,要靠你自己來(lái)把握。

練習4:公司的組織架構

這個(gè)練習開(kāi)始有點(diǎn)復雜了,請你用類(lèi)圖描述你所在公司的組織架構。如果你們公司比較龐大,你不是很了解整個(gè)公司的組織架構,那么請你選擇你熟悉的部分用類(lèi)圖來(lái)描述它的組織架構。如果你是學(xué)生,那么請你描述你所在大學(xué)、學(xué)院或學(xué)系的組織架構。

我們可以用組織架構圖來(lái)描繪組織架構,為什么要用類(lèi)圖來(lái)表達呢?組織架構圖畫(huà)起來(lái)很方便,用類(lèi)圖的畫(huà)反而覺(jué)得有點(diǎn)別扭,用類(lèi)圖來(lái)表達組織架構,是不是應該有更大的好處呢?請你帶著(zhù)這些問(wèn)題來(lái)完成這個(gè)練習。

某公司只是一個(gè)中小型的公司,該公司由一個(gè)一個(gè)的部門(mén)組成,用類(lèi)圖表達其組織架構可能是這樣的:

圖 1.27 公司的組織架構1

該公司有一個(gè)行政人事部、一個(gè)研發(fā)部、一個(gè)服務(wù)部、一個(gè)銷(xiāo)售部、一個(gè)財務(wù)部。這個(gè)圖似乎公司有多少個(gè)部門(mén),就多畫(huà)一個(gè)包含就搞定了,這樣畫(huà)似乎一點(diǎn)都顯示不出類(lèi)圖的優(yōu)勢。

下面這種畫(huà)法又如何呢?

圖 1.28 公司的組織架構2

注意圖中抽象部門(mén)這四個(gè)字是斜體字,這表明這個(gè)類(lèi)是抽象類(lèi)(Abstract Class),抽象類(lèi)表示這個(gè)類(lèi)是提煉出來(lái)的一種概念,是不具體存在的,具體存在的是繼承抽象部門(mén)的各個(gè)具體的部門(mén)。

前面提到的香蕉、蘋(píng)果、梨子泛化為水果,水果其實(shí)也是一種抽象的概念,前面那個(gè)圖的水果可以畫(huà)成抽象類(lèi)。

這個(gè)組織架構圖已經(jīng)一定程度地揭示了公司組織架構的本質(zhì),一個(gè)公司無(wú)非就是由一個(gè)個(gè)部門(mén)組成的,只是每個(gè)公司具體的部門(mén)可能不一樣而已。這樣的表達效果,用普通的組織架構圖是表達不出來(lái)的,而類(lèi)圖就可以發(fā)揮抽象和提煉的優(yōu)勢。

下面這個(gè)圖將更進(jìn)一步揭示公司組織架構的本質(zhì):

圖 1.29 公司的組織架構3

公司由一個(gè)個(gè)的部門(mén)組成,但要構成一個(gè)完整的公司,這些部門(mén)應該分為三類(lèi):

市場(chǎng)類(lèi)部門(mén):負責公司形象推廣、產(chǎn)品營(yíng)銷(xiāo)方面的部門(mén)。

生產(chǎn)類(lèi)部門(mén):直接生產(chǎn)公司產(chǎn)品的部門(mén)。

支持類(lèi)部門(mén):不直接生產(chǎn)公司產(chǎn)品,但是支持產(chǎn)品生產(chǎn)或支撐公司運作必不可少的部門(mén)。

在這個(gè)圖中,市場(chǎng)類(lèi)部門(mén)有策劃部、銷(xiāo)售部,生產(chǎn)類(lèi)部門(mén)有研發(fā)部、實(shí)施部、IT部,支持類(lèi)部門(mén)有:IT部、質(zhì)量部、財務(wù)部、行政人事部,其中IT部既是生產(chǎn)類(lèi)部門(mén),也是支持類(lèi)部門(mén)。

下面對其中一些具體部門(mén)進(jìn)行解釋?zhuān)?/p>

實(shí)施部是負責將軟件系統安裝到客戶(hù)現場(chǎng),保障系統上線(xiàn)運行的部門(mén)。

IT部主要負責兩方面的職能,一方面要保障公司內部的辦公軟硬件環(huán)境,另一方面會(huì )承接一些外部的網(wǎng)絡(luò )工程,為公司直接盈利。第一方面的工作是屬于支持類(lèi)方面的工作,而第二方面的工作則是生產(chǎn)類(lèi)的工作。

質(zhì)量部負責測試及過(guò)程保障的工作,這個(gè)部門(mén)是支援研發(fā)部和實(shí)施部工作的,故也屬于支持類(lèi)的部門(mén)。

將部門(mén)分為市場(chǎng)類(lèi)、生產(chǎn)類(lèi)和支持類(lèi),只是其中一種的抽象方法,每個(gè)人可能會(huì )有不同的標準,遇到不同情況可能會(huì )有不同的抽象辦法。以上這個(gè)僅是一個(gè)例子,你千萬(wàn)不要將其當成一個(gè)固定的標準。

總體來(lái)說(shuō),上述三個(gè)用類(lèi)圖表示的公司組織架構,所針對的公司都不是大型的公司,大型的公司可能會(huì )有分公司、子公司、事業(yè)部等等不同的劃分辦法,組織架構異常復雜,想用類(lèi)圖準確地表達出來(lái)并且能揭示其本質(zhì)相當不容易。希望通過(guò)上述三個(gè)例子,能讓你初步體會(huì )用類(lèi)圖提煉業(yè)務(wù)的優(yōu)勢。

上面四個(gè)練習,基本覆蓋了你在前面小節學(xué)習到的類(lèi)之間關(guān)系的知識。在我的經(jīng)驗看來(lái),直線(xiàn)(關(guān)聯(lián))關(guān)系、包含關(guān)系是最常用的,泛化(繼承)關(guān)系用得也比較多,而依賴(lài)關(guān)系用得不是很多。而從使用的難度來(lái)說(shuō),泛化(繼承)關(guān)系是最考驗人的了,很考驗你發(fā)掘事物本質(zhì)的能力。

類(lèi)圖是不是很有意思呢?下面小節將會(huì )更加有意思,但同時(shí)難度也會(huì )進(jìn)一步增大,喜歡挑戰的你一定是不會(huì )退縮的了!

分析業(yè)務(wù)模型-類(lèi)圖(Class Diagram)(下)

摘要:類(lèi)圖(Class Diagram)可能是用得最多的一種UML圖。類(lèi)圖的基本語(yǔ)法并不復雜,你可能最多學(xué)習兩三天就可以掌握,然而要真正做到活用類(lèi)圖則可能需要幾年的功力。類(lèi)圖是鍛煉面向對象分析(OOA:Object-Oriented Analysis)和面向對象設計(OOD:Object-Oriented Design)思想的重要的工具,是業(yè)務(wù)結構建模的重要工具。本章將會(huì )有大量的實(shí)戰練習,你的OOA思想將會(huì )接受極大的考驗和提升。

3.5 類(lèi)的“遞歸”關(guān)系與“三角”關(guān)系

這個(gè)小節是類(lèi)圖的進(jìn)階知識,有一點(diǎn)難度,但這些知識在需求分析工作中非常實(shí)用。

“遞歸”關(guān)系

我在以前公司面試過(guò)的人數可能有數百人,如果面試者說(shuō)他懂類(lèi)圖,那么我幾乎100%會(huì )問(wèn)這個(gè)問(wèn)題:Windows操作系統中有文件夾與文件,請你用類(lèi)圖表達出文件夾與文件的關(guān)系。

經(jīng)過(guò)前面的學(xué)習,你已經(jīng)具備了能畫(huà)出這個(gè)圖的基本知識了,請你不要看后面的參考答案,先自己嘗試完成這個(gè)題目。

很多面試者很快就會(huì )畫(huà)出這樣的圖:

圖 1.30 文件夾與文件關(guān)系1

我會(huì )接著(zhù)問(wèn)這些問(wèn)題:

1)文件夾里面也可以有文件夾啊,這個(gè)怎樣表示出來(lái)?

2)里面的文件夾里面也可能有文件夾,咋辦?

很多面試者傻眼了,只有很少數人可以畫(huà)出來(lái)。

其實(shí)畫(huà)不出來(lái)也不用灰心,我剛學(xué)習類(lèi)圖時(shí),也被這個(gè)題目一下子難倒了,后來(lái)看到參考答案后恍然大悟,同時(shí)對類(lèi)圖產(chǎn)生一種莫名的敬仰!

圖 1.31 文件夾與文件關(guān)系2

文件夾里面有文件夾,里面的文件夾里面有可能有文件夾,這可能是無(wú)窮無(wú)盡的“遞歸”??!而這個(gè)包含關(guān)系可以自己指向自己,可以“自包含”,這個(gè)無(wú)窮“遞歸”的問(wèn)題就解決了,實(shí)在太完美了!

無(wú)論是弱包含還是強包含,都可以“自包含”。除了“自包含”可以形成“遞歸”,其實(shí)直線(xiàn)關(guān)系同樣是可以指向自己的,這個(gè)叫“自關(guān)聯(lián)”,這樣也形成了“遞歸”關(guān)系。請看下圖:

圖 1.32 自關(guān)聯(lián)

這種“遞歸”結構,一旦展開(kāi)就會(huì )形成一棵樹(shù)型的結構。需求分析時(shí)如果發(fā)現樹(shù)型的業(yè)務(wù)結構,你可以考慮使用“自包含”或者“自關(guān)聯(lián)”來(lái)分析。

其實(shí)“自包含”、“自關(guān)聯(lián)”的說(shuō)法是不嚴謹的,只是方便記憶和理解,實(shí)際上具體的一個(gè)文件夾是不會(huì )包含自己的。這里我們需要進(jìn)一步理解類(lèi)圖中的每一個(gè)類(lèi)所代表的意義,一個(gè)類(lèi)并不是指具體的一個(gè)業(yè)務(wù)對象,一個(gè)類(lèi)泛指屬于這個(gè)類(lèi)的任意一個(gè)業(yè)務(wù)對象。這里的解釋可能還不夠清楚,你可以暫且放下,在對象圖的小節我們再具體說(shuō)這個(gè)問(wèn)題。

“三角”關(guān)系

前面有個(gè)練習,要求你畫(huà)出公司與雇員的關(guān)系,現在要求你分別列出公司和雇員至少3個(gè)關(guān)鍵屬性。

待你列出關(guān)鍵屬性后,請你思考這些問(wèn)題:

1)薪金是雇員的關(guān)鍵屬性嗎?合同期、職位呢?

2)公司與雇員,這兩者的關(guān)系在法律上是如何確立的?

你一定會(huì )想到,公司與雇員要簽署勞動(dòng)合同,而勞動(dòng)合同上會(huì )有薪金、合同期、職位這些重要的內容,那么薪金、合同期、職位還算是雇員的屬性嗎?公司、雇員、勞動(dòng)合同這三者是怎樣的關(guān)系?

圖 1.33 公司、雇員、勞動(dòng)合同的關(guān)系1

在表示公司與雇員的關(guān)系的直線(xiàn)上,拉出一條虛線(xiàn),虛線(xiàn)另外一端連接勞動(dòng)合同類(lèi),這樣的類(lèi)叫做關(guān)聯(lián)類(lèi)(Association Class),關(guān)聯(lián)類(lèi)是對兩個(gè)類(lèi)的關(guān)系的進(jìn)一步約束。

最開(kāi)始你可能會(huì )認為薪金、職位、合同期這些似乎應該是雇員的屬性,但現在你應該認識到,這些三個(gè)關(guān)鍵內容應該體現在公司與雇員的關(guān)系上,這些內容應該體現在勞動(dòng)合同上。再進(jìn)一步思考,雇員的薪金、職位、合同期是會(huì )變化的,你可能會(huì )跟同一個(gè)公司簽署多份勞動(dòng)合同,也可能簽署一份勞動(dòng)合同后又有多次合同變更。

要識別出能表征兩個(gè)類(lèi)關(guān)系的關(guān)聯(lián)類(lèi),難度是有點(diǎn)高的,有這樣的一些實(shí)踐建議供你參考:

1)如果覺(jué)得兩個(gè)類(lèi)有關(guān)系,則先拉上一條直線(xiàn)再說(shuō)。

2)如果覺(jué)得兩個(gè)類(lèi)有關(guān)系,但怎樣畫(huà)都覺(jué)得這個(gè)關(guān)系不太合適,那么可以思考是不是漏了一個(gè)關(guān)聯(lián)類(lèi)了。

3)分別列出這兩個(gè)類(lèi)的關(guān)鍵屬性,思考這些屬性的屬性值是不是由該類(lèi)本身就可以確定了。例如:如果我們最開(kāi)始將薪金作為員工的屬性,那么你可以思考薪金的具體數字,是不是員工自己本身可以確定的?你會(huì )發(fā)現薪金其實(shí)是由公司和員工商定后確定的,并不是員工自己本身可以決定。

4)通過(guò)對屬性的思考,可能會(huì )發(fā)現這個(gè)屬性應該是屬于另外一個(gè)類(lèi)的,思考這個(gè)類(lèi)是不是能表征原來(lái)兩個(gè)類(lèi)關(guān)系的關(guān)聯(lián)類(lèi)。

關(guān)聯(lián)類(lèi)這樣復雜的東西,客戶(hù)是不太可能直接告訴你的,你需要在需求分析中發(fā)現和提煉出關(guān)聯(lián)類(lèi),這對需求的理解以及項目后期的設計工作將會(huì )有很大的幫助。

將薪金、職位、合同期這些信息直接當成是雇員的屬性也不是不可以的,這跟我們做系統的目標很有關(guān)系。如果我們只是做很簡(jiǎn)單的員工信息管理,可能就沒(méi)有必要將合同提煉出來(lái)。如果我們要做一個(gè)人事管理系統,甚至要產(chǎn)品化,這樣就需要我們將業(yè)務(wù)模型分析得更加透徹。

回到前面的“公司的組織架構”練習,如果我們要做一個(gè)通用的公司管理系統,我們希望能盡量適應不同的公司情況,那么例子中所做的對公司組織架構的提煉是很必要的,如果我們能看清楚公司部門(mén)架構的本質(zhì),那么就能盡量多的適應不同的情況。

我實(shí)踐建議是:在需求分析階段應盡量對業(yè)務(wù)分析得透徹一點(diǎn),這樣后期工作將會(huì )更加主動(dòng)。業(yè)務(wù)需求模型最終變成設計模型時(shí),我們可以把握設計的“度”的,可以做出彈性很高的設計,也可以做一個(gè)比較“老土”的設計。

公司、雇員、勞動(dòng)合同的關(guān)系,其實(shí)還可以畫(huà)成下面這樣:

圖 1.34 公司、雇員、勞動(dòng)合同的關(guān)系2

這個(gè)圖可能最體現它們的“三角”關(guān)系了,關(guān)聯(lián)類(lèi)也可以表達成這樣的方式。但我在實(shí)際工作還是以關(guān)聯(lián)類(lèi)的方式來(lái)表達,我覺(jué)得關(guān)聯(lián)類(lèi)的表達方式更加貼切和專(zhuān)業(yè)一點(diǎn)。

在具體的需求分析工作時(shí),如果你發(fā)現三個(gè)類(lèi)形成了類(lèi)似該圖的“三角”關(guān)系,你可以思考其中一個(gè)類(lèi)是不是可能是關(guān)聯(lián)類(lèi),但要注意并不是凡是出現了“三角”關(guān)系就一定會(huì )有關(guān)聯(lián)類(lèi)。

怎么樣?本節的難度已經(jīng)更上一城樓了!

類(lèi)圖的最大魅力在于幫助你發(fā)掘和提煉業(yè)務(wù)模型,其他的非UML圖可能是做不到的。當然真正要做好發(fā)掘和提煉,還是需要你的深厚功力了!

下小節,你將要完成一個(gè)綜合練習,應用你所學(xué)習到的全部類(lèi)圖知識。

3.6 考試管理系統——類(lèi)圖綜合訓練

做這綜合練習有以下幾個(gè)目的:

1)讓你鞏固所學(xué)到的類(lèi)圖知識。

2)演練用類(lèi)圖分析需求的基本步驟。

3)學(xué)習一些提煉類(lèi)的新知識。

本練習我們將會(huì )演練類(lèi)圖分析需求的基本步驟:

1)識別出類(lèi)。

2)識別出類(lèi)的主要屬性。

3)描繪出類(lèi)之間的關(guān)系。

4)對各類(lèi)進(jìn)行分析、抽象、整理。

本綜合訓練的題目如下:

某學(xué)校打算做一套考試管理系統,當前情況如下:

1)講師會(huì )講很多門(mén)課,大部分的課程需要安排一次考試,有些就不需要。

2)考試題目由講師出。

3)學(xué)生需要參加很多考試,每門(mén)考試都有成績(jì)。

請你思考:

1)考試是一個(gè)類(lèi)嗎?如果是,考試這個(gè)類(lèi)代表怎樣的意思?

2)分析出與考試直接相關(guān)的類(lèi)都有哪些?

3)考試類(lèi)與其他類(lèi)是怎樣的關(guān)系?

本系統圍繞考試開(kāi)展,我們首先要確定考試是怎樣的一個(gè)類(lèi),考試類(lèi)代表考試試卷嗎?還是代表考試這個(gè)事情?這是考試管理系統,不是考試試卷管理系統(當然試卷也需要在本系統中管理),需要對考試這個(gè)事情進(jìn)行管理,所以考試類(lèi)代表的是考試這個(gè)事情。

將需求分析中遇到的人、物、概念識別為類(lèi),這是比較容易做到的,而對于事情,例如考試,我們就不一定能將其識別為類(lèi)。因為普遍認為,類(lèi)代表的是一些靜態(tài)東西,而事情是動(dòng)態(tài)的,不適合用類(lèi)來(lái)表示。這并不是絕對的,由系統的目標出發(fā),有時(shí)候我們需要將某些事情、動(dòng)作等動(dòng)態(tài)內容,識別為類(lèi)。當我們做某某管理系統,而某某是指某個(gè)事情時(shí),其實(shí)最終系統是通過(guò)管理該事情的記錄來(lái)實(shí)現對該事情的管理。例如:考試管理系統,其實(shí)最終系統管理的是考試記錄;請假管理系統,其實(shí)系統最終管理的是請假記錄。為了能讓這些事情能被管理,將這些事情識別為類(lèi)是很必要的。

考試類(lèi)的意義基本確定了,它的屬性有考試時(shí)間、地點(diǎn)等內容,現在要思考與考試直接相關(guān)的類(lèi)有哪一些呢? 課程、試卷、講師、成績(jì)、學(xué)生這些合適嗎?

請你先列出與考試直接相關(guān)的類(lèi),并嘗試畫(huà)出它們與考試的關(guān)系,然后才繼續往下看。

請注意只需要找出與考試直接相關(guān)的類(lèi)就可以了,不需要找間接相關(guān)的,另外只需要畫(huà)出其他類(lèi)與考試的關(guān)系就可以了,至于其他類(lèi)之間的關(guān)系暫不用考慮。

圖 1.35 考試類(lèi)與其他類(lèi)的關(guān)系

說(shuō)明:此圖并沒(méi)有畫(huà)出課程、講師、學(xué)生之間的關(guān)系,此圖重點(diǎn)表達的是其他類(lèi)與考試類(lèi)的關(guān)系。

此圖表達了這樣的情況:

1)每個(gè)課程要么安排一次考試,要么沒(méi)有考試,而每個(gè)考試只對應一門(mén)課程。

2)一名講師作為出題者對應零到多次考試,而每一次考試必有對應的一位出題的老師。

3)一名學(xué)生需要參加零到多次的考試,而每個(gè)考試有一到多個(gè)學(xué)生參加。

至于成績(jì)和試卷,要重點(diǎn)說(shuō)明一下。

作為一名學(xué)生,他參加一門(mén)考試就會(huì )得到一個(gè)成績(jì),他參加多門(mén)考試就得到多門(mén)成績(jì),于是就可以計算出該名學(xué)生的平均分、最高分、分數排名等,這些內容可以列為學(xué)生的屬性。

作為考試來(lái)說(shuō),一次考試有很多學(xué)生參加,這樣這門(mén)考試就會(huì )產(chǎn)生很多個(gè)成績(jì),根據這些成績(jì),我們可以算出這次考試的平均分、最高分、優(yōu)秀率、合格率等等,注意平均分、最高分這些也可以叫做這次考試的成績(jì),這些內容可以列為考試的屬性。

學(xué)生的分數排名、考試的優(yōu)秀率這些東西如果列為屬性,這些屬性可以成為“導出屬性”,意思就是通過(guò)其他基礎數據算出來(lái)的屬性。需求分析時(shí),我們要重點(diǎn)識別基礎屬性,基礎屬性是指“原生”的屬性,不根據其他東西計算出來(lái),而是直接得到的。

圖3.35中所定義的成績(jì)類(lèi)是指一名學(xué)生參加一次考試所得到的成績(jì),這個(gè)成績(jì)是原生的,通過(guò)這個(gè)成績(jì),系統可以從考試的角度或者從學(xué)生的角度導出很多其他統計數據。

理解了成績(jì)這個(gè)類(lèi),應該就比較容易理解試卷這個(gè)類(lèi)了。一次考試對應一名出題老師,老師為這次考試設計了一份題目,這份題目就是試卷。

上述只是參考答案,這個(gè)題目并沒(méi)有標準答案,識別出怎樣的類(lèi)以及畫(huà)出類(lèi)之間的關(guān)系,從不同的角度就會(huì )有不同的結果,關(guān)鍵還是要從系統的目標出發(fā),做出合適的分析。如果你的答案與參加答案很不一致,不代表你畫(huà)得不好,只要你能有條理地解釋這些類(lèi)和它們的關(guān)系,就是合適的!

通過(guò)這個(gè)綜合訓練的過(guò)程(而不是結果),總結以下幾點(diǎn)實(shí)踐建議供你參考:

1)從系統的目標出發(fā)來(lái)思考問(wèn)題。

2)用類(lèi)圖分析需求的基本步驟:識別類(lèi)、識別屬性、畫(huà)出關(guān)系、整理和提煉,只是大致的參考步驟,并不是絕對的。

3)識別類(lèi)的關(guān)鍵屬性,能讓我們思考類(lèi)是否合適,嘗試畫(huà)出類(lèi)的關(guān)系也會(huì )讓我們再次思考這些類(lèi)是否合適。

4)多讀圖,從兩個(gè)方向來(lái)讀兩個(gè)類(lèi)的關(guān)系,能幫助你發(fā)現更多問(wèn)題。

5)只需要表達出的類(lèi)直接關(guān)系就可以了。例如:A和B有關(guān)系,B和C有關(guān)系,這樣其實(shí)A和C也是有關(guān)系的,它們有間接關(guān)系,間接關(guān)系不需要直接畫(huà)出來(lái),只需要畫(huà)出所有的直接關(guān)系,我們可以通過(guò)類(lèi)圖的關(guān)系網(wǎng)絡(luò )看到類(lèi)之間的間接關(guān)系。

6)不要試圖用一個(gè)類(lèi)圖表達所有的內容??荚囅到y這個(gè)題目其實(shí)已經(jīng)簡(jiǎn)化不少了,實(shí)際系統的類(lèi)圖可能有幾十個(gè)甚至上百個(gè)類(lèi),要規劃好用多個(gè)類(lèi)圖來(lái)表達不同的內容,每個(gè)類(lèi)圖有不同的表達重點(diǎn)。

7)注意識別“原生”的內容,并且根據這些“原生”內容能導出什么“導出內容”,不要將“導出內容”當成“原生內容”的。

8)識別關(guān)聯(lián)類(lèi)是難點(diǎn)也是關(guān)鍵點(diǎn),分離出關(guān)聯(lián)類(lèi)會(huì )讓我們更加看清楚事務(wù)的本質(zhì)。

9)沒(méi)所謂絕對正確的答案,關(guān)鍵是要有自己的合理分析,逐步求精、持續優(yōu)化你的想法。

10)多練習、多討論,逐步增強你的面向對象分析素養。

3.7 關(guān)于對象圖

寫(xiě)過(guò)代碼的朋友比較容易理解什么是對象,類(lèi)(class)的實(shí)例(instance)就是對象(object)。第1章大話(huà)UML曾講解過(guò)對象圖,我們再來(lái)復習一下。

這是Person類(lèi):

圖 1.36 Person類(lèi)

下面這句代碼將Person類(lèi)實(shí)例化為person對象:

Person person = new Person();

用對象圖表示為:

圖 1.37 person對象

一個(gè)公司包含多個(gè)員工,用類(lèi)圖這樣表示:

圖 1.38 公司和員工的關(guān)系

此圖的公司和員工并沒(méi)有指具體是哪個(gè)公司或者哪個(gè)員工,如果某公司A有甲、乙、丙三位員工,用對象圖則可以這樣表示:

圖 1.39 公司A與員工甲、乙、丙的關(guān)系

“A:公司”表示對象A是公司這個(gè)類(lèi)的實(shí)例;如果是“:公司”,則表示這是公司這個(gè)類(lèi)的實(shí)例,但沒(méi)有給出這個(gè)實(shí)例的具體名稱(chēng)。

類(lèi)是某一類(lèi)東西的抽象或者叫統稱(chēng),而對象則是具體的一個(gè)東西,A公司如果有1000名員工,那么就需要畫(huà)一千個(gè)“包含”才能表示出A公司與所有員工的關(guān)系。對象與對象之間如果有關(guān)系,那肯定是一對一的關(guān)系,因為兩者都是具體的東西,不可能存在第二個(gè)。比方說(shuō)張三和李四是好朋友,他們的關(guān)系就是一對一的好朋友關(guān)系,因為不可能再有另外一個(gè)張三或者李四,但如果我們將張三和李四抽象為人時(shí),一個(gè)人可以與很多人交朋友,這樣就可以建立多對多的朋友關(guān)系。

需求分析時(shí),其實(shí)我們接觸到的是一個(gè)個(gè)具體的東西,如:見(jiàn)到一個(gè)個(gè)具體的人,接觸到一份份具體的業(yè)務(wù)數據等等,這些具體的東西其實(shí)就是對象。而我們分析需求不能就事論事,我們需要將這些對象提煉為類(lèi),這樣的分析才更具有代表性。我們軟件系統并不是用來(lái)解決具體某次事件中的一個(gè)問(wèn)題,而是希望能解決某一類(lèi)問(wèn)題。

在我的工作經(jīng)歷看來(lái),需求分析工作中很少需要用到對象圖。我基本不會(huì )使用對象圖,而直接使用類(lèi)圖,在少數需要使用對象圖時(shí),我甚至會(huì )直接用類(lèi)圖代替,這樣做也并沒(méi)有不妥而且也容易理解和解決問(wèn)題。

前面有一個(gè)練習,讓你用類(lèi)圖畫(huà)出你和你的另外一半的關(guān)系,其實(shí)準確地說(shuō)你和你的另外一半已經(jīng)是很具體的一個(gè)人了,應該用對象圖來(lái)表達,但我覺(jué)得將其“混淆”為類(lèi)圖也沒(méi)有什么不妥,而且更簡(jiǎn)單易懂。

前面“類(lèi)的遞歸關(guān)系”小節提到“自包含”“自引用”的問(wèn)題,“自”的意思并不是指對象自己本身,而是指其他的屬于同一個(gè)類(lèi)的實(shí)例。

對象圖就簡(jiǎn)單介紹到這里,如果你對類(lèi)圖還不是很熟悉的話(huà),建議你對象圖了解到這樣的程度就可以了。

3.8 小結與練習

類(lèi)圖是最常用的UML圖,是用來(lái)訓練你OOA思想的最好武器。類(lèi)圖的語(yǔ)法不算很難,要看懂類(lèi)圖難度不大,但要用好類(lèi)圖就相當不容易了。

本章一開(kāi)始,專(zhuān)門(mén)對開(kāi)發(fā)人員進(jìn)行了“洗腦”,端正你對面向過(guò)程和面向對象的認識。如果你不是開(kāi)發(fā)人員,那么這個(gè)“洗腦”就可以免了。

接下來(lái)你學(xué)習了一大堆類(lèi)圖的基本語(yǔ)法,并做了很多練習,你還記得下面列出來(lái)的內容嗎?

表 3.1 類(lèi)圖基本語(yǔ)法

你還學(xué)習了類(lèi)圖的“遞歸”關(guān)系與“三角”關(guān)系。

圖 3.40 “遞歸”關(guān)系示例

圖 3.41 “三角”關(guān)系示例

一個(gè)個(gè)的練習除了讓你鞏固學(xué)到的類(lèi)圖知識,更重要的是通過(guò)具體的實(shí)例讓你體會(huì )用類(lèi)圖分析問(wèn)題的思路和方法。

類(lèi)圖分析需求的基本步驟:

1)識別出類(lèi)。

2)識別出類(lèi)的主要屬性。

3)描繪出類(lèi)之間的關(guān)系。

4)對各類(lèi)進(jìn)行分析、抽象、整理。

類(lèi)實(shí)例化后就是對象,表達這些對象及對象關(guān)系的圖,就是對象圖。需求分析中很少需要使用對象圖。

多思考、多練習、多討論、多總結,不斷鍛煉和提升你的面向對象分析能力吧!

練習

1.一輛小車(chē)有4個(gè)輪子,請用類(lèi)圖表示出來(lái)。

2.一輛貨車(chē)也有4個(gè)輪子,但貨車(chē)的前輪和后輪不太一樣,用類(lèi)圖如何表示?

3.請用類(lèi)圖表示項目組的人員組成。 提示:請思考項目組包含怎樣的角色?項目組架構是樹(shù)形架構還是網(wǎng)絡(luò )架構?

4.你要設計一個(gè)論壇,請用類(lèi)圖表達出分區、版塊、子版塊、帖子等論壇常見(jiàn)元素的關(guān)系。

5.請在你做過(guò)或者正在做的項目中挑選一個(gè),用類(lèi)圖來(lái)分析該項目的需求或者部分需求。

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
面向對象開(kāi)發(fā)過(guò)程簡(jiǎn)介
數字化轉型與架構-架構設計篇|建模之“聚類(lèi)”
UML和面向對象分析與設計總結
Java的面向對象編程
面向對象程序可視化類(lèi)圖的逆向自動(dòng)生成
產(chǎn)品經(jīng)理的思考利器——UML
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久