免责声明:我是一个正在学习编程的非专业人士。从来没有参与过任何项目,也没有写过超过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/

10-12 13:44