AntSoul

          它總是在行走,行走,永遠(yuǎn)的行走…… 行走是它生存的恒久姿態(tài)和最佳造型。 它似乎有一雙不知疲倦的腳。 ———我說的是螞蟻。

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            42 隨筆 :: 0 文章 :: 1 評論 :: 0 Trackbacks
          致面向?qū)ο蠹夹g(shù)初學(xué)者的一封公開信
          Alistair Cockburn 著(1996 年2 月),袁峰 譯

          介紹?
          ?首先我要解釋一下為什么會寫這封公開信。這似乎已經(jīng)成了一種習(xí)慣,但這個步驟還是需要的。過去6 年中, 我曾經(jīng)無數(shù)次地在飯店、酒吧、旅店大廳等各種地方以同一種方式度過愉快而漫長的夜晚:和同樣追求真理、光明和智慧的伙伴一起探討面向?qū)ο蟮恼嬷B。現(xiàn)在,我已經(jīng)可以回答很多當(dāng)年我遇到的問題。這些同樣的問題也在困擾著我的一位新同事,在一家飯店里,我花了整整一個晚上和他討論這些問題。結(jié)果第二天,他的同事又來問這些問題,并建議把我們的談話內(nèi)容記錄下來,這樣他可以拿去給他的同事看。考慮到還有很多和他的同事一樣詢問這些同樣問題的人,我決定寫下這篇文章。
          主要的問題是:
          z 為什么只要稍有一點不是嚴(yán)格或純面向?qū)ο蟮淖龇ā⒄f法,OO 專家就大驚小怪的?use case 并不是面向?qū)ο蟮模瑸槭裁催€這么流行?而且,OO 建模似乎和數(shù)據(jù)建模非常相似?
          z 數(shù)據(jù)建模(data model)得到的模型和對象模型的結(jié)構(gòu)部分會不會很像?流程建模(process model)和對象模型的行為部分呢?
          z 業(yè)務(wù)結(jié)構(gòu)建模中為什么要用use case 和場景(scenario)?
          OO 的新手們反復(fù)問這些問題,但實際上,只有在日常工作中堅持應(yīng)用面向?qū)ο蟮乃季S進(jìn)行工作,積累一定的經(jīng)驗,才能得到滿意的答案。為什么只要稍有一點不是嚴(yán)格或純面向?qū)ο蟮淖龇ā⒄f法,OO 專家就大驚小怪的?use case 并不是面向?qū)ο蟮模瑸槭裁催€這么流行?而且,OO 建模似乎和數(shù)據(jù)建模非常相似?
          我想分三步來回答這個問題。

          首先,我舉我和Bob(著名的OO 專家)一起工作的例子, 當(dāng)我們討論OO 的時候,彼此都有一個共識,知道對方擁有面向?qū)ο蠊ぷ鞯呢S富經(jīng)驗并且是這項技術(shù)的堅定支持者。而且,對諸如對象識別(object identity)、多態(tài)、數(shù)據(jù)和行為的封裝、實例職責(zé)、繼承等對象技術(shù)都是手到擒來。因此,當(dāng)我說:“明天對程序表單進(jìn)行數(shù)據(jù)建模吧”,Bob 不會產(chǎn)生我要會因為關(guān)系表而放棄對象這樣的誤解,他知道我指的是在對象模型中體現(xiàn)出來的結(jié)構(gòu)化特性進(jìn)行建模。他知道我會說些什么,因此我使用或誤用這些術(shù)語不會造成什么誤解。但作為一個對象技術(shù)的初學(xué)者,如果Bob 發(fā)現(xiàn)你把數(shù)據(jù)和行為完全分離開了, 并且沒有使用( 或者說忽視了)對象識別或者多態(tài)等技術(shù), 這時候, 如果你說“ 數(shù)據(jù)建模”,Bob 會像一堵墻一樣逼近你,直到你明白該怎樣改變。這樣工作幾個月,你會發(fā)現(xiàn),你的模型(以及建模)中漸漸有了對象識別、多態(tài)、數(shù)據(jù)和行為的綁定,這時候再用“ 數(shù)據(jù)建模”這個詞就不是那么危險了, 但Bob 還可能會擔(dān)心你走回到老路上。換句話說, 他對你還不夠信任, 因此,你不得不很小心地使用這些術(shù)語。
          就算一個對象模型可以分為“結(jié)構(gòu)”和“行為”特性,我們也不會使用“對象建模”和“流程建模” 這種術(shù)語,以免引起混淆。事實上,為對象模型的“結(jié)構(gòu)”特性建模可以看成是數(shù)據(jù)建模的特殊形式,只不過建模的對象不再是表,而是需要捕獲的信息的結(jié)構(gòu)。我們將它稱為“ 概念數(shù)據(jù)模型”,而不是邏輯數(shù)據(jù)模型或物理數(shù)據(jù)模型。第二步,讓我們考慮兩個OO 使用者一起討論的情況。如果其中一個家伙說到“流程建模”這樣的詞,肯定會讓他的拍檔琢磨半天:這家伙是說用標(biāo)準(zhǔn)數(shù)據(jù)流圖作流程建模嗎?如果這樣的話,以后OO 實現(xiàn)的時候不是相當(dāng)麻煩了嗎?他是不是指模型的行為特性?是不是說在一個對象內(nèi)部對流程進(jìn)行建模?(如果這樣的話,那會很有意思,因為很少有人這么做的。) 通過這個例子我們可以看到,這種談話中使用“ 流程建模” 這種意圖不明的詞實在是太危險了,很容易就將交流變得非常困難。
          最后來說use case 和場景的問題,它們都是獲取需求的主要手段,和實現(xiàn)技術(shù)無關(guān)。其好處是可以為設(shè)計時的討論提供內(nèi)容和范圍。它們不是“面向?qū)ο蟆钡模@是事實,它們類似于功能分解,這也是事實,而且這一點嚇壞了很多人,但這些都無所謂。重要的是它們?yōu)樵O(shè)計提供了內(nèi)容,在用來描述內(nèi)部設(shè)計時,它們表現(xiàn)了系統(tǒng)的行為。Flow chart 、交互圖、Petri 網(wǎng)、數(shù)據(jù)流圖、use case 都可以用來描述系統(tǒng)的行為特性, 但各自用途不同,各有優(yōu)劣。關(guān)鍵是要知道:對象不僅有數(shù)據(jù),也有行為, 認(rèn)識到這一點, 就可以大膽地去考慮怎樣可以更好地捕捉、描述對象內(nèi)部和對象之間的行為。
          數(shù)據(jù)建模(data model )得到的模型和對象模型的結(jié)構(gòu)部分會不會很像?流程建模(process model) 和對象模型的行為部分呢?根據(jù)我的經(jīng)驗,數(shù)據(jù)建模人員可以分為兩種-一種是為存儲的數(shù)據(jù)建模,而另一種是為系統(tǒng)或組織中的信息建模。這兩者截然不同。前者討論和思考所用的概念通常都很具體,比如說數(shù)據(jù)表。他們的模型和OO 建模者的模型大相徑庭,而且他們并不愿意看到這些技術(shù)之間的相似性。在數(shù)據(jù)建模社區(qū)中,只有討論邏輯數(shù)據(jù)模型或物理數(shù)據(jù)模型才不會受到攻擊后者得到的是概念數(shù)據(jù)模型。根據(jù)我的經(jīng)驗,他們得到的模型和那些有經(jīng)驗的OO 建模者得到的模型非常相似。他們的工作更加類似于業(yè)務(wù)人員,而不是邏輯數(shù)據(jù)建模人員,這種說法可能會有助于理解概念數(shù)據(jù)模型和邏輯數(shù)據(jù)模型的區(qū)別。
          似乎有一套學(xué)問可以幫助人們比OO 建模人員更快地得到結(jié)果。我多次發(fā)現(xiàn)這樣的事實:OO 建模人員花了三四次迭代才得到的模型,實際上和(概念)數(shù)據(jù)建模人員一個循環(huán)得到的模型是一樣的。這個發(fā)現(xiàn)使我對數(shù)據(jù)建模人員充滿了敬佩。事實上,在進(jìn)行對象設(shè)計的時候,我有時就直接去把數(shù)據(jù)建模人員的產(chǎn)品拷貝過來看看, 從中來看我最后得到的模型大概會是什么樣的。
          我曾經(jīng)召開過數(shù)據(jù)建模人員和對象建模人員之間的會議。采取的方法是“ 一個聽眾的CRC 會議(CRC sessions for an audience)。四個經(jīng)驗豐富的OO 設(shè)計師坐在長桌一端,業(yè)務(wù)專家沿著長桌坐下,他們負(fù)責(zé)回答問題并糾正對業(yè)務(wù)的誤解。接著是數(shù)據(jù)建模人員,長桌的另一頭是其它有關(guān)人員。總的來說,屋里大概是十幾個人,但談話主要是在四個OO 設(shè)計師之間進(jìn)行。
          討論大概一個小時之后,OO 設(shè)計師可以得到對象設(shè)計的一部分。這時候,咨詢數(shù)據(jù)建模人員,這個模型和他們已經(jīng)得到的模型本質(zhì)上是不是一樣的。他們說,“是的”,重復(fù)這個過程兩次以上,每次都詢問數(shù)據(jù)建模人員同樣的問題,除了使用的符號技術(shù)是不同的,例如:他們沒有用繼承,但在同樣的地方有同樣的占位符,在本質(zhì)上,這個模型和他們的模型沒有什么不同的。接著,我們分成幾個小組,每個小組包括一個業(yè)務(wù)專家、一個數(shù)據(jù)建模專家和一個OO 專家,很快就剩下的設(shè)計達(dá)成一致,找出技術(shù)上一些小的不同之處,并且進(jìn)行排序。一般情況都是這樣的:要么數(shù)據(jù)建模人員考慮得更加合理,要么OO 建模人員考慮得更加合理,小組要做的是在他們的設(shè)計之間進(jìn)行協(xié)調(diào)。
          從上面的這些經(jīng)驗可以看到,使用CRC 進(jìn)行OO 建模得到的模型和概念數(shù)據(jù)建模得到的結(jié)果非常相似。另外,根據(jù)經(jīng)驗,基于邏輯(存儲的信息)的關(guān)系建模和OO 建模是不同的。大多數(shù)情況下,區(qū)別是由于技術(shù)的不同導(dǎo)致的,例如,在OO 模型中可以自由地使用繼承和多對多的關(guān)系。由于技術(shù)上的差異,兩種建模人員之間不能很好地交流,這是最大的困難。
          數(shù)據(jù)建模部分的問題就說這么多吧。
          posted on 2007-03-17 12:01 yok 閱讀(215) 評論(0)  編輯  收藏 所屬分類: CoreJava
          主站蜘蛛池模板: 游戏| 常州市| 呼伦贝尔市| 蒙阴县| 平武县| 孙吴县| 大同市| 东方市| 鸡泽县| 海伦市| 金门县| 德清县| 龙南县| 拉萨市| 门源| 靖边县| 通榆县| 尉氏县| 峨眉山市| 永平县| 文昌市| 乐安县| 牙克石市| 邹平县| 义乌市| 晋州市| 筠连县| 乌拉特后旗| 台东市| 海丰县| 盐城市| 九龙城区| 清新县| 且末县| 文登市| 兴业县| 思茅市| 元氏县| 阿巴嘎旗| 饶河县| 广丰县|