Read Sean

          Read me, read Sean.
          posts - 508, comments - 655, trackbacks - 9, articles - 4

          導航

          公告


          • 關于我
          • 人生是一場對話
          • gaoyuxiang AT gmail DOT com
          • titlelogo.png

          • 我的譯作
          • Scala for the Impatient
          • Open Source SOA
          • Programming in Scala

          • 聲明
          • 所有文章和代碼在這里以"現狀"提供,作者不提供任何形式的擔保,也沒有授予除閱讀和有條件共享之外的任何權利。除非特別說明,所有文章均為本blog作者原創(chuàng),如需轉載請注明出處和原作者,如用于商業(yè)目的,需作者本人書面許可。

          • 推薦文章
          • Pylons起步

          常用鏈接

          留言簿(29)

          隨筆分類(842)

          隨筆檔案(507)

          文章檔案(4)

          Friends' blogs

          搜索

          •  

          積分與排名

          • 積分 - 782072
          • 排名 - 54

          最新評論

          閱讀排行榜

          評論排行榜

          Learn to be defensive

          Posted on 2007-01-25 00:03 laogao 閱讀(1381) 評論(1)  編輯  收藏 所屬分類: On JavaProgramming in General

          作為開發(fā)者,我們必須要學會defensive programming,尤其是對要求高可靠性和無人職守的企業(yè)級應用中,需要特別留意我們的設計和編碼,必須盡可能做到足夠defensive。

          什么是defensive programming?舉個大家都看過的例子:

          String str = ...
          if ("".equals(str)) {}

          在這里我們不寫str.equals("")而是反過來,就是為了防止出現不必要的NPE – NullPointerException。

          運行期異常是最最需要特別關照的一種非正常狀況,除了像上面這類要求我們采用相對較好的編碼習慣之外,為了減少運行期異常的發(fā)生,通常也需要使用try-catch代碼塊來把我們相對脆弱,或者需要格外保護的邏輯包起來,對于外部傳進來的參數,一定要assert它們的合法性,即assert它們是否能夠安全的被后面的邏輯所使用。

          通常意義上,defensive programming主要cover的是避免不必要的運行期異常發(fā)生。我們可以更進一步,更廣義的運用defensive programming的核心思想:在企業(yè)應用中,除了運行期異常,對于有些看似嚴重的極端的錯誤,如網絡超時,連接丟失,數據庫提交失敗等情況,需要我們具體問題具體分析,并非所有checked exception都一定需要我們去一一catch然后處理。更多的時候,尤其當開發(fā)無人職守的后臺程序,我們可以采取重試、報告、修改外部數據等方式處理,能夠自行解決的,就不要動不動就報錯,或等待用戶確認,不能自行解決的,則要及時報告并停止運行,避免更大的錯誤發(fā)生。

          舉個相對具體的例子,兩個異構的系統(tǒng),通過一個中間層的消息平臺相互發(fā)送消息,通信協(xié)議采用最基本的socket方式,這三個系統(tǒng)隨時都可能出現宕機或鏈接中斷的情況。為了保證數據的完整性,我們拿其中一個需要發(fā)送和接收消息的系統(tǒng)來細說:

          一個可能的實現方式是:該系統(tǒng)所有要發(fā)送的消息保存到數據庫,給它一個初始狀態(tài);另一個獨立進程從數據庫按照時間先后拿出消息,更新拿出的這條消息的狀態(tài)為處理中,并嘗試發(fā)送消息;成功后根據需要,更新消息狀態(tài)為成功發(fā)送或者直接刪除,如果遇到失敗或異常,消息恢復為初始狀態(tài),線程sleep一段時間,然后再次嘗試,多次嘗試或者嘗試跨度超過一定時間范圍,則停止處理,向管理員匯報(通過郵件、短信等途徑)。對于接收到的消息,同樣是先存入數據庫,然后再由后續(xù)的進程用類似的方式取出并處理。如果程序崩潰,可以自動重新啟動(應用或整個服務器)。這樣不管哪一段通信線路出現故障或阻塞,或者宕機,系統(tǒng)都可以一步一個腳印,確保任務主動而自動的執(zhí)行,并且忠實記錄下有價值的狀態(tài)信息,出現問題時管理員可以很直觀的看到在哪個環(huán)節(jié)出現故障,從而快速找到問題關鍵并有效解決。

          Defensive programming可以讓我們的應用更健壯,在保證數據正確性、完整性的前提下,面對困難也能更加獨立自主。和defensive programming相關的話題我想大家如果感興趣,可以展開更多更深入的探討,這里只是給大家做個介紹性的鋪墊,能拋磚引玉當然更好。


          Feedback

          # re: Learn to be defensive  回復  更多評論   

          2007-01-25 15:42 by 小車馬
          不錯,繼續(xù)關注。。。

          潛力貼論壇:http://content.uu1001.com
          主站蜘蛛池模板: 南靖县| 锦州市| 辽阳市| 犍为县| 迭部县| 红河县| 南皮县| 屏南县| 萨迦县| 育儿| 南昌市| 红河县| 甘肃省| 娱乐| 龙江县| 贵溪市| 水富县| 湟中县| 前郭尔| 旬阳县| 南充市| 来凤县| 安阳县| 奉贤区| 监利县| 绥化市| 闵行区| 兰坪| 广宁县| 连城县| 洛浦县| 古田县| 米泉市| 闽侯县| 科技| 和林格尔县| 长宁区| 镇巴县| 苏尼特右旗| 永兴县| 阜新|