我可能有点极端,但我不喜欢防御性编程,我认为是懒惰引入了原理。
对于这个特定示例,断言指针不为空是没有意义的。如果你想要一个空指针,没有比使用引用更好的方法来实际执行它(并同时清楚地记录它)。它的文档实际上将由编译器强制执行,并且在运行时不会花费 ziltch!
一般来说,我倾向于不直接使用“原始”类型。让我们举例说明:
void myFunction(std::string const& foo, std::string const& bar);
foo
和的可能值是bar
多少?好吧,这几乎仅限于 astd::string
可能包含的内容......这是非常模糊的。
另一方面:
void myFunction(Foo const& foo, Bar const& bar);
好多了!
- 如果人们错误地颠倒了参数的顺序,它会被编译器检测到
- 每个类单独负责检查值是否正确,用户没有负担。
我倾向于支持强类型。如果我有一个条目应该只由字母字符组成并且最多 12 个字符,我宁愿创建一个包装 a 的小类std::string
,并在内部使用一个简单的validate
方法来检查分配,然后传递该类。通过这种方式,我知道如果我测试验证例程 ONCE,我实际上不必担心该值可以到达我的所有路径 > 当它到达我时它将被验证。
当然,这并不是我不应该测试代码。只是我更喜欢强封装,在我看来,输入的验证是知识封装的一部分。
因为没有任何规则可以毫无例外地出现……暴露的接口必然会被验证代码臃肿,因为你永远不知道会发生什么。但是,对于 BOM 中的自我验证对象,它通常是非常透明的。