<source id="4vppl"><ins id="4vppl"></ins></source>
<u id="4vppl"><sub id="4vppl"><label id="4vppl"></label></sub></u>
<object id="4vppl"></object>
  • <u id="4vppl"><li id="4vppl"><label id="4vppl"></label></li></u>

    <object id="4vppl"></object>
    <b id="4vppl"><sub id="4vppl"><tr id="4vppl"></tr></sub></b>

      <i id="4vppl"><thead id="4vppl"></thead></i>

      <thead id="4vppl"><li id="4vppl"><label id="4vppl"></label></li></thead>

      當(dāng)前位置:首頁(yè) > 網(wǎng)站舊欄目 > 學(xué)習(xí)園地 > 設(shè)計(jì)軟件教程 > 談一談貧血的Domain Logic問(wèn)題。

      談一談貧血的Domain Logic問(wèn)題。
      2010-01-14 22:28:10  作者:  來(lái)源:
      如今采用Hibernate實(shí)現(xiàn)的Domain Model,多數(shù)只是維護(hù)實(shí)體之間的關(guān)聯(lián),而大多數(shù)的業(yè)務(wù)邏輯,則是由Service Layer來(lái)實(shí)現(xiàn)。

      這樣的模型對(duì)象擁有的行為太少了,以至于Martin Fowler給他們下了一個(gè)定義:貧血模型。

      我們知道,高內(nèi)聚低耦合是衡量一個(gè)模型設(shè)計(jì)是否合理的重要標(biāo)準(zhǔn)之一。對(duì)象組件間合理分工協(xié)作可以解決復(fù)雜的問(wèn)題邏輯,按照這個(gè)標(biāo)準(zhǔn),我們似乎可以很自然的各種行為封裝到各個(gè)模型對(duì)象中。 然而,現(xiàn)在絕大多數(shù)的應(yīng)用沒(méi)有這樣做。

      ORM作為模型對(duì)象與數(shù)據(jù)庫(kù)模型之間的接口,它的引入無(wú)疑承擔(dān)了實(shí)體領(lǐng)域模型所能稱(chēng)之為領(lǐng)域模型的 所有責(zé)任。 正如同Martin Fowler所說(shuō)的,貧血的領(lǐng)域模型承擔(dān)了領(lǐng)域模型的所有成本,卻沒(méi)有得到真正的收益。
      在這里,真正的收益應(yīng)該是指高內(nèi)聚低耦合的擁有復(fù)雜對(duì)象行為的領(lǐng)域模型,確實(shí),我們?cè)O(shè)計(jì)的領(lǐng)域模型根本沒(méi)有實(shí)現(xiàn)任何的功能,我們只能在外面從新設(shè)計(jì)一個(gè) Service Layer來(lái)管理所有的行為。

      我不敢評(píng)論這樣的設(shè)計(jì)方案是怎樣的不合理。 當(dāng)設(shè)計(jì)到擁有比較復(fù)雜問(wèn)題領(lǐng)域模型的時(shí)候,這種只負(fù)責(zé)管理實(shí)體間關(guān)聯(lián)關(guān)系的實(shí)體模型肯定不能適應(yīng),這樣做的后果就是將復(fù)雜領(lǐng)域邏輯統(tǒng)統(tǒng) 移植到 Service Layer層或者胡亂給起名字的一個(gè)外層。

      考慮Martin Fowler 《Analysis Patterns》中著名的一個(gè)通用模型:團(tuán)體責(zé)任模型。里面的約束需要在實(shí)體領(lǐng)域模型中得以實(shí)現(xiàn),在貧血領(lǐng)域模型中,封裝實(shí)現(xiàn)這樣的需要檢索 驗(yàn)證某個(gè)甚至全部實(shí)體數(shù)據(jù)的行為只能移植到Service Layer中。 這樣的移植對(duì)于領(lǐng)域模型的構(gòu)架無(wú)疑大大增加了復(fù)雜度。


      那么,我們能不能在貧血領(lǐng)域模型基礎(chǔ)上,加入對(duì)象行為,使之擁有豐富的行為呢? 我想這是可以解決的,解決的關(guān)鍵是將可訪(fǎng)問(wèn)底層實(shí)體數(shù)據(jù)的行為賦予每一個(gè)實(shí)體模型對(duì)象,最簡(jiǎn)便的辦法就是用一個(gè)全局訪(fǎng)問(wèn)點(diǎn)來(lái)實(shí)現(xiàn)。

      考慮這么一個(gè)層次:
      Java代碼 復(fù)制代碼
      1. public interface ServiceProvider{   
      2.                 public Object getService(String serviceName);;   
      3.           
      4. }   
      5.   
      6.   
      7. public ServiceProviderImpl{   
      8.               public ObjectgetService(String serviceName);{   
      9.                 
      10.                     return ServiceLocator.getService(serbiceName  );;   
      11.              }   
      12.                   
      13. }   
      14.   
      15. public interface CRUD{   
      16.      public void save();;   
      17.       public void delete();;   
      18.        public void load(Long id);;   
      19.       public void update();;   
      20. }   
      21.   
      22. public Group implements CRUD {   
      23.   
      24.     private String name;   
      25.      private List  users;   
      26.       public GroupService getGroupService();{   
      27.            return (GroupService);getServiceProvider();.getService(this.class.getName();+"Service");   
      28.       }   
      29.      public void save();{   
      30.           if(getGroupService();.findGroupByName(name);!=null);   
      31.                        throw new RuntimeExepion("duplicate group name!");;   
      32.           getGroupService();.save(this);;   
      33.       }   
      34.       public  Group load(Long id);{   
      35.            this=getGroupService();.load(this.class,id);;   
      36.            return this;   
      37.       }   
      38.          
      39.      public void addUser(user user);{   
      40.                 
      41.             users.add(user);;   
      42.             this.save();;    
      43.         
      44.     }   
      45.      public void removeUser(User user);{   
      46.      }   
      47.   
      48.         
      49.   
      50. }  

      這樣作的問(wèn)題是與建立貧血對(duì)象模型相比,領(lǐng)域?qū)ο竽P偷男袨橥ㄓ眯枰猄erviceLayer來(lái)完成,約定:
      1)ServiceLayer層只負(fù)責(zé)實(shí)現(xiàn)簡(jiǎn)單的單步驟的與底層數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)的 邏輯,不包含任何業(yè)務(wù)領(lǐng)域邏輯。 如上面的 service.save(),service.update, service.delete , service.findGroupByName.... 

      2) 領(lǐng)域模型對(duì)象負(fù)責(zé)對(duì)自身的領(lǐng)域邏輯進(jìn)行封裝。

      3)通過(guò)賦予模型對(duì)象行為,建立對(duì)象間行為關(guān)聯(lián),以完成更復(fù)雜的 商業(yè)邏輯。

      4)外層業(yè)務(wù)邏輯層只能看到領(lǐng)域模型對(duì)象,不能直接操作任何的類(lèi)似Service.save這樣的直接訪(fǎng)問(wèn)底層數(shù)據(jù)庫(kù)的行為。

      安徽新華電腦學(xué)校專(zhuān)業(yè)職業(yè)規(guī)劃師為你提供更多幫助【在線(xiàn)咨詢(xún)
      国产午夜福三级在线播放_亚洲精品成a人片在线观看_亚洲自慰一区二区三区_久久棈精品久久久久久噜噜
      <source id="4vppl"><ins id="4vppl"></ins></source>
      <u id="4vppl"><sub id="4vppl"><label id="4vppl"></label></sub></u>
      <object id="4vppl"></object>
    1. <u id="4vppl"><li id="4vppl"><label id="4vppl"></label></li></u>

      <object id="4vppl"></object>
      <b id="4vppl"><sub id="4vppl"><tr id="4vppl"></tr></sub></b>

        <i id="4vppl"><thead id="4vppl"></thead></i>

        <thead id="4vppl"><li id="4vppl"><label id="4vppl"></label></li></thead>
        久久er精品77视频 | 中文字幕精品亚洲人成在线 | 日本中文字幕二区区精品 | 久久精品少妇一级 | 亚洲AV秘片一区二区三 | 亚洲一线高清精品在线观看 |