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

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

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

    走在架構(gòu)師的大道上 Jack.Wang's home

    Java, C++, linux c, C#.net 技術(shù),軟件架構(gòu),領(lǐng)域建模,IT 項目管理 Dict.CN 在線詞典, 英語學(xué)習(xí), 在線翻譯

    BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
      195 Posts :: 3 Stories :: 728 Comments :: 0 Trackbacks

    原書共390頁,不過本書已經(jīng)有精簡版下載:http://www.infoq.com/cn/minibooks/domain-driven-design-quickly

    Eric Evans所著的《領(lǐng)域驅(qū)動設(shè)計》(Domain-Driven Design:通常簡稱為“DDD”)一書可以說是經(jīng)典中的經(jīng)典,雖然“領(lǐng)域”的概念早就存在,但是直到這本書的出現(xiàn),才讓人們真正開始認(rèn)真審視軟件的構(gòu)建,相信你看了這本書后會真正體會領(lǐng)域的力量,也正是這個力量決定了軟件最終的價值。

    領(lǐng)域的含義:

    簡單的說,每個軟件程序都會與其用戶的活動或興趣相關(guān),其中使用程序的主要環(huán)境稱為軟件的“領(lǐng)域”。

    領(lǐng)域中形形色色的業(yè)務(wù)邏輯構(gòu)成了軟件豐富多采的行為。舉例來說,銀行財務(wù)系統(tǒng)中,領(lǐng)域邏輯就包括了諸如開戶,轉(zhuǎn)帳等等操作。可能你會說,PHP程序員很少會接觸銀行系統(tǒng),這樣的例子不夠淺顯,那我舉一個更常見的例子,大凡程序員應(yīng)該都接觸過文章管理系統(tǒng),它里面的置頂,加精等操作就是領(lǐng)域邏輯。這樣看來,似乎用例對應(yīng)的動作都是領(lǐng)域邏輯了,但是答案是否定了,比如說,文章管理系統(tǒng)中保存文章往往就不是領(lǐng)域邏輯,因為它只是一個和持久化相關(guān)的動作而已,是純粹的技術(shù)實現(xiàn),但是銀行財務(wù)系統(tǒng)中的保存現(xiàn)金通常卻被劃為領(lǐng)域邏輯,因為它就是我們常說的存款,有明確的業(yè)務(wù)含義。看到這,似乎大家又有些Faint了,這里給出一個判斷是否是領(lǐng)域邏輯的原則:就是這個邏輯動作是否有明確的業(yè)務(wù)上的含義,或者說是否是業(yè)務(wù)相關(guān)的,而不僅僅是技術(shù)相關(guān)的。

    只有將技術(shù)實現(xiàn)手段從領(lǐng)域問題中剝離才能保證領(lǐng)域本身的精煉,保證程序員可以把精力集中到領(lǐng)域問題本身上來,而不會滿腦子都是技術(shù)實現(xiàn)手段。

    領(lǐng)域的組成:

    按照Eric的表述,通常將領(lǐng)域中的組成角色分為以下五種:

    實體(Entity):擁有唯一標(biāo)識的對象。
    值對象(Value Object):沒有唯一標(biāo)識的對象。
    工廠(Factory):定義創(chuàng)建實體的方法。
    倉儲(Repository):管理實體的集合并封裝其持久化過程。
    服務(wù)(Service):實現(xiàn)不能指派或封裝在一個單一對象上的操作。

    領(lǐng)域的思考:

    下面針對上面介紹的五種領(lǐng)域角色來逐一討論。

    實體的概念是比較好理解的,這樣的例子很多,比如說每一個人都可以看作是一個“與眾不同”的實體,我之所以用與眾不同這個詞是為了強調(diào)實體必須是能夠唯一標(biāo)識出來的,即便是在我們看作長得一模一樣的雙胞胎,他們也是能更根據(jù)一些標(biāo)識來區(qū)分開,比如指紋,可能你會抬杠,要是沒有手的殘疾人怎么辦?那樣我們還可以使用DNA檢測,當(dāng)然,這些都是笑談了,實際編程的時候,一般是使用一個自增數(shù)來作為標(biāo)識,比如在MySQL數(shù)據(jù)庫中保存實體的時候可以使用anto_increment屬性的自增字段。需要注意的是如果想判斷兩個實體是否相等,不能根據(jù)實體的屬性來判斷,必須絕對依賴實體的標(biāo)識,十年前的你和現(xiàn)在的你雖然在身高,體重,年齡等眾多重要的屬性中多或多或少的發(fā)生了變化,但你還是你,因為你的DNA不會因為這些屬性的變化而變化。這些理解起來似乎有些哲學(xué)的味道了。

    值對象的含義,老實說相對實體來說比較模糊,很多人喜歡把數(shù)據(jù)傳輸對象也稱為值對象(數(shù)據(jù)傳輸對象和我們這里說的值對象是有差別的)讓人們對值對象的理解產(chǎn)生過很多歧義,而且值對象的例子不如實體那么直接。從字面上來理解,值對象沒有唯一標(biāo)識,大多數(shù)情況下,值對象是不變的,所以系統(tǒng)不用實時的跟蹤他們,用的時候就實例化一個,不用的時候就銷毀,但是,什么時候使用值對象?把哪些屬性劃為值對象?值對象的作用是什么?這些都是值得考慮的問題。通常來說,當(dāng)我們進(jìn)行領(lǐng)域建模的時候,優(yōu)先把唯一標(biāo)識和經(jīng)常用來檢索對象的信息作為實體的屬性,而其他信息根據(jù)相關(guān)性或者劃分到其他實體中,或者劃分為值對象,舉例來說:一個CMS系統(tǒng)中,對于文章實體而言,文章編號,文章標(biāo)題等都應(yīng)該作為文章實體的屬性存在,而對于文章有效性期限的開始時間,結(jié)束時間兩個信息則應(yīng)該被放在一個獨立的值對象中,這其中,只有開始時間或結(jié)束時間,或者開始時間和結(jié)束時間同時都存在或不存在,會代表不同的邏輯意義,合理使用值對象,既有利于屏蔽一些相關(guān)邏輯的復(fù)雜性,也可以保持實體對象的簡潔。

    工廠相對與前兩者會好理解的多,畢竟從名字上就能體現(xiàn)出它的職責(zé),那就是創(chuàng)建對象。既然是創(chuàng)建對象,那我們直接實例化一個不行么?簡單的情況是可以的,但是工廠往往會帶來巨大的好處,簡單的說就是屏蔽了創(chuàng)建對象的復(fù)雜性。領(lǐng)域創(chuàng)建對象強調(diào)的關(guān)聯(lián),一組相關(guān)的對象應(yīng)該被看作一個整體,對于其中任何對象的訪問也應(yīng)該從這個整體的“根”開始(通常整體中最重要的實體作為根),所以復(fù)雜的關(guān)聯(lián)必然會使創(chuàng)建過程同樣復(fù)雜起來,那我們可不可以在“根”實體的構(gòu)造函數(shù)中完成對象的組裝呢,簡單的情況可以,復(fù)雜的不合適,比如說組裝汽車,通常是在工廠里由組裝工人和機(jī)器人來操作完成,如果我們在“根”的構(gòu)造函數(shù)里完成組裝,無異與在汽車?yán)锱鋫淞私M裝工人和機(jī)器人,這當(dāng)然是不必要的,汽車一旦組裝出廠,就不需要組裝工人和機(jī)器人了,此時再附帶他們是一種累贅。

    倉儲的概念和一些人常說的數(shù)據(jù)訪問對象(DAO)有些類似,但是并不等同,二者一個很大的不同是倉儲有“根”的概念,而數(shù)據(jù)訪問對象往往是按照數(shù)據(jù)庫的表來劃分的。使用倉儲主要是為了查詢和持久化領(lǐng)域?qū)ο螅I(lǐng)域?qū)ο笾g往往會有復(fù)雜的聚合關(guān)系,為了保證不變量,所以才引入根的概念,對領(lǐng)域?qū)ο笾心硞€子對象的訪問必須通過根來導(dǎo)航。這樣說可能不易理解,我舉一個簡單的例子:轎車,輪胎可以看成是一個領(lǐng)域?qū)ο蟮木酆希I車是這個聚合的根,如果我們想訪問輪胎,必須通過轎車的導(dǎo)航來進(jìn)行,為什么如此規(guī)定,因為轎車和輪胎之間存在一個不變量:一個轎車有四個輪胎,如果允許客戶端直接訪問輪胎,那么就很難保證此邏輯不被破壞。

    服務(wù)這個名詞被用過很多次了,但是以前人們說的服務(wù)大多是從技術(shù)角度而言的,從分層來看屬于應(yīng)用層。一般是諸如注冊成功發(fā)送一個郵件之類的東西,領(lǐng)域驅(qū)動設(shè)計中的服務(wù)不是這個范疇的概念,它強調(diào)的是實體之間的相互關(guān)系,而不是純粹意義上的技術(shù)手段。舉一個例子來說:CMS系統(tǒng)里,如果一篇文章被加入精華,則文章作者的經(jīng)驗值加一。此邏輯中涉及量個實體:文章實體和作者實體。經(jīng)驗值加一的邏輯不管是建立在文章實體里,還是作者實體里都顯得冗余,所以有必要在實體之上在抽象出一個服務(wù)層來處理。這里可能有人會問:這樣的邏輯我們放到傳統(tǒng)意義上的應(yīng)用層不行么?那樣做不能說不行,但是多數(shù)情況不好,因為此邏輯屬于領(lǐng)域邏輯,而不是應(yīng)用邏輯,如果放在應(yīng)用層,領(lǐng)域邏輯就外泄了,領(lǐng)域?qū)右簿统蔀榱藬[設(shè),但是也有例外,有時候我們可能一時很難分辨一個邏輯是領(lǐng)域邏輯還是應(yīng)用邏輯,這個時候把此邏輯加入到應(yīng)用層是沒有問題的,如果以后發(fā)現(xiàn)其作為領(lǐng)域邏輯更合適的話再重構(gòu)不遲。

    寫完了回頭看看,感覺只能稱之為涂鴉心得,領(lǐng)域驅(qū)動設(shè)計更多要靠自己的體會。

    原文地址:http://hi.baidu.com/thinkinginlamp/blog/item/807b2834dab21f3b5bb5f51f.html

    后記:前幾天看完了《領(lǐng)域驅(qū)動設(shè)計》這本書,本來想寫點東西,看到已有兄弟撰寫,貼過來分享一下。當(dāng)然上面也只是淺顯的談?wù)摿讼骂I(lǐng)域設(shè)計的基本內(nèi)容以及自己的想法,很不錯。可能很多朋友有些迷惑,個人覺得舉一個實際開發(fā)項目例子,一步一步的講明,可能會更好些。現(xiàn)在正準(zhǔn)備稿件中...
    領(lǐng)域驅(qū)動資料下載



    本博客為學(xué)習(xí)交流用,凡未注明引用的均為本人作品,轉(zhuǎn)載請注明出處,如有版權(quán)問題請及時通知。由于博客時間倉促,錯誤之處敬請諒解,有任何意見可給我留言,愿共同學(xué)習(xí)進(jìn)步。
    posted on 2008-09-30 16:50 Jack.Wang 閱讀(3316) 評論(10)  編輯  收藏 所屬分類: 開發(fā)技術(shù)架構(gòu)師篇領(lǐng)域建模

    Feedback

    # re: 淺談“領(lǐng)域驅(qū)動設(shè)計” 2008-09-30 21:41 Jack.Wang
    簡單版我這里有可發(fā)給大家(網(wǎng)速比較慢,上傳不上去)。有要的可 Email 給您!  回復(fù)  更多評論
      

    # re: 淺談“領(lǐng)域驅(qū)動設(shè)計” 2008-10-01 10:47 Jessica Chen
    可以發(fā)給我嗎?謝謝
    jessicachen07@gmail.com  回復(fù)  更多評論
      

    # re: 淺談“領(lǐng)域驅(qū)動設(shè)計” 2008-10-01 11:47 山風(fēng)小子
    寫的淺顯易懂,不錯!  回復(fù)  更多評論
      

    # re: 淺談“領(lǐng)域驅(qū)動設(shè)計” 2008-10-01 18:14 Jack.Wang
    @Jessica Chen
    Email 你了,注意查收!  回復(fù)  更多評論
      

    # re: 淺談“領(lǐng)域驅(qū)動設(shè)計”[未登錄] 2008-10-02 09:53 Su
    @Jack.Wang
    謝謝,能給我一份嗎?zuwei.su@gmail.com  回復(fù)  更多評論
      

    # re: 淺談“領(lǐng)域驅(qū)動設(shè)計”[未登錄] 2008-10-03 13:49 licy
    要一份,謝謝~

    licy.wish@gmail.com  回復(fù)  更多評論
      

    # re: 淺談“領(lǐng)域驅(qū)動設(shè)計” 2008-10-04 01:29 stonebow
    zl860628@gmail.com
    謝謝  回復(fù)  更多評論
      

    # re: 淺談“領(lǐng)域驅(qū)動設(shè)計” 2008-10-05 22:10 fx
    我也想要一份,謝謝!
    fx1989529@163.com  回復(fù)  更多評論
      

    # re: 淺談“領(lǐng)域驅(qū)動設(shè)計” 2008-10-06 08:43 Jack.Wang
    請從這里下載
    http://www.tkk7.com/Files/Jack2007/dd.pdf  回復(fù)  更多評論
      

    # re: 淺談“領(lǐng)域驅(qū)動設(shè)計” 2008-10-12 22:43 Jack.Wang
    暈,此文件錯誤!我誤傳給好多兄弟!阿門  回復(fù)  更多評論
      

    主站蜘蛛池模板: 24小时日本电影免费看| 色爽黄1000部免费软件下载| 亚洲欧洲日本天天堂在线观看| 污污网站18禁在线永久免费观看| 亚洲欧洲专线一区| 亚洲中文字幕无码亚洲成A人片| 亚洲AV无码成人精品区大在线| 免费A级毛片av无码| 精品一区二区三区免费毛片爱| 阿v免费在线观看| 免费人成大片在线观看播放| 亚洲欧洲综合在线| 亚洲最大福利视频| 亚洲国产精品无码第一区二区三区| 亚洲国产成人久久综合一 | 亚洲一区二区三区精品视频| 亚洲免费观看视频| 久久精品国产亚洲av麻| 亚洲国产精品人人做人人爱| 丁香亚洲综合五月天婷婷| 亚洲国产日韩成人综合天堂 | 四虎精品成人免费视频| 亚洲欧洲高清有无| 亚洲а∨天堂久久精品9966| 亚洲aⅴ无码专区在线观看| 国产亚洲精品欧洲在线观看| 九九热久久免费视频| 男人进去女人爽免费视频国产| 国产视频精品免费视频| 国产免费一区二区三区在线观看| eeuss影院免费直达入口| 国产在线观看免费视频软件| 1000部羞羞禁止免费观看视频| 国产免费一区二区三区在线观看| 国产免费久久精品99久久| 无遮挡a级毛片免费看| 最新久久免费视频| 美女网站免费福利视频| 免费在线观看a级毛片| 亚洲AV日韩AV永久无码免下载 | 可以免费看的卡一卡二|