我最近阅读了 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/