閱讀230 返回首頁    go 阿裏雲 go 技術社區[雲棲]


C++編程規範之14:寧要編譯和連接時錯誤,也不要運行時錯誤

摘要:

    能夠在編譯時做的事情,就不要推遲到運行時;編寫代碼時,應該在編譯期間使用編譯器檢查不變式,而不應該在運行時再進行檢查。運行時檢查取決於控製流和數據的具體情況,這意味著很難知道檢查是否徹底。相比而言,編譯時檢查與控製流和數據無關,一般情況下都能夠獲得更高的可信度。

    在靜態檢查和動態檢查的問題上分為兩大陣營,靜態檢查陣營有:C++、Java,ML,Haskell;動態陣營有:Smalltalk,Ruby,Python和lisp。靜態陣營認為采取靜態檢查可以很容易地省去一大類運行時的錯誤處理,從而使程序更加牢靠。動態檢查陣營認為編譯器隻能檢查出一部分潛在的錯誤,所以,既然無論如何都要寫單元測試,那麼根本就無需勞神費心地進行靜態檢查,這樣還能擁有一個寬鬆的編程環境。

    但是,作為靜態檢查陣營的C++,提供了強大的靜態檢查,而對自動運行時檢查的支持很少,所以我們應該盡可能使用C++的優勢工具,同時對於數據和控製流有關的檢查來說,使用運行時檢查也是很明智的選擇。

在編譯和連接時的靜態檢查有下列好處:

1.      靜態檢查與數據和控製流無關。

2.      靜態表示的模型更加可靠。

3.      靜態檢查不會帶來運行時開銷。

    有些情況下,可以使用編譯時檢查來代替運行時檢查。

    1.      編譯時布爾條件。如果測試的是編譯時布爾條件,比如sizeof(int) > 8,那麼可以使用靜態斷言取代運行時測試。

    2.      編譯時多態。定義泛型函數或者類型時,考慮用編譯時多態代替運行時多天,前者產生的嗲嗎能夠更好地進行靜態檢查。

    3.      枚舉。在需要表示符號常量或受限數值時考慮定義enum。

向下強製。如果經常使用dynamic_case執行向下強製,則可能說明基類提供的功能太少了。此時可以考慮重新設計接口,使程序能夠用基類表示計算。

最後更新:2017-04-03 12:53:43

  上一篇:go JS中window.open全屏
  下一篇:go 調度子係統4_負載均衡(一)