c++ - 表示行为与重复代码块的函数参数?

标签 c++ performance

我最近阅读了 Clean Code,他们不鼓励的一个概念是将表示行为的变量传递到函数中(即一个标志,如果为 TRUE,则做一件事,如果为 FALSE,则做另一件事)。书上说你应该编写两个函数。

同时,复制代码块并不理想。

我编写了一个简单的明文暴力密码破解程序(用于学校项目),它会打印出每个密码。

我想要一种方法来关闭代码的打印部分,以便用户可以选择在打印或不打印的情况下运行它(以减少运行时间)。

我最初的解决方案是这样的:

bool bruteForce(bool printFlag)
{
    for (all letter combinations)
        if (printFlag)
            fwrite(pw, sizeof(char), sizeof(pw) - 1, stdout); 
        ...
}

但是,如果我这样做,它可能会运行得更慢。也许这不会产生太大的影响,而且我想得太多了?

在这种情况下,最佳实践是什么?使用标志或创建具有打印功能的单独函数?

最佳答案

对于这样的话题有很多不同的看法。

我从书中的理解是,在这种情况下应该避免使用带有 bool 参数的函数:

void module(bool enable) // Bad

// Good:
void enableModule();
void disableModule();

这主要是一个可读性问题。

在您的情况下,您应该避免重复代码,具体取决于类结构的其余部分,也许您可​​以使用类变量来启用/禁用标志打印作为单独的函数:

class x {
    public:
        bool bruteForce();
        void enableFlagPrinting() { m_printFlag = true; }
        void disableFlagPrinting()  { m_printFlag = false; }

    private:
        m_printFlag = false;
}

根据代码的其余部分,您可以将 bruteForce 本身作为一个类,并具有它可以具有的所有参数。

class BruteForce {
    public:
        bool start();
        void enableFlagPrinting() { m_printFlag = true; }
        void disableFlagPrinting()  { m_printFlag = false; }

private:
        m_printFlag = false;
}

用作

BruteForce bf;
bf.enableFlagPrinting();
bf.start();

但是,如果我这样做,它可能会运行得更慢。也许这不会产生太大的影响,而且我想得太多了?

鉴于它只是一个额外的 bool 比较,执行速度非常快,我怀疑它与其余代码相比不会产生任何显着差异,尽管如果确实有必要,只要它很好,您可以重复代码封装:

class BruteForce {
    public:
        bool start() 
        { 
            if (m_printFlag) bruteForceWithFlags();
            else bruteForceWithoutFlags();
        }
        void enableFlagPrinting() { m_printFlag = true; }
        void disableFlagPrinting()  { m_printFlag = false; }

private:
        void bruteForceWithFlags();
        void bruteForceWithoutFlags();

        m_printFlag = false;
}

这是速度/可维护性之间的权衡,根据经验,我建议您选择可维护性:P。

关于c++ - 表示行为与重复代码块的函数参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44838415/

相关文章:

c++ - 如何检查显示器是否已插入? (Linux)

c++ - 从 C++ 字符串中删除特殊字符(' 和 - 除外)

c++ - 完善的转发和模板

c++ - 无法将 QML 组合框信号连接到 C++ 插槽

java - 为什么 ".concat(String)"比 "+"快这么多?

java - 我的方法的效率有问题。有什么建议吗?

java - 应用程序服务器过度使用 CPU 的原因

c++ - 如何注册 UPnP 服务

performance - Symfony2 : How can "Initialization time" be reduced?

performance - 标记扫描GC怎么了?