<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

    簡(jiǎn)單的MVC就夠了嗎?淺談service Layer的引入

    MVC是web開(kāi)發(fā)中常見(jiàn)的程序結(jié)構(gòu)。

    簡(jiǎn)單的mvc結(jié)構(gòu)如下:

    view層:顯示層。

    control層:業(yè)務(wù)層,集合了各種action。

    model層:模型層,一般和數(shù)據(jù)打交道。簡(jiǎn)單的sample:一個(gè)表對(duì)應(yīng)一個(gè)model類(lèi)。

    其中control層調(diào)用model層的方法,實(shí)現(xiàn)對(duì)數(shù)據(jù)的訪(fǎng)問(wèn)。

     

    采用這樣的結(jié)構(gòu)在一定程度上,可以做到代碼清晰,較容易擴(kuò)展,代碼的管理復(fù)雜度較低。

    但是如果是業(yè)務(wù)很多,邏輯又很復(fù)雜的網(wǎng)站,如果再加上開(kāi)發(fā)人員的水平參差不齊,那必然會(huì)導(dǎo)致下面的情況:

    1 action中的代碼越來(lái)越長(zhǎng),邏輯越來(lái)越復(fù)雜,不同action之間看起來(lái)有很多可以重用的代碼, 但是真要進(jìn)行重構(gòu)的話(huà),又非常困難。

    2 model層中包含的方法越來(lái)越多,有些方法也過(guò)于復(fù)雜。甚至在不少方法中還包含了業(yè)務(wù)邏輯。

    3 代碼的修改,還是牽一發(fā)而動(dòng)全身。

    4 代碼難以進(jìn)行自動(dòng)化測(cè)試。

     

    本來(lái)以為引入了mvc,程序的管理復(fù)雜度問(wèn)題就高枕無(wú)憂(yōu)了,但現(xiàn)在又面臨了相同的問(wèn)題了。

     

    以我最近的所學(xué)看,在mvc中再引入service層,可以在很大程度上避免或者緩解上述問(wèn)題。

    原有的mvc結(jié)構(gòu)改成如下:

    1 view層:顯示層。

    2 control層:業(yè)務(wù)層,集合了各種action。

    3 service層。

    4 DAO層。

    原來(lái)的model層不見(jiàn)了,增加了service層和DAO層。DAO,即Data Access Object,數(shù)據(jù)訪(fǎng)問(wèn)接口,數(shù)據(jù)訪(fǎng)問(wèn):顧名思義就是與數(shù)據(jù)庫(kù)打交道

     

    在這個(gè)結(jié)構(gòu)中,control不直接和DAO聯(lián)系,

    需要操作數(shù)據(jù)的時(shí)候,通過(guò)service層訪(fǎng)問(wèn)DAO層來(lái)實(shí)現(xiàn)。

    service層做的事情,不僅僅是調(diào)用DAO操作數(shù)據(jù),還會(huì)包含了一定的業(yè)務(wù)邏輯。整個(gè)程序的設(shè)計(jì),也變成了針對(duì)服務(wù)進(jìn)行設(shè)計(jì)。

     

    這樣做的好處是:

    1 control層中的action得以精簡(jiǎn),因?yàn)閍ction中的一些邏輯,被重構(gòu)成一個(gè)個(gè)的服務(wù)。而不同的action也可以重用服務(wù)了

    2 只負(fù)責(zé)和數(shù)據(jù)打交道的DAO層,相比之前的model層,也得以精簡(jiǎn)(DAO層盡量只做最原子的數(shù)據(jù)操作,不同數(shù)據(jù)操作之間的聯(lián)系,這邊不考慮,那是service層的事情)。

    3 service層可以實(shí)現(xiàn)很大程度上的代碼復(fù)用,程序的功能封裝更清晰了。

    4 由于service層更加清晰的定義了應(yīng)用程序的邊界,那么對(duì)于各個(gè)service函數(shù)(對(duì)應(yīng)某個(gè)服務(wù)/應(yīng)用),要做到自動(dòng)化測(cè)試就方便多了。WEB程序如何做到能方便的進(jìn)行單元測(cè)試,這是一直困擾我的難題,這樣的設(shè)計(jì)似乎真的可行了~

    5 開(kāi)發(fā)人員的工作分配,理論上真的可以按層次劃分了。只是理論上~

     

    同時(shí),這樣的設(shè)計(jì)模式也是存在一定的缺點(diǎn)的:

    層次太多,剛接觸的開(kāi)發(fā)人員理解起來(lái)比簡(jiǎn)單的mvc結(jié)構(gòu)費(fèi)時(shí);

    service層的設(shè)計(jì)需要一定的功力,因?yàn)閍ction中和model層的邏輯在很大程度上轉(zhuǎn)移到這里了。

     

    但整體上看,service Layer的引入,更加清晰的定義了應(yīng)用程序的邊界,提供了一系列可以重用的操作集合。這對(duì)于網(wǎng)站的可擴(kuò)展性和可維護(hù)性是非常有幫助的。

     

    當(dāng)然,如果網(wǎng)站的業(yè)務(wù)邏輯并不復(fù)雜,完全沒(méi)必要用這樣的設(shè)計(jì)。過(guò)度設(shè)計(jì)是萬(wàn)惡之源~

    posted on 2010-10-07 16:29 常言笑 閱讀(658) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): 技術(shù)總結(jié)

    My Links

    Blog Stats

    常用鏈接

    留言簿(5)

    隨筆分類(lèi)

    隨筆檔案

    搜索

    積分與排名

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 无码的免费不卡毛片视频| 亚洲网站在线播放| 韩国二级毛片免费播放| 亚洲视频在线免费看| 久久精品中文字幕免费| 在线观看免费大黄网站| 亚洲欧美国产国产综合一区 | 亚洲av午夜福利精品一区人妖| 亚洲无砖砖区免费| 色影音免费色资源| 久久影视国产亚洲| 99久久免费国产特黄| 亚洲午夜久久影院| 亚洲人成网站免费播放| 亚洲第一区二区快射影院| 国产免费小视频在线观看| 亚洲男女性高爱潮网站| 2019中文字幕免费电影在线播放| 亚洲日本香蕉视频| 麻豆国产精品入口免费观看| 国产97视频人人做人人爱免费| 亚洲AV永久纯肉无码精品动漫| 99国产精品永久免费视频| 亚洲Aⅴ在线无码播放毛片一线天| 国产免费AV片无码永久免费| 两个人www免费高清视频| 亚洲日韩中文字幕天堂不卡| 免费看小12萝裸体视频国产| 大地资源在线资源免费观看| ass亚洲**毛茸茸pics| 亚洲精品第一国产综合境外资源| 久草视频在线免费看| 亚洲日韩av无码中文| 在线亚洲精品福利网址导航| 国产高清免费视频| 人体大胆做受免费视频| 亚洲网站免费观看| 亚洲精品国产V片在线观看| 午夜福利不卡片在线播放免费| 三级片免费观看久久| 亚洲制服在线观看|