這個(gè)項(xiàng)目到一開(kāi)始的kickoff到現(xiàn)在,持續(xù)了很長(zhǎng)的一段時(shí)間,現(xiàn)在差不多也接近了尾聲,所以要好好做個(gè)總結(jié),下面不會(huì)設(shè)計(jì)到太多技術(shù)層面上的東西,而是從前端構(gòu)架這個(gè)角度來(lái)看待這個(gè)項(xiàng)目。
這里所說(shuō)的三層就是:表示層,業(yè)務(wù)邏輯層和數(shù)據(jù)層。對(duì)于數(shù)據(jù)層,只需要知道后臺(tái)返回過(guò)來(lái)是什么樣格式的數(shù)據(jù)(這次約定是一段json格式的數(shù)據(jù)),更多的精力是放在業(yè)務(wù)邏輯層和表示層上面,我主要負(fù)責(zé)表示層,朱哥哥主要負(fù)責(zé)業(yè)務(wù)邏輯層,分工合作,也算是一種嘗試吧,取得的效果還不錯(cuò)。那么不多說(shuō)廢話了,下面看具體實(shí)現(xiàn)(在命名上做了一定的改動(dòng),跟實(shí)際有點(diǎn)出入,只需關(guān)注其中的構(gòu)架思想):
第一步:先看下最后的成果:
在頁(yè)面只需引入一個(gè)合并好的js:merge.js,然后在實(shí)例化這個(gè)方法 var post = new Post(url,successFn,failureFn,false)這個(gè)就是最后三層結(jié)合的體現(xiàn) url 就是獲得數(shù)據(jù)的源地址,屬于數(shù)據(jù)層 Post數(shù)據(jù)處理類,是屬于業(yè)務(wù)邏輯層 successFn,faileFn 數(shù)據(jù)請(qǐng)求成功和失敗調(diào)用的方法,是屬于表示層
第二步:看下merge.js,它是一個(gè)js合并后的文件,考慮減少HTTP請(qǐng)求,在這里做了合并,merge.js的文件結(jié)構(gòu)如下: merge.js
業(yè)務(wù)邏輯層
- config.js(配置文件,包含一些參數(shù)配置以及一些渲染時(shí)用到的一些公有方法
- render0.js(渲染的方法,這里針對(duì)不同的頁(yè)面,可以有多種不同的方法,但是前面三個(gè)文件是必須的)
表示層
config.js:
var config = { "entrance":""noimg":{ "x100":""x150":http://img.china.alibaba.com/images/cn/market/trade/list/ 070423/nopic150.gif }, ....... } function doRed(str,key){...}//加紅 function doSubstring(str,maxLength,type)//字符串截取 function doFitlerData(d){...}//數(shù)據(jù)過(guò)濾 .......
render0.js:
//渲染類 var Render = function(id,num){ //多種渲染方法 this.doRenderHeader=function(){......}; this.doRenderFooter=function(){.......}; this.doRenderImage=function(imgurl,url,title, item){......}; this.doRenderTitle=function(title, url,key,item){......}; this.doRenderItem=function(item, idx){ 調(diào)用this.doRenderImage(),this.doRenderTitle() }; this.doRenderBody=function(rets){ 調(diào)用this.doRenderItem() }; ...... this.doRender=function(rets){ var html = []; html[html.length] = this.doRenderHeader(); html[html.length] = this.doRenderBody(rets); html[html.length] = this.doRenderFooter(); if(this.root)this.root.innerHTML = html.join(''); }; } //數(shù)據(jù)請(qǐng)求時(shí)成功調(diào)用的方法 function successFn(o){ try{ var data = doFitlerData(o); //調(diào)用config.js里的方法 //實(shí)例化Render var defaultRender = new Render("test",3); defaultRender.doRender(data); }catch(e){ } } //數(shù)據(jù)請(qǐng)求時(shí)調(diào)用失敗的方法 function failureFn(){ alert("Failure"); }
這樣的三層構(gòu)架帶來(lái)什么好處,首先是分工非常明確,我只要負(fù)責(zé)頁(yè)面渲染(表示層)這一塊,其他的我可以不去考慮。其次,程序與程序間的耦合度低了,相對(duì)程序本身的內(nèi)聚度高了,業(yè)務(wù)邏輯層和表示層只有一個(gè)數(shù)據(jù)接口,那就是從業(yè)務(wù)邏輯層返回給表示層是什么樣的數(shù)據(jù)以及數(shù)據(jù)的格式,從業(yè)務(wù)邏輯層這個(gè)層面考慮,里面的程序如何修改,只要返回的數(shù)據(jù)不變,對(duì)表示層是一點(diǎn)都沒(méi)有影響,同理,針對(duì)不同的頁(yè)面,表示層可以寫(xiě)很多渲染類,對(duì)業(yè)務(wù)邏輯層也是沒(méi)有影響的,同時(shí)提起公有的方法,放到config.js中,提高了代碼的重用性。最后,程序有較高的擴(kuò)展性和可維護(hù)性。我想這些都是三層架構(gòu)帶給我們的好處吧。就講到這吧,以上是對(duì)這次項(xiàng)目從構(gòu)架的角度做一個(gè)總結(jié),對(duì)三層架構(gòu)還需要再去深入研究,個(gè)人覺(jué)得這個(gè)現(xiàn)在還是比較普及的,可以用這個(gè)思想來(lái)構(gòu)架一個(gè)項(xiàng)目,一個(gè)系統(tǒng)。
本文鏈接:http://www.95time.cn/tech/web/2008/6066.asp
出處:
責(zé)任編輯:bluehearts
◎進(jìn)入論壇網(wǎng)頁(yè)制作、WEB標(biāo)準(zhǔn)化版塊參加討論,我還想發(fā)表評(píng)論。
|