您好,登錄后才能下訂單哦!
閱讀目錄:
1.背景介紹
2.問(wèn)自己,UML對(duì)你來(lái)說(shuō)有意義嗎?它幫助過(guò)你對(duì)系統(tǒng)進(jìn)行分析、建模嗎?
3.一直以來(lái)其實(shí)我們被一個(gè)縫隙隔開(kāi)了,使我們對(duì)OOAD遙不可及
4.四色原型模式填補(bǔ)這個(gè)歷史縫隙,讓我們真的看見(jiàn)OOAD的希望
5.在四色原型上運(yùn)用彩色建模增強(qiáng)視覺(jué)沖擊力
6.通過(guò)四色原型模式建模出領(lǐng)域無(wú)關(guān)模型
7.結(jié)束語(yǔ):建模時(shí)你可以不考慮具體實(shí)現(xiàn),但是建模者要懂技術(shù)實(shí)現(xiàn)
至今我都清楚的記得我第一次被面試官問(wèn)起什么叫”建?!凹夹g(shù)時(shí)的情景,那是好幾年前的事情了,當(dāng)時(shí)是胸有成竹的去面試一個(gè)有關(guān)系統(tǒng)分析、設(shè)計(jì)的.NET高級(jí)軟件工程師崗位。面試官幾乎沒(méi)問(wèn)我有關(guān).NET方面的任何技術(shù)實(shí)現(xiàn),他就簡(jiǎn)單的問(wèn)了問(wèn):“你如何把握你所分析出來(lái)的系統(tǒng)的正確性?”,我當(dāng)時(shí)有點(diǎn)小激動(dòng),覺(jué)得這個(gè)問(wèn)題應(yīng)該很簡(jiǎn)單嘛,都是概念而已,讓他直接點(diǎn)問(wèn),結(jié)果他來(lái)一句:“你懂建模嗎?,能給我解釋一下建模的作用嗎?“,接著他出了一個(gè)小例子,讓我對(duì)這個(gè)例子進(jìn)行建模,要考慮到各種擴(kuò)展性、業(yè)務(wù)穩(wěn)定性的關(guān)鍵點(diǎn),要邊建模邊說(shuō)出為什么要這么建模,要說(shuō)出思路。他最后重點(diǎn)強(qiáng)調(diào)了一下:“創(chuàng)建出來(lái)的模型是不允許跟任何具體的代碼、工具有關(guān)聯(lián)的”。
在我現(xiàn)在看來(lái),他的意思也就是說(shuō)創(chuàng)建出來(lái)的UML類(lèi)圖模型是領(lǐng)域無(wú)關(guān)模型(領(lǐng)域通用模型),可以用任何一種編程技術(shù)去實(shí)現(xiàn)他,作為建模者不需要考慮這些實(shí)現(xiàn)細(xì)節(jié),考慮的越多越容易分散你對(duì)真實(shí)業(yè)務(wù)的等價(jià)建模,容易犯技術(shù)人員的通?。ㄓ眉夹g(shù)的思維來(lái)考慮業(yè)務(wù))。
我當(dāng)時(shí)心想這個(gè)容易啊,不就是用UML搞點(diǎn)圖出來(lái)做做秀嘛,體現(xiàn)出分析、設(shè)計(jì)的高端嘛,其他還能有啥作用;其實(shí)我當(dāng)時(shí)之所以這么想是因?yàn)槲覍?duì)UML、建模也嘗試過(guò)學(xué)習(xí)、理解和運(yùn)用,結(jié)果我發(fā)現(xiàn)這就是一個(gè)作秀的工具罷了,對(duì)這個(gè)東西很不屑,甚至對(duì)軟件工程中的“建?!鳖I(lǐng)域有一種抵觸心理。
我當(dāng)時(shí)隨口說(shuō)了一些我學(xué)習(xí)UML建模時(shí)的心得,心想這個(gè)也就是最終答案了,因?yàn)樗_實(shí)就是這個(gè)作用(”作秀“),然后我通過(guò)代碼驅(qū)動(dòng)建模,倒著推導(dǎo)出UML的類(lèi)圖,結(jié)果和我意料的差不多;基本上都覆蓋了這個(gè)小例子的幾大方面,反正面試官不知道我是如何得出這個(gè)UML類(lèi)圖的,只有天知道,我是通過(guò)先構(gòu)建代碼模型然后反方向推到出類(lèi)圖模型的,嘴上說(shuō)的跟心理想的完全是相反的。
在我感覺(jué)非常良好的等著面試官接著問(wèn)下一個(gè)問(wèn)題的時(shí)候,情況出現(xiàn)了。面試官說(shuō)我漏掉了東西,說(shuō)我沒(méi)有充分考慮到業(yè)務(wù)場(chǎng)景,沒(méi)有將業(yè)務(wù)概念中的關(guān)鍵概念劃分清楚,甚至疏忽了很重小的領(lǐng)域?qū)嶓w屬性,按照我這個(gè)模型圖開(kāi)發(fā)出來(lái)的軟件是不能夠滿足現(xiàn)在的業(yè)務(wù)要求的。我當(dāng)時(shí)就蒙了,啥叫關(guān)鍵概念,哪個(gè)概念不是關(guān)鍵概念啊,又有哪里不能用了,心理有點(diǎn)委屈,一時(shí)不理解,覺(jué)得面試官在為難我。
其實(shí)我現(xiàn)在能明白當(dāng)時(shí)面試官說(shuō)的是什么意思,他是指我未能清晰的表達(dá)出各個(gè)類(lèi)的職責(zé),看上去每個(gè)類(lèi)扮演的角色都是一樣的,無(wú)非就是屬性、方法這些類(lèi)元素,我未能捕獲到核心領(lǐng)域概念,未能站在領(lǐng)域考慮建模,而是站在代碼的層面上來(lái)從低往上看的,很多東西是看不清楚的,說(shuō)白了,開(kāi)發(fā)人員拿到這個(gè)類(lèi)圖能否明白自己將要面對(duì)的領(lǐng)域,如果能明白,此時(shí)類(lèi)圖模型是健康的,如果不明白那就是有問(wèn)題的,因?yàn)槟P蛨D不是給自己看的,而是給整個(gè)團(tuán)隊(duì)交流共享的。
后來(lái)我自己調(diào)整了一下心情,就算面試失敗我也要有總結(jié)才行,面試本來(lái)就是一個(gè)被虐的過(guò)程。(“佛曰:此時(shí)正是修行時(shí)”,就當(dāng)是鍛煉好了。)
我虛心的向面試官請(qǐng)教我這個(gè)模型圖哪里有問(wèn)題,他指出了有可能我這輩子都無(wú)法看見(jiàn)的分析盲點(diǎn),他說(shuō)這個(gè)問(wèn)題是程序員用技術(shù)思維來(lái)分析建模的通病。為什么他能看見(jiàn)這些盲點(diǎn),而我不能,我很想知道這其中的精髓,我當(dāng)時(shí)就要求降薪到這里來(lái)學(xué)習(xí),面試官不降薪愿意讓我過(guò)來(lái),他也是一個(gè)對(duì)技術(shù)有追求的人吧。但是后來(lái)我有特殊事情未能去貴公司就職,此后我一直遺憾,這個(gè)建模精髓我有可能一輩子都搞不懂了。
現(xiàn)在我能明白,其實(shí)如果用代碼級(jí)別的分析思維來(lái)輔助你建模就一定會(huì)有盲點(diǎn),因?yàn)榇a級(jí)別的“設(shè)計(jì)模式”,“設(shè)計(jì)原則”并非建模時(shí)的“分析模式”,這是兩個(gè)不同的問(wèn)題域,也就是說(shuō)彼此用在不同的業(yè)務(wù)領(lǐng)域的,不能夠一概而論,如果交叉使用就會(huì)誤導(dǎo)你目前的重心,你會(huì)往里面添油加醋。
“建?!边@個(gè)非常抽象且神圣的詞是多么的霸氣,貌似是已經(jīng)觸及軟件工程的最高境界了;崇拜,自卑;搞軟件開(kāi)發(fā)也有幾年了,居然連建模都不懂;那一夜我徹底失眠了,從那以后我在技術(shù)上充滿了無(wú)助感,為什么?因?yàn)槲乙呀?jīng)清楚自己要想在軟件領(lǐng)域有一定的成果,必須學(xué)會(huì)對(duì)真實(shí)世界建模,從那開(kāi)始”建?!耙辉~在我腦子的已經(jīng)和UML關(guān)系不大了。
之后我在軟件分析、設(shè)計(jì)的海洋里苦苦尋找這個(gè)曾經(jīng)在我面前就像流星一樣劃過(guò)的”建模金鑰匙“,有了它我就可以去一個(gè)神圣的世界。輾轉(zhuǎn)反側(cè)幾年過(guò)去了,在前不久我終于知道“建模的金鑰匙”是什么了,這類(lèi)東西在網(wǎng)絡(luò)上很少見(jiàn),寫(xiě)的很少,下面我們來(lái)詳細(xì)了解它。
我想學(xué)過(guò)軟件開(kāi)發(fā)的人都多多少少了解UML,簡(jiǎn)單講它就是一個(gè)用來(lái)建模的語(yǔ)言,你可以純粹的把它理解成是一個(gè)畫(huà)圖工具,定義了一些元素,用來(lái)表達(dá)不同的概念。這里我們關(guān)心的是UML類(lèi)圖,也就是用來(lái)進(jìn)行面向?qū)ο蠼Y(jié)構(gòu)建模用的,通過(guò)各種不同的圖形來(lái)表達(dá)抽象的對(duì)象結(jié)構(gòu)。
圖1:簡(jiǎn)單的訂單類(lèi)圖
上圖是一個(gè)很簡(jiǎn)單的“訂單”與“產(chǎn)品”相關(guān)的類(lèi)圖,我們都能懂這里面的意思,因?yàn)槲覀儗?duì)這塊的業(yè)務(wù)很了解;知道在什么地方應(yīng)該有什么,比如Order中的計(jì)算商品總價(jià)的算法,有相關(guān)業(yè)務(wù)背景的人都知道這里是會(huì)存在的極大邏輯變化的地方,所以我們需要通過(guò)接口來(lái)隔離這塊邏輯。
我們之所以能夠畫(huà)出這張類(lèi)圖跟UML這個(gè)語(yǔ)言本身其實(shí)沒(méi)關(guān)系,重要的是你對(duì)相關(guān)的業(yè)務(wù)非常之了解,在你腦子里可以不使用UML來(lái)建模,你可以用任何一個(gè)草圖來(lái)建模,也就是說(shuō)UML并不等于建模,這個(gè)要清楚的認(rèn)識(shí)。那我們使用UML有何用?它并沒(méi)有幫助我們來(lái)分析系統(tǒng);沒(méi)錯(cuò),UML從某個(gè)角度講它沒(méi)有直接幫助我們對(duì)系統(tǒng)盡心分析建模,幫助我們分析建模的是那些業(yè)務(wù)知識(shí),懂業(yè)務(wù)的人可以不使用UML來(lái)建模,隨便用一種圖形表示法來(lái)說(shuō)明業(yè)務(wù)概念即可。其實(shí)UML只不過(guò)是一個(gè)通用的模型表達(dá)語(yǔ)言而已,是用來(lái)幫助我們交流模型用的,并非是建模的思想和方法。
既然UML不能夠幫助我們分析系統(tǒng),那我們?nèi)绾尾拍軠?zhǔn)確的建模出我們不是很熟悉的領(lǐng)域呢?我們必須承認(rèn),領(lǐng)域?qū)<胰绻夹g(shù)肯定是建模的最適合人選,但是現(xiàn)實(shí)并非這樣,需要我們技術(shù)人員去熟悉領(lǐng)域然后創(chuàng)建模型,但是這中間難免會(huì)漏掉重要的業(yè)務(wù)概念,因?yàn)楫吘箯恼鎸?shí)的業(yè)務(wù)到最終的模型是有一個(gè)過(guò)程的,而最讓我們無(wú)助的是在這個(gè)過(guò)程中沒(méi)有任何可行的指導(dǎo)思想可以借鑒的,只有通過(guò)經(jīng)驗(yàn)來(lái)把握最終的質(zhì)量。
總是通過(guò)經(jīng)驗(yàn)來(lái)建模不符合軟件行業(yè)的發(fā)展方法,顯然不行,這種建模技術(shù)難道不可以傳遞嗎?答案是可以傳遞的,說(shuō)明這個(gè)可以傳遞的技術(shù)正是本文的目的。我們繼續(xù)往下看。
上節(jié)中其實(shí)已經(jīng)拋出建模的核心問(wèn)題域了,只不過(guò)不是很明顯;我們用本節(jié)來(lái)重點(diǎn)突出這個(gè)長(zhǎng)久以來(lái)一直困擾我們建模者的問(wèn)題域,以引起我們對(duì)它的重視,因?yàn)樗彩擒浖こ讨械囊粋€(gè)重要的研究領(lǐng)域。
如本節(jié)標(biāo)題所說(shuō),其實(shí)我們被一個(gè)建模時(shí)所產(chǎn)生的一個(gè)縫隙隔開(kāi)了,而這個(gè)縫隙很長(zhǎng)一段時(shí)間內(nèi)沒(méi)有人關(guān)注過(guò),也沒(méi)有引起相關(guān)重視,所以導(dǎo)致我們的建模技術(shù)很難提升。
建模是一個(gè)過(guò)程,這個(gè)過(guò)程大概是這樣子的,需要我們將真實(shí)的業(yè)務(wù)場(chǎng)景準(zhǔn)確的用某種建模語(yǔ)言表達(dá)出來(lái),換句話說(shuō)用什么建模語(yǔ)言表達(dá)出來(lái)很容易,重點(diǎn)是如何得出這個(gè)模型,而得出這個(gè)模型的過(guò)程就是我們這里所說(shuō)的建??p隙。
圖2:
從“業(yè)務(wù)概念”到“類(lèi)模型”中間夾著一個(gè)“建模過(guò)程”,這個(gè)地方其實(shí)一直以來(lái)就是分析建模的鴻溝,這個(gè)空白的地方一直沒(méi)有成熟的經(jīng)驗(yàn)可以學(xué)習(xí)。在我們對(duì)當(dāng)前分析的業(yè)務(wù)不是很了解的時(shí)候如何正確的建出對(duì)應(yīng)的類(lèi)模型,表層的領(lǐng)域概念我們可以根據(jù)自己的經(jīng)驗(yàn)去夠發(fā)現(xiàn)它,但是這畢竟是無(wú)法傳遞的知識(shí)。很多OOAD的書(shū)籍甚至包括很多軟件工程中的經(jīng)典書(shū)籍都未給出這里的答案,如果用一句準(zhǔn)確的技術(shù)術(shù)語(yǔ)來(lái)形容這個(gè)過(guò)程的話,其實(shí)就是缺少一套建模分析模式,缺少一個(gè)可以讓我們不管針對(duì)什么樣的業(yè)務(wù)進(jìn)行分析時(shí)都是一套不變的指導(dǎo)模式。我想這個(gè)問(wèn)題對(duì)我們建模者來(lái)說(shuō)肯定是共同的問(wèn)題,我們需要解決它。只有這樣我們才不會(huì)遇見(jiàn)自己所不熟悉的業(yè)務(wù)領(lǐng)域時(shí)而束手無(wú)策,當(dāng)然你可以說(shuō)你也一樣可以進(jìn)行OOA,但是你一定會(huì)漏掉什么的,這是分析盲點(diǎn),是沒(méi)有正確指導(dǎo)思想的必然結(jié)果。正如上圖中的”下訂單“和”退貨“兩個(gè)核心的領(lǐng)域模型未能在右邊的”類(lèi)模型“中建模出來(lái),大部分開(kāi)發(fā)人員的通病就是無(wú)法識(shí)別出潛在的領(lǐng)域概念,認(rèn)為”表層“ 的領(lǐng)域概念就是類(lèi)模型中的”實(shí)體“,其實(shí)這樣我們到最后就回到了表驅(qū)動(dòng)的開(kāi)發(fā)過(guò)程當(dāng)中去,因?yàn)槟阒挥型ㄟ^(guò)E-R模型來(lái)思考時(shí)才能發(fā)現(xiàn)這種平面的結(jié)構(gòu),但是這又和正確的軟件開(kāi)發(fā)訪問(wèn)論背道而馳了。
本節(jié)我們將討論一個(gè)分析模式,它存在有一段時(shí)間了,值得我們高興的是它就是專(zhuān)門(mén)用來(lái)解決上述小節(jié)中闡述的“分析”鴻溝的,通過(guò)這套模式我們幾乎可以分析任何一個(gè)業(yè)務(wù)領(lǐng)域,再也不用怕由于自己對(duì)該領(lǐng)域不熟悉而漏掉了重要的領(lǐng)域模型,而導(dǎo)致代碼混亂、難以重構(gòu)的最大問(wèn)題就是丟失重要的領(lǐng)域概念,讓各個(gè)對(duì)象的職責(zé)未能正確的在自己的空間中。
這個(gè)分析模式就是”四色原型“模式,根據(jù)名字我們就可以大概猜出它是基于四個(gè)概念來(lái)分析我們的業(yè)務(wù)概念,下面我們來(lái)了解一下哪四個(gè)概念:
1.實(shí)體:也可以叫做物品,表示一個(gè)參與者,比如:客戶、商品。
2.角色:實(shí)體、時(shí)刻時(shí)段的角色,如:訂單的配送類(lèi)型,用戶的等級(jí)角色。
3.描述:用來(lái)對(duì)實(shí)體、時(shí)刻時(shí)段的公共屬性進(jìn)行描述,比如:客戶實(shí)體的地址描述,這部分信息是可以通用的。
4.時(shí)刻時(shí)段:實(shí)體在某個(gè)時(shí)間段內(nèi)的參與事件,如:訂單,某個(gè)客戶在某個(gè)時(shí)間段內(nèi)購(gòu)買(mǎi)了某個(gè)商品。此概念就是用來(lái)跟蹤實(shí)體發(fā)生的所有需要跟蹤的事件。
當(dāng)我們使用四色原型模式去分析業(yè)務(wù)概念時(shí)就很難丟失領(lǐng)域概念,下面我們依然以上面的業(yè)務(wù)領(lǐng)域?yàn)槔褂盟纳湍J竭M(jìn)行分析。
圖3:
基本上我們可以使用四色原型模式去直接套某個(gè)業(yè)務(wù)領(lǐng)域,我們可以根據(jù)模式的思想來(lái)推斷領(lǐng)域模型是否需要四色中的一種。這樣我們基本上不會(huì)漏掉重要的業(yè)務(wù)概念。通過(guò)將“四色原型”模式與“RUP"制品中的“業(yè)務(wù)詞匯表”、"補(bǔ)充性規(guī)格說(shuō)明“集合可以完成美妙的OOAD敏捷過(guò)程。使用四色原型模式來(lái)驗(yàn)收RUP過(guò)程制品中的業(yè)務(wù)詞匯表,可以判斷出自己是否遺漏了重要的業(yè)務(wù)分支。
可以說(shuō)四色原型模式是通往OOAD之門(mén)的金鑰匙,有了它我才相信我們現(xiàn)在分析的系統(tǒng)是OO的。
模型是讓人去閱讀理解的,上圖中我們很難看出哪個(gè)是”實(shí)體“哪個(gè)是”角色“哪個(gè)是”時(shí)刻時(shí)段“和”描述“,所以大師們借鑒了其他領(lǐng)域的彩色思想來(lái)創(chuàng)建軟件模型,這樣我們就夠能一眼的看出模型的具體意思,帶來(lái)強(qiáng)大的視覺(jué)沖擊力,下節(jié)我們?cè)敿?xì)的來(lái)看看彩色建模。
為了能夠突出模型的視覺(jué)效果,在四色原型上運(yùn)用不同的顏色來(lái)增加模型的視覺(jué)沖擊力。使用彩色模型能夠激發(fā)人類(lèi)天生的視覺(jué)敏感性,讓人一目了然的知道整體的模型是個(gè)什么結(jié)構(gòu)。
圖4:
使用綠色來(lái)表示實(shí)體(參與者),使用***表示角色,使用灰色表示描述,使用桃紅色表示時(shí)刻時(shí)段。當(dāng)然這里的顏色不是很準(zhǔn)確,由于我對(duì)顏色分的不是很清楚,所以未能調(diào)出最合適的顏色,但是差不多也就行了。
這樣當(dāng)我們面對(duì)一個(gè)大型的UML類(lèi)圖模型時(shí)就可以一眼識(shí)別出每個(gè)模型所代表的概念它的職責(zé)也就清晰明了了。
建模時(shí)我們是不需要考慮該模型將要被什么技術(shù)落地,也就是說(shuō)該模型是領(lǐng)域(技術(shù)、工具、平臺(tái))無(wú)關(guān)的,可以使用任何技術(shù)來(lái)實(shí)現(xiàn)它。通過(guò)四色原型模式構(gòu)建出來(lái)的模型圖更具有可塑性,概念非常的清晰,所有的模型都是概念明確的,不存在人為的設(shè)計(jì)在里面,對(duì)于任何一個(gè)建模者來(lái)說(shuō)這是非常寶貴的建模技術(shù)。如果沒(méi)有四色原型模式的背景,每個(gè)建模者都根據(jù)自己的經(jīng)驗(yàn)來(lái)假設(shè)出很多主觀的模型出來(lái),其實(shí)這部分模型是很難讓別人理解的,因?yàn)槊總€(gè)人的理解角度不同,得出的模型自然也就差別很大,所以建模時(shí)使用四色原型模式是一個(gè)比較通用的模式,得出的最后模型也是一個(gè)通用的且團(tuán)隊(duì)交流也是通用的。
技術(shù)無(wú)關(guān)是領(lǐng)域無(wú)關(guān)模型的一個(gè)面,領(lǐng)域無(wú)關(guān)也有另外一層含義,當(dāng)我們有了四色原型模式時(shí)你是否發(fā)現(xiàn)你具有了征服所有業(yè)務(wù)領(lǐng)域的秘訣,就好比E-R模型一樣,一個(gè)可以用無(wú)邊際的抽象的模式,這個(gè)模式由四色基本的原型組成,而這個(gè)四個(gè)原型也是領(lǐng)域無(wú)關(guān)模型。
盡管建模高手會(huì)告訴我們建模時(shí)不要去考慮最后具體用什么技術(shù)去實(shí)現(xiàn)它,其實(shí)跟你說(shuō)這個(gè)話的人要么就是精通某個(gè)技術(shù)的高手,要么就是一個(gè)理論主義者,只知道畫(huà)圖而不知道如何具體落地領(lǐng)域模型的分析員,前者其實(shí)他已經(jīng)做到心中有數(shù)了,為什么這么說(shuō),因?yàn)椴欢夹g(shù)實(shí)現(xiàn)的人來(lái)建模時(shí)是無(wú)法創(chuàng)建出能用的模型的,因?yàn)楦拍町吘故歉拍?,一旦落地到代碼上、架構(gòu)上一切都變了,并不是那么的簡(jiǎn)單直接落地的,需要考慮到讀寫(xiě)、業(yè)務(wù)流、職責(zé)等等問(wèn)題,這里面是有很強(qiáng)的技術(shù)問(wèn)題在里面的。
好了文章到此結(jié)束,希望本文能對(duì)那些對(duì)OOAD、UML、建模有興趣的朋友起到一個(gè)拋磚引玉的作用,對(duì)本文的內(nèi)容想進(jìn)一步學(xué)習(xí)的可以參考《彩色建模》一書(shū),這本書(shū)是OOAD大師[Peter coad]所著,謝謝大家。
作者:王清培
出處:http://wangqingpei557.blog.51cto.com/
本文版權(quán)歸作者和51CTO共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁(yè)面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。