Цикл while - как убрать дублирование кода - PullRequest
0 голосов
/ 18 января 2019

Я не впервые нахожусь в следующей ситуации:

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);

1 Ответ

0 голосов
/ 19 января 2019

Прямое упрощение вашего кода:

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;
  }
  ...
}

Вы также можете создать вспомогательные лямбда-выражения (которые имеют доступ к локальным переменным):

auto fa = [&]() { return some_very_long_computation; };
auto fb = [&]() { return another_very_long_computation; };
while (fa() && fb()) {
  ...
}
...