假设我正在使用C ++。现在我有以下代码:
int flag;
// ...
while (!TimeToExitLoop()) {
Func();
}
while
循环将执行很多次,而Func
是一个时间要求严格的函数,如下所示:
void Func() {
// some big stuff ...
if (flag > 1) {
// logic 1 ...
}
else {
// logic 2 ...
}
}
此外,flag
循环中while
的值不会发生变化。因此,最好将条件if
语句移出while
循环,并为这两个条件定义两个单独的函数:
int flag;
// ...
if (flag > 1) {
while (!TimeToExitLoop()) {
Func_FlagBiggerThanOne();
}
}
else {
while (!TimeToExitLoop()) {
Func_FlagNoBiggerThanOne();
}
}
然而,这会导致Func
和Func_FlagBiggerThanOne
重复Func_FlagNoBiggerThanOne
中的“大事”:
void Func_FlagBiggerThanOne() {
// big stuff ...
// logic 1 ...
}
void Func_FlagNoBiggerThanOne() {
// big stuff ...
// logic 2 ...
}
这将违反不要重复自己的原则。我们不能在某些函数中添加“大东西”,因为调用该函数比原始if
语句更耗时。其中一个解决方案是为那些大的东西定义一个宏,但是如果“逻辑1”和“逻辑2”将使用“大东西”中定义的变量呢?虽然宏仍然可以工作,但这可能导致代码难看,程序的读者可能会想,“这些变量定义在哪里?”
答案 0 :(得分:0)
我们不能把那些“大事”放进去 一些函数,因为调用它 功能将更耗时 比原来的if语句。
我有一个最喜欢的古英语成语:“便士明智的愚蠢”(其中我已经内疚)。另一种表达方式是“不要让小东西流汗”。 我希望我能找到关于SO的原始报价:“理发减肥”。
使代码清洁,如果您可以合理地遵循DRY,请执行此操作。 然后进行性能调整。 This is how I do it. 如果调用该函数的成本或IF语句的成本甚至上升到雷达上,我会感到非常惊讶。
答案 1 :(得分:0)
我只想到一个解决方案。主要想法是使用#ifdef
:
#define FUNC() do { \
// big stuff ...
#ifdef FLAG_BIGGER_THAN_ONE \
// logic 1 ... \
#else \
// logic 2 ... \
#endif \
} while(0)
所以我们可以写出这样的主要逻辑:
int flag;
// ...
if (flag > 1) {
while (!TimeToExitLoop()) {
#define FLAG_BIGGER_THAN_ONE
FUNC();
#undef FLAG_BIGGER_THAN_ONE
}
}
else {
while (!TimeToExitLoop()) {
FUNC();
}
}
然而,正如迈克所说,“最好以相对的方式思考,而不是绝对。如果无法调整”大事“,这样的优化将毫无用处。