我最近读过清洁代码,他们不鼓励的一个概念是传递将行为发送到函数的变量(即一个标志,如果为TRUE,做一件事,如果为FALSE,则做另一件事)。这本书说你应该写两个函数。
同时,复制代码块并不理想。
我写了一个简单的明文强力密码破解程序(用于学校项目),它打印出每个密码。
我想要一种关闭代码打印部分的方法,因此用户可以选择使用打印或不打印来运行它(以减少运行时间)。
我最初的解决方案是这样的:
bool bruteForce(bool printFlag)
{
for (all letter combinations)
if (printFlag)
fwrite(pw, sizeof(char), sizeof(pw) - 1, stdout);
...
}
但是,如果我这样做,它可能会运行得更慢。也许它不会产生太大的影响而我会过度思考它?
在这种情况下,最佳做法是什么?使用标志或使用打印功能创建单独的功能?
答案 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;
}