天天看點

C++程式設計規範之14:甯要編譯和連接配接時錯誤,也不要運作時錯誤

摘要:

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

    在靜态檢查和動态檢查的問題上分為兩大陣營,靜态檢查陣營有:c++、java,ml,haskell;動态陣營有:smalltalk,ruby,python和lisp。靜态陣營認為采取靜态檢查可以很容易地省去一大類運作時的錯誤處理,進而使程式更加牢靠。動态檢查陣營認為編譯器隻能檢查出一部分潛在的錯誤,是以,既然無論如何都要寫單元測試,那麼根本就無需勞神費心地進行靜态檢查,這樣還能擁有一個寬松的程式設計環境。

    但是,作為靜态檢查陣營的c++,提供了強大的靜态檢查,而對自動運作時檢查的支援很少,是以我們應該盡可能使用c++的優勢工具,同時對于資料和控制流有關的檢查來說,使用運作時檢查也是很明智的選擇。

在編譯和連接配接時的靜态檢查有下列好處: 1.      靜态檢查與資料和控制流無關。 2.      靜态表示的模型更加可靠。 3.      靜态檢查不會帶來運作時開銷。

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

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

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

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

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