While 循环 - 如何删除代码重复
While loop - how to remove code duplication
我不是第一次发现自己遇到以下情况:
bool a = some_very_long_computation;
bool b = another_very_long_computation;
while (a && b) {
...
a = some_very_long_computation;
b = another_very_long_computation;
}
我不想在 while
条件下计算所有内容,因为计算很长而且我想给它们适当的名称。
我不想创建辅助函数,因为计算使用了很多局部变量,并且将它们全部传递会使代码的可读性大大降低(它将是 some_huge_call)。
不知道循环体是否会至少执行一次。
在这种情况下,什么是好的模式?目前我在 C++ 中遇到它,但我在其他语言中也遇到过这个问题。我可以通过使用额外的变量 isFirstPass
来解决它,但它看起来很难看(而且,我想,会引起一些警告):
bool a, b;
bool isFirstPass = true;
do {
if (!isFirstPass) {
...
} else {
isFirstPass = false;
}
a = some_very_long_computation;
b = another_very_long_computation;
} while (a && b);
你的代码直接简化为:
while (
some_very_long_computation &&
another_very_long_computation
) {
...
}
如果要保留变量 a
和 b
:
bool a, b;
while (
(a = some_very_long_computation) &&
(b = another_very_long_computation)
) {
...
}
如果不想把条件放到while
条件中:
while (true) {
bool a = some_very_long_computation;
bool b = another_very_long_computation;
if (!(a && b)) {
break;
}
...
}
您还可以创建辅助 lambda(可以访问局部变量):
auto fa = [&]() { return some_very_long_computation; };
auto fb = [&]() { return another_very_long_computation; };
while (fa() && fb()) {
...
}
我不是第一次发现自己遇到以下情况:
bool a = some_very_long_computation;
bool b = another_very_long_computation;
while (a && b) {
...
a = some_very_long_computation;
b = another_very_long_computation;
}
我不想在 while
条件下计算所有内容,因为计算很长而且我想给它们适当的名称。
我不想创建辅助函数,因为计算使用了很多局部变量,并且将它们全部传递会使代码的可读性大大降低(它将是 some_huge_call)。
不知道循环体是否会至少执行一次。
在这种情况下,什么是好的模式?目前我在 C++ 中遇到它,但我在其他语言中也遇到过这个问题。我可以通过使用额外的变量 isFirstPass
来解决它,但它看起来很难看(而且,我想,会引起一些警告):
bool a, b;
bool isFirstPass = true;
do {
if (!isFirstPass) {
...
} else {
isFirstPass = false;
}
a = some_very_long_computation;
b = another_very_long_computation;
} while (a && b);
你的代码直接简化为:
while (
some_very_long_computation &&
another_very_long_computation
) {
...
}
如果要保留变量 a
和 b
:
bool a, b;
while (
(a = some_very_long_computation) &&
(b = another_very_long_computation)
) {
...
}
如果不想把条件放到while
条件中:
while (true) {
bool a = some_very_long_computation;
bool b = another_very_long_computation;
if (!(a && b)) {
break;
}
...
}
您还可以创建辅助 lambda(可以访问局部变量):
auto fa = [&]() { return some_very_long_computation; };
auto fb = [&]() { return another_very_long_computation; };
while (fa() && fb()) {
...
}