<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    常言笑的家

    Spring, Hibernate, Struts, Ajax, RoR

    模型驅(qū)動(dòng)設(shè)計(jì)(MDD)之靈活設(shè)計(jì)

           靈活設(shè)計(jì)可以使我們隨著項(xiàng)目開發(fā)的進(jìn)行,感到速度越來越快,而不是越來越慢,甚至 停滯不前。靈活設(shè)計(jì)是對(duì)領(lǐng)域建模的補(bǔ)充,當(dāng)我們從領(lǐng)域中抓住那些隱隱約約的線索和概念原型后,就象準(zhǔn)備好原料;下面就是通過迭代將原料錘煉成一定具體的形狀,可以俗稱“打鐵”,那么打鐵打到什么形狀算可以了呢? 也就是最終希望達(dá)到什么樣的設(shè)計(jì)呢?

      有些軟件打著“靈活性”旗號(hào),卻出現(xiàn)很多多余的抽象和間接層次,從而導(dǎo)致了復(fù)雜性,靈活性可能導(dǎo)致復(fù)雜性, 但是靈活性不是導(dǎo)致復(fù)雜性的必然原因,如何將靈活性的發(fā)展通往簡單,其中精湛技巧就需要學(xué)習(xí)和不斷實(shí)踐, 正確的理論指導(dǎo)是必不可少的,模型驅(qū)動(dòng)設(shè)計(jì)(MDD)提供這樣一個(gè)科學(xué)的方法論。

      在Eric Evans的“領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)”一書中專門探討了這樣提供靈活設(shè)計(jì)的模式和方法,下面簡要述說如下:

    明顯意圖的接口

      接口的名稱必須表達(dá)明顯意圖,而不是模棱兩可,接口雖然是抽象,但是也不能抽象到別人不知你所云, 如果其他開發(fā)人員必須查看接口的實(shí)現(xiàn)子類才能搞清楚你這個(gè)接口的意圖,那么你的接口抽象無疑是失敗的,

      使用明顯意圖的接口可以將整個(gè)子領(lǐng)域切分成一個(gè)個(gè)單獨(dú)模塊,每個(gè)模塊使用帶有明顯意圖的接口封裝起來, 這種切割方式用來調(diào)整項(xiàng)目的焦點(diǎn)和對(duì)付大型系統(tǒng)的復(fù)雜性。

      如果僅僅有大型系統(tǒng)開發(fā)經(jīng)驗(yàn),但是沒有大型系統(tǒng)的分割經(jīng)驗(yàn),更重要的是良好設(shè)計(jì)理論基礎(chǔ),那些大型 系統(tǒng)開發(fā)經(jīng)驗(yàn)也只是如過眼煙云,不會(huì)在你的程序生涯中占據(jù)多大的重要位置。

      下面我們聚焦被劃分成單個(gè)模塊的內(nèi)部設(shè)計(jì)模式:

    邊界影響
      在軟件中,操作分為:命令和查詢,命令就是能夠使 系統(tǒng)狀態(tài)發(fā)生改變的操作,如增刪改等操作。這些操作都可能需要有副功能,如希望增刪改完成后還要返回一些結(jié)果,這些主要功能之外的副業(yè),也稱為邊界影響(side effect)。一些傳統(tǒng)過程經(jīng)驗(yàn)的程序員經(jīng)常喜歡搞“一機(jī)多用”,喜歡將很多功能揉合在一起。

      大多數(shù)操作會(huì)調(diào)用其他操作,造成任意深度的嵌套,這樣形成一個(gè)樹形結(jié)構(gòu)的調(diào)用關(guān)系,這就容易使我們很難 預(yù)測(cè)調(diào)用一個(gè)操作會(huì)產(chǎn)生什么樣的結(jié)果,調(diào)用一個(gè)操作變得謹(jǐn)慎,甚至戰(zhàn)戰(zhàn)兢兢,雖然Ioc或DI container使 得這種嵌套關(guān)系的管理變得容易,但是不能保證每個(gè)操作本身的設(shè)計(jì)能降低復(fù)雜性,后者就是我們現(xiàn)在關(guān)注的。

      為什么我們調(diào)用一個(gè)操作時(shí)會(huì)變得小心,因?yàn)檫@個(gè)操作設(shè)計(jì)時(shí)可能不執(zhí)行主要功能,還有其他副功能,這些 副功能可以認(rèn)為是一種多余副作用,解決辦法很簡單:設(shè)計(jì)這個(gè)操作時(shí)消滅副作用;如果不能消滅,就將其 分離顯式分離并單獨(dú)表達(dá)出來。

      所以,我們?cè)O(shè)計(jì)增刪改命令和查詢功能時(shí),盡可能分離它們到不同操作中實(shí)現(xiàn),不要在增刪改命令執(zhí)行的同時(shí) 返回任何領(lǐng)域數(shù)據(jù)。

      如果邊界影響不能通過設(shè)計(jì)避免,那么我們就直面它,在增刪改等命令執(zhí)行同時(shí)返回?cái)?shù)據(jù),當(dāng)這樣做的同時(shí), 我們就使用斷言assertion來約束我們這樣的設(shè)計(jì),通過斷言能夠易于使用單元測(cè)試Junit等工具測(cè)試。從而 保證你的命令簡單有規(guī)則。

      總之還是那句有些哲學(xué)意義的話:對(duì)于邊界功能,首先要去除它,如果不能回避它,就承認(rèn)它,但是同時(shí)會(huì)約束它。

      邊界影響主要的是Service接口怎么做的問題。在實(shí)際項(xiàng)目中,Model和Service是相互結(jié)合不斷重構(gòu)的。那么Model和Service粒度是如何界定的?

    粒度界定

      對(duì)象的粒度到底是多大?這沒有一個(gè)統(tǒng)一的規(guī)律,哪些屬性或行為屬于A對(duì)象,哪些屬于B對(duì)象,有時(shí)又需要將這些屬性和行為分離以便能夠靈活組合。我們一般很難確定類的粒度到底是怎樣規(guī)模表示達(dá)到設(shè)計(jì)目的?

      首先,粒度不能太大,造成重復(fù)和冗余,很多概念混在一起;當(dāng)然粒度也不能太細(xì),以至于太碎,不能完整表達(dá)一個(gè)領(lǐng)域概念,例如半個(gè)鈾原子就不再是鈾。

      類需要盡量準(zhǔn)確表達(dá)領(lǐng)域概念,大多數(shù)領(lǐng)域中都包含某種邏輯上的一致性,而很多程序員有時(shí)只注意單純的設(shè)計(jì)原則,忽視領(lǐng)域邏輯,設(shè)計(jì)思考時(shí)需要兩條腿走路,實(shí)現(xiàn)平衡,比如Jdonwork的緩存設(shè)計(jì)主要應(yīng)對(duì)企業(yè)領(lǐng)域大量查詢都是在時(shí)間上相對(duì)集中的查詢(如本月度),因?yàn)轭I(lǐng)域中某種邏輯存在(時(shí)間上相對(duì)集中的查詢),才使得我們決定采取某種設(shè)計(jì)方案,如果沒有這個(gè)前提,任何設(shè)計(jì)方案都是可行的,這也是我們通常討論的業(yè)務(wù)場(chǎng)景。

      每個(gè)人對(duì)業(yè)務(wù)領(lǐng)域中很多概念都可能不一致,但不能否認(rèn):領(lǐng)域中一定在某個(gè)地方存在一種旋律,我們的模型肯定能夠與領(lǐng)域某個(gè)部分發(fā)生共振,問題關(guān)鍵是:我們需要通過不斷發(fā)現(xiàn)的過程來尋找這種共振,這過程就依賴反復(fù)的重構(gòu)重整refactoring。

      通過重構(gòu),使我們的設(shè)計(jì)適應(yīng)我們重新理解了的領(lǐng)域概念和業(yè)務(wù)需求,概念輪廓(Conceptual Contour)就會(huì)浮現(xiàn)。

      注意“概念輪廓”是指對(duì)領(lǐng)域中概念的主要輪廓,大概樣子,需要忽視不重要的細(xì)節(jié),設(shè)計(jì)人員必須理解領(lǐng)域中概念在哪些地方會(huì)發(fā)生改變?哪些地方保持相對(duì)穩(wěn)定,然后使設(shè)計(jì)的模型盡量與領(lǐng)域中概念穩(wěn)定面結(jié)合起來,這樣,當(dāng)業(yè)務(wù)領(lǐng)域中概念發(fā)生變化時(shí),我們的模型才會(huì)隨之一起翩翩起舞,發(fā)生共振,從而達(dá)到模型設(shè)計(jì)反應(yīng)領(lǐng)域本質(zhì)的目的。

      所以,類的粒度是要能夠反應(yīng)領(lǐng)域的概念輪廓,將能夠反應(yīng)概念輪廓的那些重要元素聚合到當(dāng)前正在設(shè)計(jì)的類中,這也是設(shè)計(jì)中高聚合原則的體現(xiàn)。

      高聚合、低關(guān)聯(lián)是兩個(gè)設(shè)計(jì)基本原則,上面我們談了如何做到高聚合,實(shí)際上,也是反映一種類或模塊的粒度設(shè)計(jì)規(guī)模。下面談?wù)劦完P(guān)聯(lián):

    消滅依賴

      復(fù)雜的依賴關(guān)系無疑提高了系統(tǒng)的復(fù)雜性,加劇我們大腦負(fù)載,所以,我們的模型之間關(guān)系必須精練,減少依賴,最后保留下來的依賴代表了領(lǐng)域概念之間某種根本的關(guān)系。有的系統(tǒng)中,甚至是0關(guān)聯(lián),從而得到一個(gè)個(gè)被完全孤立的單獨(dú)的類(standalone Class),這才是方向(也有利于我們簡化配置Hibernate這些模型持久化框架,無需考慮一對(duì)多等關(guān)聯(lián)配置)。

      每個(gè)依賴都是值得懷疑的,這是我們思考的前提,重構(gòu)時(shí),一個(gè)個(gè)去消滅那些象蜘蛛網(wǎng)一樣密集的關(guān)系,斬?cái)嗨鼈儯完P(guān)聯(lián)時(shí)減輕概念過載問題的基本方法,孤立類是低關(guān)聯(lián)達(dá)到極致的一種標(biāo)志。

      減少依賴不是意味不考慮業(yè)務(wù)領(lǐng)域場(chǎng)景概念,武斷實(shí)現(xiàn),依賴和之前描述的邊界影響一樣,有時(shí)確實(shí)不能消滅,那么我們就承認(rèn)它,但是會(huì)又有一套設(shè)計(jì)原則來約束它。

     

    相關(guān):

    領(lǐng)域模型驅(qū)動(dòng)設(shè)計(jì)(DDD)之模型提煉

    面向?qū)ο蠓治鰧?shí)踐過程是什么?

    實(shí)戰(zhàn)DDD(Domain-Driven Design領(lǐng)域驅(qū)動(dòng)設(shè)計(jì))

    posted on 2006-12-16 22:19 常言笑 閱讀(246) 評(píng)論(0)  編輯  收藏 所屬分類: 技術(shù)總結(jié)

    My Links

    Blog Stats

    常用鏈接

    留言簿(5)

    隨筆分類

    隨筆檔案

    搜索

    積分與排名

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 亚欧日韩毛片在线看免费网站| 亚洲精品一卡2卡3卡三卡四卡| 亚洲va在线va天堂成人| 黄色视频在线免费观看| 免费在线观看黄网站| 久久国产美女免费观看精品 | gogo全球高清大胆亚洲| 亚洲日韩国产AV无码无码精品| 久久久久久夜精品精品免费啦| 亚洲一级黄色视频| 四虎国产成人永久精品免费| 亚洲色大成网站www| 亚洲性猛交XXXX| 成年女人色毛片免费看| 成人无码区免费A∨直播| 久久久久久A亚洲欧洲AV冫| 国产91免费视频| caoporn成人免费公开| 亚洲一区无码中文字幕乱码| 亚洲女同成人AⅤ人片在线观看| 免费又黄又爽又猛大片午夜| 免费无码中文字幕A级毛片| 亚洲暴爽av人人爽日日碰| 日本免费中文字幕在线看| 成全高清在线观看免费| 亚洲第一精品福利| 免费一级一片一毛片| 成人免费视频69| 国产成人无码区免费内射一片色欲| 久久亚洲精品成人综合| 免费大黄网站在线看| 中文字幕手机在线免费看电影 | 亚洲福利电影在线观看| jizzjizz亚洲| 欧洲精品成人免费视频在线观看| 国产 亚洲 中文在线 字幕| 亚洲成色在线综合网站| 亚洲精品和日本精品| 日韩一区二区三区免费体验| 99久久久国产精品免费牛牛四川| 日本亚洲免费无线码|