亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

斷言何時應保留在生產代碼中?

斷言何時應保留在生產代碼中?

忽然笑 2019-10-24 13:59:01
在comp.lang.c ++。moderated上有一個討論,討論是否應將斷言(應在C ++中默認情況下僅存在于調試版本中)保留在生產代碼中。顯然,每個項目都是獨特的,所以在這里我的問題是沒有這么多是否斷言應該保持,但在這情況下,這是值得推薦的/不是一個好主意。斷言是指:一種運行時檢查,用于測試條件,如果條件為false,則表明該軟件存在錯誤。暫停程序的一種機制(可能是在清理工作最少之后)。我不一定要談論C或C ++。我個人的意見是,如果您是程序員,但不擁有數據(大多數商業桌面應用程序就是這種情況),則應保留它們,因為斷言失敗會顯示錯誤,并且您不應該去帶有錯誤,可能會損壞用戶的數據。這迫使您在發貨之前進行嚴格的測試,并使錯誤更明顯,從而更容易發現和修復。您的看法/經驗是什么?干杯,卡爾在這里查看相關問題回應和更新嘿,格雷厄姆,斷言是錯誤,純凈而簡單的斷言,因此應像對待一個斷言一樣處理。由于應該在發布模式下處理錯誤,因此您實際上不需要斷言。這就是為什么我在談論斷言時更喜歡“ bug”一詞的原因。它使事情變得更加清晰。對我來說,“錯誤”一詞太含糊。丟失的文件是錯誤,而不是錯誤,程序應處理該文件。嘗試取消引用空指針是一個錯誤,程序應該承認有些東西聞起來像不好的奶酪。因此,您應該使用斷言測試指針,但是使用正常的錯誤處理代碼來測試文件的存在。話題不大,但在討論中很重要。請注意,如果斷言失敗時您的斷言進入調試器,為什么不這樣做。但是有很多原因導致文件不存在,這完全超出了代碼的控制范圍:讀/寫權限,磁盤已滿,USB設備拔出等。由于您無法控制它,因此我認為是斷言不是正確的處理方式??柾旭R斯是的,我有完整的代碼,必須說我完全不同意該建議。假設您的自定義內存分配器已擰緊,并將零塊仍由其他對象使用的內存清零。我碰巧將一個該對象定期取消引用的指針歸零,其中一個不變因素是該指針永遠不會為null,并且您有幾個斷言來確保它保持這種狀態。如果指針突然為空,該怎么辦。您只是圍繞它if(),希望它能正常工作?記住,我們在這里談論產品代碼,因此不會破壞調試器并檢查本地狀態。這是用戶計算機上的實際錯誤???
查看完整描述

3 回答

?
尚方寶劍之說

TA貢獻1788條經驗 獲得超4個贊

斷言是不會過時的注釋。他們記錄了預期的理論狀態,以及不應發生的狀態。如果更改了代碼,從而聲明允許更改,則開發人員將很快得到通知,并需要更新斷言。


查看完整回答
反對 回復 2019-10-24
?
慕尼黑5688855

TA貢獻1848條經驗 獲得超2個贊

請允許我引用史蒂夫·麥康奈爾的《代碼完成》。關于斷言的部分是8.2。


通常,您不希望用戶在生產代碼中看到斷言消息。斷言主要用于開發和維護期間。斷言通常在開發時編譯到代碼中,并從代碼中編譯出來用于生產。


但是,在同一部分的后面,提供了以下建議:


對于高度健壯的代碼,請斷言然后再處理錯誤。


我認為,只要性能不是問題,就保留斷言,而不是顯示消息,而是將其寫入日志文件。我認為建議也包含在“代碼完成”中,但是我現在找不到。


查看完整回答
反對 回復 2019-10-24
?
明月笑刀無情

TA貢獻1828條經驗 獲得超4個贊

如果您甚至考慮將斷言保留在生產中,那么您可能會認為它們是錯誤的。斷言的全部目的是您可以在生產中將其關閉,因為它們不是解決方案的一部分。它們是一種開發工具,用于驗證您的假設正確。但是當您投入生產時,您應該已經對自己的假設充滿了信心。

就是說,在一種情況下,我會在生產中打開斷言:如果我們在生產中遇到可重現的錯誤,而我們在測試環境中很難進行重現,那么在打開斷言時重現該錯誤可能會有所幫助。在生產中,看看它們是否提供有用的信息。

一個更有趣的問題是:在測試階段,什么時候關閉斷言?


查看完整回答
反對 回復 2019-10-24
  • 3 回答
  • 0 關注
  • 631 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號