<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Johnny's Collections

    生活總是有太多的無(wú)奈與失望,讓我們以在努力學(xué)習(xí)和工作中獲得的成就感和快樂(lè)來(lái)沖淡它們。

    BlogJava 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
      10 Posts :: 0 Stories :: 80 Comments :: 0 Trackbacks

    最近在項(xiàng)目中接到一個(gè)任務(wù),我負(fù)責(zé)后臺(tái)開(kāi)發(fā),另一開(kāi)發(fā)人員負(fù)責(zé)前臺(tái)開(kāi)發(fā)。任務(wù)非常簡(jiǎn)單,請(qǐng)看下面的類(lèi)圖。



    A和B有一個(gè)單向的關(guān)聯(lián)關(guān)系,現(xiàn)在要為A增加一個(gè)屬性boolean resident,該屬性值有如下簡(jiǎn)單的業(yè)務(wù)邏輯決定(偽代碼):

    if(a.x == a.b.x)
       resident = true;
    else
       resident = false;

    前臺(tái)的查看頁(yè)面需要顯示這個(gè)值,當(dāng)用戶修改a.x或者a.b.x時(shí),要觸發(fā)一個(gè)事件,實(shí)時(shí)的在前臺(tái)更新resident,后臺(tái)需要以這個(gè)resident來(lái)

    做某些業(yè)務(wù)邏輯的判斷。

    我們知道,由于resident完全可以由a.x與a.b.x決定,屬于一個(gè)冗余數(shù)據(jù),不需要顯式的增加該屬性。很快,前臺(tái)的那位開(kāi)發(fā)人員就輕松的

    告訴我,這個(gè)任務(wù)已經(jīng)寫(xiě)完了,原來(lái)他是在頁(yè)面寫(xiě)了一個(gè)JS腳本,當(dāng)a.x或a.b.x發(fā)生改變時(shí),觸發(fā)一個(gè)onChange()事件,里面就實(shí)現(xiàn)了上述

    的邏輯。我一看,感覺(jué)問(wèn)題來(lái)了,然后我告訴他,我已經(jīng)在后臺(tái)的服務(wù)提供了一個(gè)方法,用于判斷resident的值,他應(yīng)該在事件觸發(fā)的時(shí)候

    ,通過(guò)異步方式調(diào)用后臺(tái)方法來(lái)獲取reisdent的值。他一聽(tīng)覺(jué)得非常奇怪,這么簡(jiǎn)單的邏輯,為什么需要使用異步方式去調(diào)用后臺(tái)這么麻煩

    ,于是我就從設(shè)計(jì)的角度跟他解釋?zhuān)瑀esident由 a.x與a.b.x決定,這是一個(gè)業(yè)務(wù)邏輯,從職責(zé)劃分的設(shè)計(jì)原則分析,前臺(tái)只負(fù)責(zé)顯示邏輯,

    業(yè)務(wù)邏輯屬于后臺(tái)的職責(zé)。接著,他又提出了疑問(wèn),說(shuō)這里其實(shí)只有一行代碼,沒(méi)有必要分得那么清,這樣調(diào)用不但麻煩,而且性能相對(duì)較

    低。

    這個(gè)例子,反映出了很多開(kāi)發(fā)人員的通病,沒(méi)有真正從事物的本質(zhì)考慮問(wèn)題,只從代碼的數(shù)量去考慮。

    上述的做法存在兩個(gè)問(wèn)題:

    1.開(kāi)發(fā)人員沒(méi)有從職責(zé)劃分的角度考慮問(wèn)題,而只是貪圖一時(shí)的方便,或者覺(jué)得簡(jiǎn)單的一兩行代碼不需要進(jìn)行設(shè)計(jì),但實(shí)際上,上面的問(wèn)題

    必然導(dǎo)致重復(fù)代碼。上面的例子,即使只有一行代碼,但在系統(tǒng)的前后臺(tái)卻出現(xiàn)了兩份相同的邏輯,假設(shè)以后某天業(yè)務(wù)邏輯發(fā)生了變化,那

    么,必須在兩個(gè)地方(甚至更多的地方)進(jìn)行修改、測(cè)試,如果漏掉了一個(gè)地方,就會(huì)導(dǎo)致Bug的出現(xiàn)。作為一個(gè)開(kāi)發(fā)人員,如果不注意這些

    細(xì)節(jié),隨意的拷貝和重復(fù)代碼,長(zhǎng)期下來(lái),一個(gè)系統(tǒng)就會(huì)遍布無(wú)數(shù)的重復(fù)代碼,系統(tǒng)越往后期就越難維護(hù),最終陷于崩潰。

    2.如果作為后臺(tái)開(kāi)發(fā)人員,看到前臺(tái)已經(jīng)實(shí)現(xiàn)了這個(gè)邏輯,而在前臺(tái)往后臺(tái)傳遞數(shù)據(jù)的時(shí)候,把resident也傳遞進(jìn)來(lái),從而認(rèn)為后臺(tái)就不需

    要重復(fù)這段邏輯,直接拿著前臺(tái)傳過(guò)來(lái)的這個(gè)resident來(lái)進(jìn)行業(yè)務(wù)判斷,那么就可能會(huì)給系統(tǒng)帶來(lái)致命的漏洞,因?yàn)閿?shù)據(jù)在傳輸過(guò)程中,很

    可能被有意或無(wú)意的修改,不在后臺(tái)進(jìn)行業(yè)務(wù)規(guī)則校驗(yàn)這個(gè)錯(cuò)誤是常見(jiàn)的,但也是致命的。


    有一個(gè)原則開(kāi)發(fā)人員特別容易犯,也一定要切記:

    在Web應(yīng)用中,相信客戶端提交的數(shù)據(jù)是正確的,不在業(yè)務(wù)層進(jìn)行校驗(yàn),這是致命的錯(cuò)誤。

    筆者會(huì)在下一篇博文中,詳細(xì)說(shuō)明某國(guó)內(nèi)著名的第三方支付平臺(tái),因?yàn)榉噶诉@個(gè)低級(jí)的錯(cuò)誤,而導(dǎo)致系統(tǒng)出現(xiàn)致命的漏洞,敬請(qǐng)關(guān)注。
    posted on 2010-04-27 21:43 Johnny.Liang 閱讀(4508) 評(píng)論(9)  編輯  收藏 所屬分類(lèi): 系統(tǒng)設(shè)計(jì)

    Feedback

    # re: 一個(gè)非常簡(jiǎn)單的例子,反映了很多開(kāi)發(fā)人員的通病 2010-04-28 04:08 問(wèn)樓上的人
    我覺(jué)得這是此消彼長(zhǎng)的,一切照搬設(shè)計(jì)原則,設(shè)計(jì)出來(lái)的系統(tǒng)并不是最完美的,就像設(shè)計(jì)數(shù)據(jù)庫(kù),最高范式的并不是最好的。他那樣做有一個(gè)好處就是減少一次向服務(wù)端發(fā)送請(qǐng)求,這樣減輕服務(wù)端壓力。1000個(gè)這樣的并發(fā)就可以看出他的性能了。所以在設(shè)計(jì)上,個(gè)人覺(jué)得允許一些耦合是必要的  回復(fù)  更多評(píng)論
      

    # re: 一個(gè)非常簡(jiǎn)單的例子,反映了很多開(kāi)發(fā)人員的通病 2010-04-28 09:07 Johnny.Liang
    @問(wèn)樓上的人
    我非常同意你的看法,設(shè)計(jì)是需求權(quán)衡的,設(shè)計(jì)是一種選擇,我寫(xiě)這篇博文是發(fā)現(xiàn)很多開(kāi)發(fā)人員沒(méi)有這種思想,并不是一刀切的要求都必須按設(shè)計(jì)方式生搬硬套。謝謝你的意見(jiàn)。  回復(fù)  更多評(píng)論
      

    # re: 一個(gè)非常簡(jiǎn)單的例子,反映了很多開(kāi)發(fā)人員的通病 2010-04-28 11:54 grass
    up.up.up.  回復(fù)  更多評(píng)論
      

    # re: 一個(gè)非常簡(jiǎn)單的例子,反映了很多開(kāi)發(fā)人員的通病[未登錄](méi) 2010-04-29 10:30 wpskl
    我認(rèn)為前后臺(tái)驗(yàn)證都是必須的,尤其后臺(tái)驗(yàn)證最為重要。我一般都是前后臺(tái)都驗(yàn)證的。  回復(fù)  更多評(píng)論
      

    # re: 一個(gè)非常簡(jiǎn)單的例子,反映了很多開(kāi)發(fā)人員的通病 2010-04-29 10:42 Johnny.Liang
    @wpskl
    前臺(tái)驗(yàn)證主要看需求和用戶體驗(yàn),如果希望用戶填寫(xiě)信息時(shí)出現(xiàn)錯(cuò)誤馬上得到提醒,就需要做前臺(tái)校驗(yàn),不過(guò)現(xiàn)在的軟件強(qiáng)調(diào)以用戶為中心(UCD)所以你的做法我是贊同的。  回復(fù)  更多評(píng)論
      

    # re: 一個(gè)非常簡(jiǎn)單的例子,反映了很多開(kāi)發(fā)人員的通病 2010-04-30 16:37 sample
    問(wèn)題的根結(jié)是,對(duì)于開(kāi)發(fā)人員,應(yīng)該按照功能模塊劃分開(kāi)發(fā)任務(wù),而不是以程序模塊劃分  回復(fù)  更多評(píng)論
      

    # re: 一個(gè)非常簡(jiǎn)單的例子,反映了很多開(kāi)發(fā)人員的通病 2010-05-01 02:03 leekiang
    做后端驗(yàn)證不是浪費(fèi)時(shí)間、增加成本嗎,在國(guó)內(nèi)是可以不做的。  回復(fù)  更多評(píng)論
      

    # re: 一個(gè)非常簡(jiǎn)單的例子,反映了很多開(kāi)發(fā)人員的通病 2010-05-05 22:04 webclerk
    @leekiang
    Web項(xiàng)目不做后臺(tái)校驗(yàn)的話,就好比一車(chē)不帶手剎一樣,你敢開(kāi)嗎?  回復(fù)  更多評(píng)論
      

    # re: 一個(gè)非常簡(jiǎn)單的例子,反映了很多開(kāi)發(fā)人員的通病 2011-01-01 22:25 wms
    其實(shí)博主的思想是好的,可是這個(gè)例子并不好,并且在此例子中的實(shí)現(xiàn)也并不是非常好的。web開(kāi)發(fā)的復(fù)雜經(jīng)常體現(xiàn)在這個(gè)方面,很多邏輯需要在服務(wù)器端與客戶端重復(fù),并且經(jīng)常是由于客戶體驗(yàn)和性能導(dǎo)致的,因此采用其他更通用的方法,比如代碼自動(dòng)生成等方式可能會(huì)更好  回復(fù)  更多評(píng)論
      

    主站蜘蛛池模板: 亚洲乱码一区av春药高潮| jizz免费一区二区三区| 免费一级一片一毛片| 美女巨胸喷奶水视频www免费| 亚洲AV无码AV男人的天堂| 毛片a级三毛片免费播放| 一区二区免费国产在线观看| 亚洲午夜久久影院| 国产大片51精品免费观看| 国产午夜不卡AV免费| 亚洲乱码在线观看| 亚洲日韩精品射精日| 嫩草影院在线免费观看| 国产在线观看免费视频软件| 亚洲精品无码久久久久YW| 亚洲中文字幕丝袜制服一区| 西西大胆无码视频免费| 成全视频免费观看在线看| 亚洲av无码专区青青草原| 亚洲天堂视频在线观看| 亚洲高清成人一区二区三区| 五月亭亭免费高清在线| 国产高清视频免费在线观看| 亚洲精品天堂在线观看| 亚洲成AV人片在线观看无码 | 亚洲国产精品yw在线观看| 亚洲人成色7777在线观看不卡 | 国产免费观看视频| 37pao成人国产永久免费视频 | 97人伦色伦成人免费视频| 免费网站观看WWW在线观看| 亚洲av成人一区二区三区观看在线| 亚洲国产天堂久久综合网站| 亚洲国产精品一区二区三区久久 | 久久精品女人天堂AV免费观看 | 亚洲一区二区三区乱码A| 成人黄18免费视频| 国产又大又粗又长免费视频| 国产婷婷成人久久Av免费高清 | 美女网站在线观看视频免费的| 国产成人高清亚洲一区91|