Johnny's Collections

          生活總是有太多的無奈與失望,讓我們以在努力學習和工作中獲得的成就感和快樂來沖淡它們。

          BlogJava 首頁 新隨筆 聯系 聚合 管理
            10 Posts :: 0 Stories :: 80 Comments :: 0 Trackbacks

          常用鏈接

          留言簿(6)

          隨筆分類

          隨筆檔案

          收藏夾

          友情鏈接

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          最近在項目中接到一個任務,我負責后臺開發,另一開發人員負責前臺開發。任務非常簡單,請看下面的類圖。



          A和B有一個單向的關聯關系,現在要為A增加一個屬性boolean resident,該屬性值有如下簡單的業務邏輯決定(偽代碼):

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

          前臺的查看頁面需要顯示這個值,當用戶修改a.x或者a.b.x時,要觸發一個事件,實時的在前臺更新resident,后臺需要以這個resident來

          做某些業務邏輯的判斷。

          我們知道,由于resident完全可以由a.x與a.b.x決定,屬于一個冗余數據,不需要顯式的增加該屬性。很快,前臺的那位開發人員就輕松的

          告訴我,這個任務已經寫完了,原來他是在頁面寫了一個JS腳本,當a.x或a.b.x發生改變時,觸發一個onChange()事件,里面就實現了上述

          的邏輯。我一看,感覺問題來了,然后我告訴他,我已經在后臺的服務提供了一個方法,用于判斷resident的值,他應該在事件觸發的時候

          ,通過異步方式調用后臺方法來獲取reisdent的值。他一聽覺得非常奇怪,這么簡單的邏輯,為什么需要使用異步方式去調用后臺這么麻煩

          ,于是我就從設計的角度跟他解釋,resident由 a.x與a.b.x決定,這是一個業務邏輯,從職責劃分的設計原則分析,前臺只負責顯示邏輯,

          業務邏輯屬于后臺的職責。接著,他又提出了疑問,說這里其實只有一行代碼,沒有必要分得那么清,這樣調用不但麻煩,而且性能相對較

          低。

          這個例子,反映出了很多開發人員的通病,沒有真正從事物的本質考慮問題,只從代碼的數量去考慮。

          上述的做法存在兩個問題:

          1.開發人員沒有從職責劃分的角度考慮問題,而只是貪圖一時的方便,或者覺得簡單的一兩行代碼不需要進行設計,但實際上,上面的問題

          必然導致重復代碼。上面的例子,即使只有一行代碼,但在系統的前后臺卻出現了兩份相同的邏輯,假設以后某天業務邏輯發生了變化,那

          么,必須在兩個地方(甚至更多的地方)進行修改、測試,如果漏掉了一個地方,就會導致Bug的出現。作為一個開發人員,如果不注意這些

          細節,隨意的拷貝和重復代碼,長期下來,一個系統就會遍布無數的重復代碼,系統越往后期就越難維護,最終陷于崩潰。

          2.如果作為后臺開發人員,看到前臺已經實現了這個邏輯,而在前臺往后臺傳遞數據的時候,把resident也傳遞進來,從而認為后臺就不需

          要重復這段邏輯,直接拿著前臺傳過來的這個resident來進行業務判斷,那么就可能會給系統帶來致命的漏洞,因為數據在傳輸過程中,很

          可能被有意或無意的修改,不在后臺進行業務規則校驗這個錯誤是常見的,但也是致命的。


          有一個原則開發人員特別容易犯,也一定要切記:

          在Web應用中,相信客戶端提交的數據是正確的,不在業務層進行校驗,這是致命的錯誤。

          筆者會在下一篇博文中,詳細說明某國內著名的第三方支付平臺,因為犯了這個低級的錯誤,而導致系統出現致命的漏洞,敬請關注。
          posted on 2010-04-27 21:43 Johnny.Liang 閱讀(4510) 評論(9)  編輯  收藏 所屬分類: 系統設計

          Feedback

          # re: 一個非常簡單的例子,反映了很多開發人員的通病 2010-04-28 04:08 問樓上的人
          我覺得這是此消彼長的,一切照搬設計原則,設計出來的系統并不是最完美的,就像設計數據庫,最高范式的并不是最好的。他那樣做有一個好處就是減少一次向服務端發送請求,這樣減輕服務端壓力。1000個這樣的并發就可以看出他的性能了。所以在設計上,個人覺得允許一些耦合是必要的  回復  更多評論
            

          # re: 一個非常簡單的例子,反映了很多開發人員的通病 2010-04-28 09:07 Johnny.Liang
          @問樓上的人
          我非常同意你的看法,設計是需求權衡的,設計是一種選擇,我寫這篇博文是發現很多開發人員沒有這種思想,并不是一刀切的要求都必須按設計方式生搬硬套。謝謝你的意見。  回復  更多評論
            

          # re: 一個非常簡單的例子,反映了很多開發人員的通病 2010-04-28 11:54 grass
          up.up.up.  回復  更多評論
            

          # re: 一個非常簡單的例子,反映了很多開發人員的通病[未登錄] 2010-04-29 10:30 wpskl
          我認為前后臺驗證都是必須的,尤其后臺驗證最為重要。我一般都是前后臺都驗證的。  回復  更多評論
            

          # re: 一個非常簡單的例子,反映了很多開發人員的通病 2010-04-29 10:42 Johnny.Liang
          @wpskl
          前臺驗證主要看需求和用戶體驗,如果希望用戶填寫信息時出現錯誤馬上得到提醒,就需要做前臺校驗,不過現在的軟件強調以用戶為中心(UCD)所以你的做法我是贊同的。  回復  更多評論
            

          # re: 一個非常簡單的例子,反映了很多開發人員的通病 2010-04-30 16:37 sample
          問題的根結是,對于開發人員,應該按照功能模塊劃分開發任務,而不是以程序模塊劃分  回復  更多評論
            

          # re: 一個非常簡單的例子,反映了很多開發人員的通病 2010-05-01 02:03 leekiang
          做后端驗證不是浪費時間、增加成本嗎,在國內是可以不做的。  回復  更多評論
            

          # re: 一個非常簡單的例子,反映了很多開發人員的通病 2010-05-05 22:04 webclerk
          @leekiang
          Web項目不做后臺校驗的話,就好比一車不帶手剎一樣,你敢開嗎?  回復  更多評論
            

          # re: 一個非常簡單的例子,反映了很多開發人員的通病 2011-01-01 22:25 wms
          其實博主的思想是好的,可是這個例子并不好,并且在此例子中的實現也并不是非常好的。web開發的復雜經常體現在這個方面,很多邏輯需要在服務器端與客戶端重復,并且經常是由于客戶體驗和性能導致的,因此采用其他更通用的方法,比如代碼自動生成等方式可能會更好  回復  更多評論
            

          主站蜘蛛池模板: 眉山市| 玉树县| 华容县| 林周县| 江华| 儋州市| 阿拉善盟| 宁乡县| 台北县| 阿鲁科尔沁旗| 桐乡市| 定远县| 乳山市| 陇川县| 萨迦县| 若羌县| 汉阴县| 兴宁市| 韶关市| 延寿县| 大宁县| 夏河县| 正安县| 济南市| 梓潼县| 绥化市| 波密县| 洞头县| 澄城县| 松溪县| 平舆县| 大兴区| 潍坊市| 秭归县| 若羌县| 岳普湖县| 成安县| 盘山县| 太谷县| 乐平市| 宁津县|