我和我的一位同事正在讨论你的代码应该是多么具有防御性.我都是职业防守编程,但你必须知道在哪里停止.我们正在开发一个由其他人维护的项目,但这并不意味着我们必须检查开发人员可以做的所有疯狂事情.当然,你可以这样做,但这会给你的代码增加很大的开销.
你怎么知道在哪里划线?
Ale*_*lli 14
用户直接或间接输入的任何内容,您应始终进行健全性检查.除此之外,assert这里和那里的一些不会受到伤害,但无论如何,对于疯狂的程序员编辑和破坏你的代码,你真的不能做太多! - )
Jar*_*Par 10
我倾向于根据语言改变我在代码中放置的防御量.今天我主要是用C++工作,所以我的想法正朝这个方向漂移.
在C++中工作时,防御性编程就不够了.我把我的代码看作是在守护核机密,而其他程序员都是为了得到它们.断言,抛出,编译器时间错误模板黑客,参数验证,消除指针,深度代码审查和一般偏执都是公平的游戏.C++是一种邪恶的语言,我既爱又严重不信任.
小智 9
我不是"防御性编程"一词的粉丝.对我来说它建议像这样的代码:
void MakePayment( Account * a, const Payment * p ) {
if ( a == 0 || p == 0 ) {
return;
}
// payment logic here
}
Run Code Online (Sandbox Code Playgroud)
这是错误的,错误的,错误的,但我必须看过它数百次.永远不应该使用空指针调用该函数,并且静静地接受它们是完全错误的.
这里的正确方法是值得商榷的,但最小的解决方案是通过使用断言或抛出异常来大声失败.
编辑:我不同意其他一些答案和评论 - 我不认为所有功能都应该检查他们的参数(对于许多功能,这根本不可能).相反,我认为所有函数都应记录可接受的值,并声明其他值将导致未定义的行为.这是最成功和最广泛使用的库所采用的方法 - C和C++标准库.
现在让downvotes开始......
我不知道真的有什么办法可以回答这个问题。这只是你从经验中学到的东西。您只需要问问自己潜在问题的普遍程度并做出判断。同时认为,你不一定必须始终代码防守。有时仅在代码文档中注明任何潜在问题是可以接受的。
但最终,我认为这只是一个人必须遵循他们的直觉的事情。没有正确或错误的方法来做到这一点。