c++ - 防御性编程是否违反了 DRY 原则?

标签 c++ dry defensive-programming

免责声明:我是一名外行,目前正在学习编程。从未参与过项目,也从未编写过超过 ~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);
    }
}

同样,作为外行,我不知道就性能而言有多少简单的逻辑语句对您不利,但可以肯定的是,防御性编程对程序或灵魂都不利。

最佳答案

违反 DRY 原则的是这样的:

int foo(int bar)
{
    if (bar != /*condition*/)
    {
        //code, assert, return, etc.
    }
}

int main()
{
    int input = 10;
    if (input == /*condition*/)
    {
       foo(input);
       foo(input);
       foo(input);
    }
}

如您所见,问题在于我们在程序中进行了两次相同的检查,因此如果条件发生变化,我们必须在两个地方进行修改,而我们很可能会忘记其中一个,从而导致出现奇怪的行为。 DRY 不是指“不要将相同的代码执行两次”,而是“不要将相同的代码写两次”

关于c++ - 防御性编程是否违反了 DRY 原则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/961297/

相关文章:

c++ - 如何使用 Microsoft PPL 轻量级任务计划程序实现退避?

c++ - libc++ 中的 `__gnu_cxx::temporary_buffer`?

validation - Kotlin:在界面中指定输入约束

ruby - 如何在 Ruby 中进行防御性编程?

c++ - C++ |等 ionic 物理的单元内粒子模拟-标准网格上的泊松方程求解器

c++ - 阻止 GUI 在 Linux 中调用时显示?

django-models - Django 中的 DRY 唯一对象

css - DRY 伪前缀和供应商前缀

ruby-on-rails - Rails - 两个 Controller 或添加 Action ?

c++ - 如何检测 Qt5 中的 QObject::moveToThread() 失败?