在軟件構(gòu)造過程中,會(huì)用到兩種模型:系統(tǒng)分析模型和系統(tǒng)設(shè)計(jì)模型。
系統(tǒng)分析模型
系統(tǒng)分析模型又稱為問題空間模型,它根據(jù)實(shí)物——即準(zhǔn)備實(shí)現(xiàn)的系統(tǒng)參照物——展開工作。系統(tǒng)分析首先考察實(shí)物的結(jié)構(gòu)和組織,然后考察系統(tǒng)行為、方法,對(duì)系
統(tǒng)進(jìn)行逐步分解并對(duì)分解出來(lái)的組成部分進(jìn)行研究,理解其內(nèi)容、形式、組織方式、行為規(guī)則等,在這個(gè)過程中積累知識(shí),形成系統(tǒng)分析模型。
系統(tǒng)分析從系統(tǒng)的整體和高級(jí)知識(shí)入手,經(jīng)過行為、方法的分析到達(dá)系統(tǒng)的底層,即數(shù)據(jù)層次。這個(gè)過程是一個(gè)思維發(fā)散的過程。系統(tǒng)分析要求建模人員盡量多的考慮系統(tǒng)中的各種因素,舉一反三,只要合理的東西都應(yīng)該在模型中體現(xiàn)。
一般來(lái)說,系統(tǒng)分析進(jìn)行到數(shù)據(jù)層次,即行為、方法的分析完成之后,其模型就可以做為系統(tǒng)設(shè)計(jì)的輸入,開始系統(tǒng)設(shè)計(jì)了。但這個(gè)時(shí)候系統(tǒng)分析做為一個(gè)建模過程
并未停止,對(duì)數(shù)據(jù)層次的建模和系統(tǒng)設(shè)計(jì)重合,這也就是我們平時(shí)所說的(面向?qū)ο蟮模┫到y(tǒng)分析和系統(tǒng)設(shè)計(jì)沒有明顯的界限。實(shí)際上在這里,在數(shù)據(jù)建模的層次,
系統(tǒng)分析和系統(tǒng)設(shè)計(jì)是重合的。
系統(tǒng)設(shè)計(jì)模型
系統(tǒng)設(shè)計(jì)模型也叫做解決方案模型,它的構(gòu)造是針對(duì)并不存在的目標(biāo)系統(tǒng)進(jìn)行的。根據(jù)系統(tǒng)分析的饋入,系統(tǒng)設(shè)計(jì)和系統(tǒng)分析一起針對(duì)系統(tǒng)的數(shù)據(jù)層次進(jìn)行建模。對(duì)
系統(tǒng)的數(shù)據(jù)建模,導(dǎo)致基本的實(shí)體對(duì)象模型產(chǎn)生。在這個(gè)基礎(chǔ)上,系統(tǒng)設(shè)計(jì)針對(duì)系統(tǒng)的行為和方法進(jìn)行建模。在系統(tǒng)行為建模完成后,再對(duì)系統(tǒng)的結(jié)構(gòu)和組織進(jìn)行建
模。可以看到,系統(tǒng)設(shè)計(jì)建模過程是從系統(tǒng)的較低層次走向系統(tǒng)的高級(jí)層次,最終形成系統(tǒng)設(shè)計(jì)模型。
系統(tǒng)設(shè)計(jì)建模過程是一個(gè)思維收斂的過程。根據(jù)系統(tǒng)分析的結(jié)果,系統(tǒng)設(shè)計(jì)人員對(duì)多個(gè)可選的方案進(jìn)行取舍,選擇合適的方案實(shí)現(xiàn)。如果說系統(tǒng)分析是一顆逐漸長(zhǎng)大的樹,則系統(tǒng)設(shè)計(jì)是對(duì)樹的修正,使其成為一個(gè)最低成本的實(shí)現(xiàn)模型。
我們?cè)谲浖?gòu)造過程中使用的模型是系統(tǒng)分析模型和系統(tǒng)設(shè)計(jì)模型的集合,稱為表示模型。
在
《小議模型》一文中我已經(jīng)提到,現(xiàn)今國(guó)內(nèi)軟件開發(fā)過程中產(chǎn)生的模型是不完整、不準(zhǔn)確的。這也體現(xiàn)在:表示模型并不是由完整的系統(tǒng)分析模型和系統(tǒng)設(shè)計(jì)模型組成,通常由于種種原因,系統(tǒng)分析模型存在比較大的問題。
一般來(lái)說,一個(gè)比較好的表示模型應(yīng)該由相對(duì)平衡的系統(tǒng)分析模型、系統(tǒng)設(shè)計(jì)模型組成。系統(tǒng)分析模型中的某個(gè)部分,一定在系統(tǒng)設(shè)計(jì)模型中有一個(gè)對(duì)應(yīng)的部分,它
們共同描述同一組件(集)。這兩個(gè)部分是一致的,區(qū)別是一個(gè)由分析過程生成,一個(gè)由設(shè)計(jì)過程生成。對(duì)于這點(diǎn),最普遍的一個(gè)誤解就是:我這邊已經(jīng)有了,為什
么那邊還要有一套?
這個(gè)問題的答案很簡(jiǎn)單。在
《小議模型》中,我們已經(jīng)解釋了
語(yǔ)義間隙這
個(gè)概念,現(xiàn)在來(lái)看系統(tǒng)構(gòu)造過程中的語(yǔ)義間隙。從大的方面來(lái)講,系統(tǒng)是這樣產(chǎn)生的:實(shí)物->分析模型->設(shè)計(jì)模型->實(shí)現(xiàn)的系統(tǒng)。這中間
基本上都存在語(yǔ)義間隙,尤其以實(shí)物到分析模型之間的間隙為最。試想,如果沒有分析模型,沒有分析模型中這看上去似乎多余的東西,這中間的語(yǔ)義間隙會(huì)有多
大?這不是猜想,這是曾經(jīng)發(fā)生的事實(shí),這是經(jīng)驗(yàn)教訓(xùn)。
那么對(duì)于規(guī)模較小的系統(tǒng),又是怎么樣呢?和大規(guī)模的系統(tǒng)是一樣的。小系統(tǒng)就沒有語(yǔ)義間隙嗎?大小只是規(guī)模不同而已,實(shí)質(zhì)是一樣的。所謂麻雀雖小,五臟俱全。
模型粒度
最后來(lái)談?wù)勀P土6鹊膯栴}。簡(jiǎn)單的說,就是模型到底要做到多細(xì)?模型最基本的要求就是要準(zhǔn)確、易理解。對(duì)于一個(gè)過粗的模型,其準(zhǔn)確性可能存在問題;對(duì)于一個(gè)過細(xì)的模型,其理解上可能又存在困難。而不粗不細(xì),折中考慮,平衡點(diǎn)又在哪里呢?
其實(shí)就系統(tǒng)分析模型來(lái)講,主要就是要縮小其與實(shí)物之間,與設(shè)計(jì)模型之間的語(yǔ)義間隙。面對(duì)實(shí)物,要求模型表達(dá)準(zhǔn)確;面對(duì)設(shè)計(jì)模型,要求表達(dá)清晰。這個(gè)基本上
靠個(gè)人水平了。我的方式是保證準(zhǔn)確性,在這個(gè)前提下,用多幾個(gè)“包”來(lái)分解,這樣也基本上可以做到“清晰”。這個(gè)包,當(dāng)然不是將來(lái)要設(shè)計(jì)實(shí)現(xiàn)的東西,僅起
到輔助表達(dá)的作用。
而對(duì)于設(shè)計(jì)模型來(lái)說,一個(gè)非常詳細(xì)的設(shè)計(jì)模型可以直接生成代碼,這就大大縮小了設(shè)計(jì)和實(shí)現(xiàn)之間的語(yǔ)義間隙。但畢竟設(shè)計(jì)不等于實(shí)現(xiàn),一個(gè)精細(xì)的算法還是要靠
編碼人員完成,這就不得不考慮設(shè)計(jì)模型的易理解性。這里我的建議是:設(shè)計(jì)模型可以做的比較細(xì),但模型在表達(dá)上要盡量考慮易理解性。舉例來(lái)說:一個(gè)EJB可
以在設(shè)計(jì)模型中對(duì)應(yīng)到四個(gè)接口和一個(gè)實(shí)現(xiàn)類,但是在類圖中,我們完全可以只畫出實(shí)現(xiàn)類,使用stereotype標(biāo)示其為EJB。這樣即可以生成代碼,又
不妨害理解。
后記:這篇隨筆來(lái)自于我最近做的一次培訓(xùn),刪掉了其中關(guān)于“系統(tǒng)知識(shí)層次模型”的部分。原因是該模型存在問題,反而可能造成理解上的偏差。如果大家對(duì)此感
興趣,或者有什么其他問題,可以討論一下。如果可能(我自己也不是很確定),還會(huì)有下一篇,或許應(yīng)該叫《又議模型》吧。^_^