免责声明:我是一个正在学习编程的非专业人士。从来没有参与过任何项目,也没有写过超过500行的内容。
我的问题是:防御性编程是否违反了“不要重复自己”的原则?假设我对防御性编程的定义是正确的(具有调用函数来验证输入而不是相反的输入),那对您的代码有害吗?
例如,这不好吗:
int foo(int bar)
{
if (bar != /*condition*/)
{
//code, assert, return, etc.
}
}
int main()
{
int input = 10;
foo(input); //doesn't the extra logic
foo(input); //and potentially extra calls
foo(input); //work against you?
}
与此相比:
int main()
{
if (input == /*condition*/)
{
foo(input);
foo(input);
foo(input);
}
}
同样,作为一个外行,我不知道就性能而言,有多少简单的逻辑语句对您不利,但是防御性编程肯定对程序或灵魂不利。
最佳答案
这一切都归结为界面提供的契约(Contract)。有两种不同的方案:输入和输出。
输入-并且我基本上是指函数的参数-应该由实现作为一般规则进行检查。
至少在我看来,输出(即返回结果)应基本上被调用方信任。
所有这些都受到这个问题的约束:如果一方违反契约(Contract)会发生什么?例如,假设您有一个接口(interface):
class A {
public:
const char *get_stuff();
}
并且该契约(Contract)规定永远不会返回空字符串(最坏的情况下它将是一个空字符串),那么这样做是安全的:
A a = ...
char buf[1000];
strcpy(buf, a.get_stuff());
为什么?好吧,如果您错了,并且被调用者返回null,则程序将崩溃。没关系。如果某个对象违反了其契约(Contract),那么通常来说,结果应该是灾难性的。
过度防御的风险是,您编写了很多不必要的代码(可能引入更多的错误),或者吞下了您本不应该的异常,从而实际上掩盖了一个严重的问题。
当然,情况可以改变这一点。
关于c++ - 防御性编程是否违反DRY原理?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/961297/