防御式編程思想 ----《代碼大全》簡要筆記

主要思想:

子程序應(yīng)該不因傳入錯(cuò)誤數(shù)據(jù)而被破壞匈挖, 哪怕是由其他子程序產(chǎn)生的錯(cuò)誤數(shù)據(jù)碾牌;換一種說法是, 程序員應(yīng)該承認(rèn)程序都是有問題的都需要被修改儡循。

保護(hù)程序免遭非法輸入數(shù)據(jù)破壞

軟件開發(fā)領(lǐng)域“垃圾進(jìn)小染,垃圾出”的原則已經(jīng)過時(shí),應(yīng)該做到: 垃圾進(jìn)贮折,什么都不出裤翩;垃圾進(jìn),出錯(cuò)誤提示调榄;不許垃圾進(jìn)踊赠。做法如下:

  • 檢查所有來源于外部的值
  • 檢查子程序所有輸入?yún)?shù)的值
  • 決定如何處理錯(cuò)誤的輸入數(shù)據(jù)
Assertions 斷言

在程序開發(fā)和使用期間,用于程序自檢的代碼即為斷言每庆; 使用斷言可以在程序出現(xiàn)問題時(shí)讓程序員更快速的根據(jù)斷言給出的信息排查問題和原因筐带。
斷言通常含有兩個(gè)參數(shù):一個(gè)描述假設(shè)為真時(shí)的情況的布爾表達(dá)式,一個(gè)斷言為假時(shí)需要顯示的信息缤灵。

建立自己的斷言機(jī)制
使用斷言的指導(dǎo)建議
  • 用錯(cuò)誤處理代碼來處理預(yù)期會發(fā)生的情況伦籍, 用斷言來絕不應(yīng)該發(fā)生的狀況
  • 避免把需要執(zhí)行的代碼放到斷言中
  • 用斷言來注解并驗(yàn)證前后條件
  • 對于高健壯性的代碼蓝晒, 應(yīng)該線使用斷言再處理錯(cuò)誤
錯(cuò)誤處理技術(shù)

可以使用的技術(shù):返回中立值;換用下一個(gè)正確數(shù)據(jù)(如讀取數(shù)據(jù))帖鸦;返回與前次相同的數(shù)據(jù)(如圖像顯示處理)芝薇;換用最接近的合法值(超過預(yù)設(shè)范圍的值);把警告信息記錄到日志文件中作儿;返回一個(gè)錯(cuò)誤碼洛二;調(diào)用錯(cuò)誤處理子程序或?qū)ο螅划?dāng)錯(cuò)誤發(fā)生時(shí)顯示出錯(cuò)信息攻锰;用最妥當(dāng)?shù)姆绞皆诰植刻幚礤e(cuò)誤晾嘶;關(guān)閉程序。

健壯性與正確性

二者在某種意義上是相斥的

高層次設(shè)計(jì)對錯(cuò)誤處理方式的影響
異常 Exceptions

把代碼中的錯(cuò)誤和異常事件傳遞給調(diào)用方代碼的一種特殊手段娶吞。

審慎明智的使用異常:

  • 用異常通知程序的其他部分垒迂,發(fā)生了不可忽略的錯(cuò)誤
  • 只在真正例外的情況下才拋出異常
  • 不能用異常來推卸責(zé)任
  • 避免在構(gòu)造函數(shù)和析構(gòu)函數(shù)中拋出異常, 除非你在同一個(gè)地方把他們捕獲
  • 在恰當(dāng)?shù)某橄髮哟螔伋霎惓#ㄈ鐠伋龈讓赢惓#?/li>
  • 在異常消息中加入導(dǎo)致異常發(fā)生的全部信息
  • 避免使用空的catch語句
  • 了解所有函數(shù)庫可能拋出的異常
  • 考慮創(chuàng)建一個(gè)集中地異常報(bào)告機(jī)制
  • 把項(xiàng)目中對異常的使用標(biāo)準(zhǔn)化
  • 考慮異常的替換方案
隔離程序妒蛇,使之包容由錯(cuò)誤造成的傷害

隔欄机断,一種代碼的容損策略,如常用的: 在輸入數(shù)據(jù)時(shí)將其轉(zhuǎn)化為恰當(dāng)?shù)念愋汀?/p>

輔助調(diào)試的代碼
不要自動(dòng)地把產(chǎn)品版的限制強(qiáng)加于開發(fā)版 之上
盡早引入輔助調(diào)試的代碼 rails中的 pry材部、 debugger等
采用進(jìn)攻式編程

在開發(fā)階段讓異常盡量顯現(xiàn)出來毫缆,而在產(chǎn)品真正運(yùn)行時(shí)能夠自我修復(fù)

計(jì)劃移除調(diào)試輔助的代碼
  • 使用版本控制工具
  • 使用內(nèi)置的預(yù)處理器
  • 編寫你自己的預(yù)處理器
  • 使用調(diào)試存根
確定在產(chǎn)品代碼中該保留多少防御式代碼
  • 保留那些檢查重要錯(cuò)誤的代碼
  • 去掉檢查細(xì)微錯(cuò)誤的代碼
  • 去掉可以導(dǎo)致程序硬性崩潰的代碼
  • 保留可以讓程序穩(wěn)妥崩潰的代碼
  • 為你的技術(shù)支持人員記錄錯(cuò)誤信息
  • 確認(rèn)留在代碼中的錯(cuò)誤信息是友好的
對防御式變成采取防御式姿態(tài)

用防御的姿態(tài)適當(dāng)?shù)囊虻刂埔说氖褂梅烙酱a

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末唯竹,一起剝皮案震驚了整個(gè)濱河市乐导,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌浸颓,老刑警劉巖物臂,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異产上,居然都是意外死亡棵磷,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門晋涣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來仪媒,“玉大人,你說我怎么就攤上這事谢鹊∷惴裕” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵佃扼,是天一觀的道長偎巢。 經(jīng)常有香客問我,道長兼耀,這世上最難降的妖魔是什么压昼? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任求冷,我火速辦了婚禮,結(jié)果婚禮上窍霞,老公的妹妹穿的比我還像新娘匠题。我一直安慰自己,他們只是感情好官撼,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布梧躺。 她就那樣靜靜地躺著,像睡著了一般傲绣。 火紅的嫁衣襯著肌膚如雪掠哥。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天秃诵,我揣著相機(jī)與錄音续搀,去河邊找鬼。 笑死菠净,一個(gè)胖子當(dāng)著我的面吹牛禁舷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播毅往,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼牵咙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了攀唯?” 一聲冷哼從身側(cè)響起洁桌,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎侯嘀,沒想到半個(gè)月后另凌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡戒幔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年吠谢,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诗茎。...
    茶點(diǎn)故事閱讀 38,039評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡工坊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出敢订,到底是詐尸還是另有隱情王污,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布枢析,位于F島的核電站玉掸,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏醒叁。R本人自食惡果不足惜司浪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一泊业、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧啊易,春花似錦吁伺、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至割去,卻和暖如春窟却,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背呻逆。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工夸赫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人咖城。 一個(gè)月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓茬腿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親宜雀。 傳聞我的和親對象是個(gè)殘疾皇子切平,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 防御式編程 在防御式駕駛中要建立這樣一種思維,那就是你永遠(yuǎn)也不能確定另一位司機(jī)將要做什么辐董。這樣才能夠確保在其他人做...
    劉碩jessie閱讀 5,410評論 1 49
  • 第一部分 打好基礎(chǔ) Laying the Foundation 第一章 歡迎進(jìn)入軟件構(gòu)建的世界 Welcome t...
    白樺葉閱讀 4,600評論 0 17
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理悴品,服務(wù)發(fā)現(xiàn),斷路器郎哭,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法他匪,類相關(guān)的語法菇存,內(nèi)部類的語法夸研,繼承相關(guān)的語法,異常的語法依鸥,線程的語...
    子非魚_t_閱讀 31,581評論 18 399
  • 搜集了一些關(guān)于“防御性編程”資料亥至,將其中一些思想備份下,學(xué)習(xí) 軟件工程師的智慧贱迟,就是在于其是否開始意識到:使程序能...
    申申申申申閱讀 1,905評論 1 7