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