什么是域建模呢?我們?cè)O(shè)計(jì)一個(gè)系統(tǒng),總是希望它能解決一些問(wèn)題,這些問(wèn)題總是映射到現(xiàn)實(shí)問(wèn)題和概念。很明顯我們的系統(tǒng)依賴于這些問(wèn)題,對(duì)這些問(wèn)題進(jìn)行歸納、分析的過(guò)程就是域建模(這個(gè)域,指的就是問(wèn)題域)。
2005-9-15] |
連載:ICONIX 統(tǒng)一建模起步之三 域建模之一 發(fā)現(xiàn)類 歡迎大家回到我的連載,從這一期開始,我們正式進(jìn)入ICONIX的世界。閑話少說(shuō),進(jìn)入正題。 什么是域建模呢?我們?cè)O(shè)計(jì)一個(gè)系統(tǒng),總是希望它能解決一些問(wèn)題,這些問(wèn)題總是映射到現(xiàn)實(shí)問(wèn)題和概念。很明顯我們的系統(tǒng)依賴于這些問(wèn)題,對(duì)這些問(wèn)題進(jìn)行歸納、分析的過(guò)程就是域建模(這個(gè)域,指的就是問(wèn)題域)。 好了,講理論大家要昏昏欲睡,我這個(gè)小小的連載也沒辦法把所有的概念說(shuō)的一清二楚,要是有興趣的話可以打電話跟我暢談(前提是不許打手機(jī)),現(xiàn)在我來(lái)用一個(gè)實(shí)際的例子講述域建模。 用個(gè)比較簡(jiǎn)單的例子吧,本來(lái)昨天我是想用HelloWorld來(lái)的,可是它實(shí)在太簡(jiǎn)單了,不能說(shuō)明問(wèn)題,考慮再三,我使用一個(gè)猜數(shù)游戲來(lái)說(shuō)明問(wèn)題。這個(gè)游戲相信學(xué)過(guò)編程語(yǔ)言的都應(yīng)該很熟悉了:輸入一個(gè)數(shù),如果猜中了顯示“你好棒啊”然后結(jié)束,如果不對(duì),系統(tǒng)告訴你是太大還是太小,然后重新讓你輸入,直到猜中為止。 現(xiàn)在請(qǐng)拿一張白紙,我們開始?xì)w納問(wèn)題。 +--------------------------------------------+ | 系統(tǒng)應(yīng)該準(zhǔn)備一個(gè)正確答案 | | | | 玩家可以輸入一個(gè)答案 | | | | 系統(tǒng)應(yīng)該比較玩家輸入的答案和正確答案 | | | | 系統(tǒng)應(yīng)該顯示玩家每次輸入的結(jié)果 | +--------------------------------------------+ 遺憾我這個(gè)例子還是太過(guò)于簡(jiǎn)單,不過(guò)簡(jiǎn)單也有簡(jiǎn)單的好處,從這個(gè)簡(jiǎn)單的例子可以看出歸納問(wèn)題的基本要點(diǎn)。 第一是不要涉及內(nèi)部的流程,別出現(xiàn)“如果輸入不正確,就怎么怎么樣”的句子,這些并不是正確的問(wèn)題,正確的問(wèn)題必須明確的,清晰的,如果可能的話全部按照“什么可以干什么”的格式來(lái)寫。 第二是不要一開始就進(jìn)入細(xì)節(jié)(抱歉,我這個(gè)例子例外,它實(shí)在是太簡(jiǎn)單了),包涵太多細(xì)節(jié)的問(wèn)題將會(huì)是一個(gè)長(zhǎng)長(zhǎng)的清單,這種清單根本沒什么用。盡量從最高一層分析,但也不要簡(jiǎn)單到“用戶可以玩游戲”這種籠統(tǒng)的問(wèn)題。總之一個(gè)原則是全面、清晰、明確。要做好問(wèn)題域分析完全取決于設(shè)計(jì)師的水平與能力,這就不是可以簡(jiǎn)單的看看書能達(dá)到的了。 好了,現(xiàn)在我們有了一個(gè)系統(tǒng)問(wèn)題域的清單,可以進(jìn)行下一步工作:發(fā)現(xiàn)類。 把問(wèn)題清單中的名詞都提出來(lái),得到一個(gè)名詞列表,這就是類的來(lái)源(不過(guò)不忙,這只是初步過(guò)程) +----------------+ | 系統(tǒng) | | 玩家 | | 正確答案 | | 答案 | | 游戲結(jié)果 | +----------------+ 不是所有的名詞都能作為類的,接下來(lái)需要進(jìn)行篩選。 玩家是參與者,應(yīng)該放到用例圖上去 系統(tǒng)太籠統(tǒng),不能成為一個(gè)對(duì)象的名稱 答案和正確答案容易混淆,但稱為輸入答案又容易被誤解成一個(gè)動(dòng)作,干脆叫做玩家答案 結(jié)果不明確,察看前面的需求,應(yīng)該分解成錯(cuò)誤信息和完成信息 篩選完畢后,得到下面一個(gè)名詞列表: +----------------+ | 正確答案 | | 玩家答案 | | 錯(cuò)誤信息 | | 完成信息 | +----------------+ 這個(gè)列表缺少了系統(tǒng),顯得太單薄,回過(guò)頭再仔細(xì)察看需求,應(yīng)該引入一個(gè)游戲引擎,由它來(lái)充當(dāng)調(diào)度者。 +----------------+ | 游戲引擎 | | 正確答案 | | 玩家答案 | | 錯(cuò)誤信息 | | 完成信息 | +----------------+ 同時(shí)修改前面的問(wèn)題域,現(xiàn)在系統(tǒng)已經(jīng)明確是一個(gè)游戲引擎。這種替換當(dāng)然是一種理想情況,通常都會(huì)發(fā)生分解和關(guān)聯(lián),那時(shí)候需要擴(kuò)充問(wèn)題域,有時(shí)候還需要建立新的問(wèn)題域。 +--------------------------------------------+ | 游戲引擎應(yīng)該準(zhǔn)備一個(gè)正確答案 | | | | 玩家可以輸入一個(gè)答案 | | | | 游戲引擎應(yīng)該比較玩家答案和正確答案 | | | | 游戲引擎應(yīng)該顯示玩家每次輸入的結(jié)果 | +--------------------------------------------+ 現(xiàn)在可以用Rose來(lái)制作Class Diagram了,同時(shí)可以用RAD工具來(lái)搞一個(gè)小小的GUI來(lái)看看效果,發(fā)現(xiàn)類工作到此告一段落。不過(guò)問(wèn)題域分析還沒完,類與類之間的關(guān)系還沒有歸納,當(dāng)然,那是下一段要講的事情了。
|
|