Является ли хорошей практикой иметь в функции логический параметр "recursiveCall"? - PullRequest
0 голосов
/ 10 июня 2019

У меня есть функция, которая вызывает себя, но чтобы избежать бесконечной рекурсии, когда функция вызывает себя, я передаю логическую переменную, чтобы она не вызывала себя снова.Однако это также означает, что кто-то, использующий мой код, может использовать функцию и передать ей аргумент true.

class Test
{
public:
  static bool doCheck(int x, bool recursiveCall = false)
private:
  int m_array {10, 5, 3, 25, 12, 0, -6};
  int tracker = 0;
};

bool Test::doCheck(int x, bool recursiveCall)
{
  if (m_array[tracker] > x)
  {
    //do stuff
    ++tracker;
    return true;
  }
  else if (!recursiveCall)
  {
    // reset tracker 
    tracker = 0;
    return doCheck(x, true);
  }

  return false;
}

int main()
{
  Test::doCheck(2); // returns true, m_array[tracker] now equals 5

  // The next call will go through the "else if" part which will reset the tracker
  // and return false, if we didn't call the function as recursive it would call itself infinitely !
  Test::doCheck(50);


  return 0;
}

Редактировать: По запросу я привел лучший пример.Конечно, мы могли бы выполнить m_array[tracker] > x перед повторным вызовом doCheck (), но это означает, что наша проверка будет выполнена дважды, и это может быть проблематично, если мы проверяем некоторые вещи, используя более сложный алгоритм

Это хорошая практикасделать это?

1 Ответ

2 голосов
/ 10 июня 2019

Нет, это плохая идея. Вместо этого переписайте базовый вариант, чтобы он всегда останавливался сам по себе.

Ваш пример никогда не будет разумно повторяться, так что это может быть также

void foo(int x)
{
    if (x > 10)
    { /* Do stuff here */ }
}
...