日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

(转)贫血和富血

發(fā)布時(shí)間:2023/12/3 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (转)贫血和富血 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

轉(zhuǎn)自:?https://blog.csdn.net/t0404/article/details/51865174?

?

貧血vs富血?

我們來(lái)回顧一下。在企業(yè)架構(gòu)模式中,業(yè)務(wù)層的實(shí)現(xiàn)一般有兩種模式:一種是事務(wù)角本模式(Transaction script),另一種是領(lǐng)域模型模式(Domain Model)。這兩種分別對(duì)應(yīng)貧血和富血。好吧,我們不說(shuō)這些扯淡的東西,我們簡(jiǎn)單點(diǎn)說(shuō)。?

所謂貧血,就是一個(gè)對(duì)象里只有屬性,如java中的pojo,要實(shí)現(xiàn)業(yè)務(wù),要依靠service層來(lái)實(shí)現(xiàn)相關(guān)方法,service層的實(shí)現(xiàn)是面向過(guò)程的,也就是所謂的transaction script.我們現(xiàn)在大量的分層應(yīng)用action->service->dao->entity的方式就是這種貧血的模式實(shí)現(xiàn)。?
?

Java代碼??

  • //貧血代碼示例:??
  • Account.java??
  • Public?class?Account{??
  • ????private?String?name;??
  • ????private?Long?num;??
  • ????get?set…??
  • ??
  • }??
  • ??
  • AccountService.java??
  • Public?class?AccountService{??
  • ????public?List?findAccountBySomething(String?abc){}??
  • ????public?void?addAccount(Account?a){}??
  • ????public?void??otherBiz(){}??
  • ??
  • }??


  • 所謂的富血就是屬性和方法都封裝在Domain Object里,所有業(yè)務(wù)都直接操作Domain Object。Service層只是完成一些簡(jiǎn)單的事務(wù)之類(lèi)的,甚至可以不用service層。也就是直接從action->entity.?
    ?

    Java代碼??

  • //富血代碼示例??
  • Account.ava??
  • Public?class?Account{??
  • ????private?String?name;??
  • ????private?Long?num;??
  • ??
  • ????public?List?findAccountBySomething(String?abc){}??
  • ????public?void?addAccount(Account?a){}??
  • ????public?void??otherBiz(){}??
  • }??


  • 前人總結(jié)的一些貧血和富血的對(duì)比:?
    貧血模型的優(yōu)點(diǎn):?
    1.被許多程序員所掌握,許多教材采用的是這種模型,對(duì)于初學(xué)者,這種模型很自然,甚至被很多人認(rèn)為是java中最正統(tǒng)的模型。?
    2.它非常簡(jiǎn)單,對(duì)于并不復(fù)雜的業(yè)務(wù)(轉(zhuǎn)帳業(yè)務(wù)),它工作得很好,開(kāi)發(fā)起來(lái)非常迅速。它似乎也不需要對(duì)領(lǐng)域的充分了解,只要給出要實(shí)現(xiàn)功能的每一個(gè)步驟,就能實(shí)現(xiàn)它。?
    3.事務(wù)邊界相當(dāng)清楚,一般來(lái)說(shuō)service的每個(gè)方法都可以看成一個(gè)事務(wù),因?yàn)橥ǔervice的每個(gè)方法對(duì)應(yīng)著一個(gè)用例。?
    其缺點(diǎn)為也是很明顯的:?
    1.所有的業(yè)務(wù)都在service中處理,當(dāng)業(yè)越來(lái)越復(fù)雜時(shí),service會(huì)變得越來(lái)越龐大,最終難以理解和維護(hù)。?
    2.將所有的業(yè)務(wù)放在無(wú)狀態(tài)的service中實(shí)際上是一個(gè)過(guò)程化的設(shè)計(jì),它在組織復(fù)雜的業(yè)務(wù)存在天然的劣勢(shì),隨著業(yè)務(wù)的復(fù)雜,業(yè)務(wù)會(huì)在service中多個(gè)方法間重復(fù)。?
    3.當(dāng)添加一個(gè)新的UI時(shí),很多業(yè)務(wù)邏輯得重新寫(xiě)。例如,當(dāng)要提供Web Service的接口時(shí),原先為Web界面提供的service就很難重用,導(dǎo)致重復(fù)的業(yè)務(wù)邏輯(在貧血模型的分層圖中可以看得更清楚),如何保持業(yè)務(wù)邏輯一致是很大的挑戰(zhàn)。?

    富血的優(yōu)點(diǎn)是:?
    1.領(lǐng)域模型采用OO設(shè)計(jì),通過(guò)將職責(zé)分配到相應(yīng)的模型對(duì)象或Service,可以很好的組織業(yè)務(wù)邏輯,當(dāng)業(yè)務(wù)變得復(fù)雜時(shí),領(lǐng)域模型顯出巨大的優(yōu)勢(shì)。?
    2.當(dāng)需要多個(gè)UI接口時(shí),領(lǐng)域模型可以重用,并且業(yè)務(wù)邏輯只在領(lǐng)域?qū)又谐霈F(xiàn),這使得很容易對(duì)多個(gè)UI接口保持業(yè)務(wù)邏輯的一致(從領(lǐng)域模型的分層圖可以看得更清楚)。?
    富血的缺點(diǎn)是:?
    1.對(duì)程序員的要求較高,初學(xué)者對(duì)這種將職責(zé)分配到多個(gè)協(xié)作對(duì)象中的方式感到極不適應(yīng)。?
    2.領(lǐng)域驅(qū)動(dòng)建模要求對(duì)領(lǐng)域模型完整而透徹的了解,只給出一個(gè)用例的實(shí)現(xiàn)步驟是無(wú)法得到領(lǐng)域模型的,這需要和領(lǐng)域?qū)<业某浞钟懻摗ee(cuò)誤的領(lǐng)域模型對(duì)項(xiàng)目的危害非常之大,而實(shí)現(xiàn)一個(gè)好的領(lǐng)域模型非常困難。?
    3.對(duì)于簡(jiǎn)單的軟件,使用領(lǐng)域模型,顯得有些殺雞用牛刀了。?
    4.對(duì)于事務(wù)等的處理,如果完全DDD,java支持得不夠好。?

    關(guān)于Spring roo?
    引子中小胖公司就是采用Roo完成DDD富血開(kāi)發(fā)。Spring Roo is a popular open-source rapid application development (RAD) tool for Java developers.?,使用命令行或工具操作來(lái)生成自動(dòng)化項(xiàng)目,操作非常類(lèi)似于rails。Roo可以很好的支持富血的Java DDD。關(guān)于roo我也不想說(shuō)太多,因?yàn)槲乙矝](méi)有親自實(shí)戰(zhàn)過(guò),大家可以google一下。?

    如果采用roo,只需要?
    對(duì)于一個(gè)業(yè)務(wù)實(shí)現(xiàn)?

    Java代碼??

  • @Entity????
  • @RooEntity????
  • @RooJavaBean????
  • @RooToString????
  • public?class?Employee?{?????
  • ????@NotNull????
  • ????@Size(max?=?200)?????
  • ????private?String?name;?????
  • ????
  • ????@Temporal(TemporalType.TIMESTAMP)?????
  • ????private?Date?birth;?????
  • }????
  • ??
  • //EmployeeController代碼如下:???
  • @RooWebScaffold(automaticallyMaintainView?=?true,?formBackingObject?=?Employee.class)?????
  • @RequestMapping("/employee/**")?????
  • @Controller????
  • public?class?EmployeeController?{?????
  • }???


  • 在這里出現(xiàn)了一行@RooWebScaffold注解,做過(guò)rails的人會(huì)想,這不是rails里面的scaffold嗎?沒(méi)錯(cuò),通過(guò)@RooWebScaffold注解,EmployeeController自動(dòng)獲得了curd的所有功能。?

    好了,就這么簡(jiǎn)單,一個(gè)domain,一個(gè)Controller,我們就可以發(fā)布到tomcat中運(yùn)行了。?
    ?

    引用

    Roo功能目前還不很強(qiáng)大,比如還不能根據(jù)配置的數(shù)據(jù)庫(kù)鏈接直接從數(shù)據(jù)庫(kù)表來(lái)生成Entity,以及前端表示層使用JSP和綁定Spring MVC(基于Spring 3.0支持REST)等,但是這些改進(jìn)目標(biāo)已經(jīng)納入其roadmap中。說(shuō)一下另一個(gè)框架Seam對(duì)于富血也做得不錯(cuò)了,但還不是完全富血,同樣也綁帶了JSF。


    這兩天又看了一下spring roo,修正一下觀點(diǎn),新的spring roo版本已經(jīng)可以用DBRE reverse from db.并且好像也很強(qiáng)大。?

    1.一個(gè)entity只需要寫(xiě)屬性就行,get set免。?
    2.簡(jiǎn)單的增刪改查功能,一鍵生成。?
    3.通過(guò)aspectJ實(shí)現(xiàn)編譯時(shí)aop,完全不影響性能。?
    4.可以動(dòng)態(tài)查詢(xún):如findPersonByNameAndMinMax(),相當(dāng)于like name,between min to max這樣的功能。?
    5.用Spring roo實(shí)現(xiàn)DDD,只有兩層Controller層和Entity層。另外Service層(可選),Dao不推薦用了。?
    6.jms,email,json序列化支持?
    7.其它說(shuō)明:開(kāi)發(fā)需要JDK1.6以上。?
    8.不想用roo時(shí),可以快速刪除annotation和相關(guān)的jar包等文件。?
    ...?

    Spring roo架構(gòu)overview:?

    ?


    AspectJ實(shí)現(xiàn)編譯時(shí)AOP?

    ?


    自動(dòng)動(dòng)態(tài)查詢(xún),自動(dòng)生成?

    ?



    想了解更多roo內(nèi)容,可以看看此文:使用Spring Roo ,感受ROR式的開(kāi)發(fā)?
    http://www.iteye.com/topic/443059?
    還有看官方文檔:?
    http://www.springsource.org/roo?

    關(guān)于ruby?
    Ruby我沒(méi)有使用過(guò),只是有所了解。所以不敢評(píng)價(jià)。但是當(dāng)spring roo等框架成熟起來(lái)后,java語(yǔ)言就能很好的支持富血,更好的OO,更好的DDD,也能支持web快速開(kāi)發(fā)了。那么我們能不能斗膽問(wèn)一句:基于Java的開(kāi)發(fā)者,想實(shí)現(xiàn)ror一樣的web開(kāi)發(fā),還需要ruby嗎?我們沒(méi)必要向ruby轉(zhuǎn)了吧??


    小結(jié):?
    我們對(duì)于新的東西,總是會(huì)有一種天生的阻抗性。就如我習(xí)慣了貧血的開(kāi)發(fā)模式,有了更OO的spring roo出現(xiàn)時(shí),我內(nèi)心里還是不大看好它。正如前些天一些人說(shuō)spring越來(lái)越龐大,不好一樣,我想他們也是內(nèi)心的阻抗性在起作用。但一個(gè)人要有一個(gè)更高的視野,時(shí)刻準(zhǔn)備一些東西,當(dāng)風(fēng)暴來(lái)臨時(shí),可以從容面對(duì)。?

    ps:說(shuō)一下我的觀點(diǎn):?
    我是多年的貧血模型的實(shí)踐者,基本上并沒(méi)什么特別覺(jué)得不適的地方,雖然貧血模型不那么OO。其實(shí)我對(duì)于這個(gè)spring roo并不是特別看好。但是需要去了解它,和關(guān)注它。(可能又要修正了,看發(fā)展情況吧)?

    國(guó)外有一篇文章對(duì)spring roo的觀點(diǎn),我是比較贊同的:?
    When to use Spring roo??
    http://java.dzone.com/articles/when-use-spring-roo?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+javalobby%2Ffrontpage+(Javalobby+%2F+Java+Zone)?
    我抽出幾個(gè)重要的出來(lái):?
    What is Spring Roo??
    “Spring Roo is a lightweight developer tool that makes it fast and easy to deliver instant results. Best of all, you code 100% in Java and get to reuse all your existing Java knowledge, skills and experience.?

    Spring Roo is awesome for CRUD-Clients!?

    Spring Roo is good for learning Technologies!?

    Spring Roo is NOT good for complex Projects (yet)...?

    Conclusion: Spring Roo is a nice Tool => Become a Part of the Community!?
    My final conclusion: You should know Spring Roo, because it is nice, but you should also know when to use it and when to use something else. Use it to create CRUD applications or to learn technologies.?Do not use it (yet) for complex, large projects.?

    總結(jié)

    以上是生活随笔為你收集整理的(转)贫血和富血的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。