人在江湖

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            82 Posts :: 10 Stories :: 169 Comments :: 0 Trackbacks

          就好像第一次讀effective java才意識到什么叫做代碼質(zhì)量;第一次接觸到Domain Driven Design才開始認識什么是design。在之前的博客, 分享十二本經(jīng)典電子書,涉及java, OO design, spring, hibernate,struts2, agile 中,有DDD書的下載。

          Domain Driven Design基于一些簡單,重要,務(wù)實的理念。下面根據(jù)自己的理解總結(jié)DDD的基本理論。

          1. 深刻理解Domain知識

          DDD強調(diào)基于domain進行設(shè)計。前提是深刻理解領(lǐng)域知識,需要持續(xù)學習。另一個相關(guān)的實踐是,“統(tǒng)一的語言”(ubiquitous language)。領(lǐng)域?qū)<宜玫男g(shù)語是準確的,那么程序員討論domain相關(guān)的問題時,也應(yīng)該使用這種術(shù)語。并且在寫code的時候,也使用這種術(shù)語。這樣做的好處是,可以自然地把domain的東西map到code里,保持code反應(yīng)domain。

           

          2. 分層

          Layered Architecture

          image

           

          程序需要分層,這是個簡單的道理, 但需要真正形成意識。

          分別說說Domain Driven Design涉及的四個layer.

          2.1 Infrastructure層

          主要從技術(shù)上對上面的各層提供支持。比如傳送消息,持久化。UI層也可以分出更基礎(chǔ)的component作為infrastructure層

          2.2 UI層

          UI層的作用是顯示信息以及解釋用戶的輸入命令。重要的是UI層沒有domain knowledge.

          2.3 application層

          application層的作用是描述產(chǎn)品的外部功能,它可以協(xié)調(diào)UI和Domain層的互動。application層應(yīng)該很薄。它沒有domain knowledge.

          2.4 Domain層

          Domain層是最重要的層。封裝所有的業(yè)務(wù)邏輯。

           

          DDD也從另一個角度分解軟件。一個軟件的組成部分(building block)包括association, entity, value object, service, module。其中比較強調(diào)的是entity, value object和service. service比較容易理解,通常它是無狀態(tài)的。它可以存在于application層,domain層或者infrastructure層。比較不容易區(qū)分的是entity和value object. entity強調(diào)的是它的id,而不是屬性。強調(diào)它生命周期的繼續(xù)性和同一性(continuity and identity), 而value object是用來“描述”entity的。value object在很多時候適合是immutable的。這里需要注意的是,如果你會使用hibernate,你會知道hibernate里的value object通常不能reference多個entity,換句話說,能reference多個entity的,通常就是entity.  而在DDD的理論中,"路線"是一個value object。而它可以reference連接"路線"的city(entity)和高速公路(entity)。

           

          3. Domain Object生命周期

          DDD的一個重要理論是關(guān)于aggregate. domain object之間的關(guān)系如果非常復雜,在domain knowledge涉及比較復雜的rule的時候,容易造成不一致的情況。解決辦法是,把一些domain object放一個組里,讓某個domain object作為根(aggregate root), 所有對這些domain object的訪問都要通過這個aggregate, 那么維持一致性的工作,就限制在這個aggregate root里了。

          image

           

          另一個相關(guān)理論是factory和repository. factory是用來“創(chuàng)建”對象的,是一個從無到有的過程。而repository是用來retrieve對象的,也就是說,對象客觀存在,只是沒有放在內(nèi)存中,repository就是把數(shù)據(jù)從某個地方(通常是數(shù)據(jù)庫)拿出來,construct成對象的。一個常見的設(shè)計是,讓repository暴露retrieve和create的api,但是create的具體工作代理給factory來做,也就是說,factory通常被聚合在repository中。

          posted on 2011-03-21 00:26 人在江湖 閱讀(3598) 評論(0)  編輯  收藏 所屬分類: design
          主站蜘蛛池模板: 新昌县| 鄂尔多斯市| 江门市| 班戈县| 仲巴县| 建昌县| 福贡县| 吉水县| 靖西县| 林周县| 长寿区| 松原市| 五河县| 威海市| 黎川县| 大渡口区| 包头市| 密云县| 高陵县| 开平市| 荥经县| 赫章县| 岳阳县| 农安县| 乌什县| 武隆县| 吉林省| 北流市| 霍州市| 潢川县| 永登县| 响水县| 肃宁县| 郯城县| 米林县| 江达县| 托里县| 西贡区| 鄂温| 勐海县| 绵阳市|