信号行为与复制代码块的函数参数?

时间:2017-06-30 04:05:34

标签: c++ performance

我最近读过清洁代码,他们不鼓励的一个概念是传递将行为发送到函数的变量(即一个标志,如果为TRUE,做一件事,如果为FALSE,则做另一件事)。这本书说你应该写两个函数。

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

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

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

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

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

但是,如果我这样做,它可能会运行得更慢。也许它不会产生太大的影响而我会过度思考它?

在这种情况下,最佳做法是什么?使用标志或使用打印功能创建单独的功能?

3 个答案:

答案 0 :(得分:1)

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

我对本书的理解是,在这种情况下你应该避免使用bolean参数:

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。

答案 1 :(得分:1)

如果您主要关注效果,请重新考虑放置if的位置:

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

这个怎么样:

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

if现在有多少次评估? 1 vs #(all letter combinations)

无论如何,这不会改善你的表现,因为它们是可以接受的 完成后,如果...部分很长,请将其放在单独的函数带中,不要重复代码。如果它是一行,请不要关心它 最后,如果要删除布尔标志,请添加第二个函数。这根本不是问题。

答案 2 :(得分:0)

我更喜欢添加null-ostream discarding

#include <iostream>
#include <string>
#include <algorithm>

int
main(int argc, char* argv[]) {
  bool verbose = true;
  std::ostream out(0);
  if (verbose)
    out.rdbuf(std::cout.rdbuf());
  out << "hello" << std::endl;
  return 0;
}