文章來源地址http://www.zghlxwxcb.cn/news/detail-749476.html
1.?編寫可維護的代碼
1.1.?生產(chǎn)環(huán)境下的軟件必須一直保持可用的狀態(tài)
1.1.1.?用戶行為不可預測,網(wǎng)絡不可靠,事情總會出錯
1.2.?編寫可維護的代碼有助于你應對不可預見的情況,可維護的代碼有內(nèi)置的保護、診斷和控制
1.2.1.?切記通過安全和有彈性的編碼實踐進行防御式編程來保護你的系統(tǒng),安全的代碼可以預防許多故障,而有彈性的代碼可以在故障發(fā)生時進行恢復
1.2.1.1.?切記讓你的代碼安全而有彈性
1.2.1.2.?編寫擁有良好防御性的代碼是一種對那些運行你的代碼的人(包括你自己?。└挥型樾牡谋憩F(xiàn)
1.2.1.3.?防御性的代碼較少發(fā)生故障,就算它發(fā)生故障,也更有可能恢復
1.2.1.4.?安全的代碼利用編譯時的校驗來避免運行時的故障,使用不可變的變量、限制范圍的訪問修飾符和靜態(tài)類型檢查工具來防止bug
1.2.2.?一個可維護的系統(tǒng)具有可配置參數(shù)和系統(tǒng)工具
1.2.3.?你需要在不修改代碼的情況下控制系統(tǒng)
1.2.4.?將日志、指標和跟蹤的調(diào)用信息暴露出來可以方便診斷
2.?避免空值
2.1.?沒有值的變量默認為null(或nil、None或其他一些變體)
2.2.?通過檢查變量是否為空,通過使用空對象模式(null object pattern),或通過可選類型(option type)來避免空指針異常
2.2.1.?空對象模式會使用一個對象來代替空值
2.3.?切記在方法的開頭進行空值檢查
2.3.1.?可以使用NotNull注解和編程語言中類似的特性
2.3.2.?在前面校驗變量是否為空意味著后面的代碼可以安全地假定它是在處理真實的值,這將使你的代碼更干凈、更易讀
3.?保持變量不可變
3.1.?不可變的變量一旦被賦值就不能被改變
3.1.1.?不可變的變量可以防止意外的修改
3.2.?使用不可變的變量可以使并發(fā)編程變得更簡單,而且當編譯器或運行環(huán)境知道變量不會改變時就可以運轉(zhuǎn)得更有效率
4.?使用類型提示和靜態(tài)類型檢查器
4.1.?限制變量可以被賦的值
4.2.?靜態(tài)類型檢查器在代碼執(zhí)行之前會使用類型提示來發(fā)現(xiàn)潛在bug,所以配合靜態(tài)類型檢查器一起使用,你就可以防止運行時出現(xiàn)故障
5.?驗證輸入
5.1.?永遠不要相信你的代碼接收的輸入
5.2.?校驗輸入的值可以避免出現(xiàn)意外
5.3.?開發(fā)人員、有問題的硬件和人為的錯誤都會破壞輸入的數(shù)據(jù)
5.3.1.?計算機硬件并不總值得信賴,網(wǎng)絡和磁盤可能會損壞數(shù)據(jù)
5.3.2.?不要忽視安全問題,外部輸入是危險的
5.3.2.1.?惡意用戶可能試圖在輸入中注入代碼或SQL,或撐爆緩沖區(qū)以獲得對你的應用程序的控制權限
5.4.?通過校驗輸入的正確性去保護你的代碼
5.4.1.?用先決條件、校驗和(checksum)以及校驗數(shù)據(jù)合法性
5.4.1.1.?如果你需要強大的耐久性保證,使用校驗和的方式來檢查數(shù)據(jù)沒有意外的變化
5.4.2.?套用安全領域中的最佳實踐
5.4.2.1.?強制轉(zhuǎn)義輸入的字符來防止SQL注入攻擊
5.4.2.2.?在使用strcpy(特別是strncpy)等命令操作內(nèi)存時,明確地設置緩沖區(qū)的大小,以防止緩沖區(qū)溢出
5.4.2.3.?使用廣泛采用的安全與密碼類庫或協(xié)議,而不是自己去編寫這樣的類庫或協(xié)議
5.4.2.4.?熟悉開放式Web應用程序安全項目(open Web application security project,OWASP)的十大安全報告以快速建立你的安全知識體系
5.4.3.?使用工具來發(fā)現(xiàn)常見的錯誤
5.4.3.1.?使用成熟的類庫和框架來防止跨站腳本攻擊
5.4.4.?盡可能地提早拒絕不良輸入
5.5.?使用前置條件和后置條件的方式來校驗方法中輸入的變量
5.5.1.?當你使用的數(shù)據(jù)類型不能完全地捕獲有效的變量值時,可以使用校驗前置條件的類庫和框架
6.?善用異常
6.1.?有彈性的代碼使用異常處理中的最佳實踐來優(yōu)雅地處理故障
6.2.?不要使用特殊的返回值來標識錯誤類型(如null、0、?1等)
6.3.?異常要有精確含義
6.3.1.?精確的異常使代碼更容易使用
6.3.2.?盡可能地使用內(nèi)置的異常,避免創(chuàng)建通用的異常
6.3.2.1.?如果一個內(nèi)置的異常可以描述問題,就不要創(chuàng)建自定義的異常
6.3.2.2.?當你創(chuàng)建自己的異常時,不要把它們弄得太通用
6.3.2.2.1.?通用的異常很難處理,因為開發(fā)人員并不知道他們正面臨什么樣的具體問題
6.3.3.?使用異常處理來應對故障,而不是控制應用程序的運行邏輯
6.3.3.1.?不要在應用程序的運行邏輯中使用異常
6.3.4.?使用異常來跳出方法常常令人困惑,并且使代碼難以調(diào)試
6.3.4.1.?你的代碼是不出人意料的,而不是聰明的
6.4.?早拋晚捕
6.4.1.?遵循“早拋晚捕”的原則來處理異常
6.4.2.?“早拋”意味著在盡可能接近錯誤的地方引發(fā)異常,這樣開發(fā)人員就能迅速地定位相關的代碼
6.4.3.?“晚捕”意味著在調(diào)用的堆棧上傳播這個異常,直到你到達能夠處理異常的程序的層級
7.?智能重試
7.1.?在故障發(fā)生之后,系統(tǒng)處于什么狀態(tài)并不總顯而易見
7.1.1.?面對一個錯誤時,適當反應往往是簡單地再試一次就好
7.1.2.?不要盲目地重試所有失敗的調(diào)用,尤其是那些寫入數(shù)據(jù)或可能觸發(fā)一些業(yè)務流程的調(diào)用
7.2.?最單純的重試方法是捕捉到一個異常馬上就進行重試
7.3.?謹慎的做法是使用一種叫作“退避”(backoff)的策略
7.3.1.?退避會非線性地增加休眠時間(通常使用指數(shù)退避,如(retry number)^2)
7.4.?構建冪等系統(tǒng)
7.4.1.?處理重試的最好方法是構建冪等系統(tǒng)
7.4.2.?一個冪等的操作是可以被進行多次并且仍然產(chǎn)生相同結果的操作
8.?及時釋放資源
8.1.?當故障發(fā)生后,要確保清理所有的資源,釋放你不再需要的內(nèi)存、數(shù)據(jù)結構、網(wǎng)絡套接字和文件句柄
8.2.?所謂網(wǎng)絡套接字泄露,是指在使用后沒有關閉它們
8.2.1.?網(wǎng)絡套接字泄露會使無用的連接一直存在,從而填滿連接池
文章來源:http://www.zghlxwxcb.cn/news/detail-749476.html
到了這里,關于讀程序員的README筆記04_防御式編程的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!