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
) {
  ...
}

如果要保留变量 ab:

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()) {
  ...
}