Сохранение результата во временной переменной против нескольких точек возврата - PullRequest
1 голос
/ 13 мая 2010

Какая практика лучше вообще и почему? При каких обстоятельствах вы изменили бы свое мнение?

function foo1(int x) {
  int result;
  if (x > 5) {
    result = 2;
  } else {
    result = 7;
  }
  return result;
}

OR

function foo2(int x) {
  if (x > 5) {
    return 2;
  } else {
    return 7;
  }
}

Ответы [ 6 ]

2 голосов
/ 13 мая 2010

первый, потому что его легче регистрировать и отлаживать.

1 голос
/ 20 сентября 2011

Я предпочитаю второй вариант, потому что он побуждает вас думать об одном за раз.

int MyFunction(...)
{
  if ( Simple case 1 )
    return 1;
  if ( Simple case 2 )
    return 2;

  ... evaluate complex cases ...
  return X;
}

Вам не нужно беспокоиться о том, что делает остальная часть функции, если применяется простой случай 1. И как только вы пройдете через это, вам не нужно будет думать о том, что произошло, если применить Простой случай 1.

Это также часто снижает уровень отступов, что делает вещи более линейными и удобными для чтения.

1 голос
/ 15 мая 2010

Первый, по следующим причинам.

  1. Как указано "01", легко регистрировать и отлаживать
  2. Простота рефакторинга

Ваш код всегда должен быть в этом шаблоне ..

  1. Объявление переменных
  2. Инициализация переменных
  3. Обработка
  4. Убирайся !!!!
  5. Возвращение

В этом паттерне другим людям легко понять, как ведет себя ваш код, где искать проблемы, потому что всегда «Делать обработку» - это та часть, где остается ваша бизнес-логика, и вы, безусловно, можете провести рефакторинг 3-го шага, не затрагивая 4-й и пятые.

Если у вас когда-нибудь появится возможность увидеть в значительной степени закодированный «исходный код технологии Windows COM / DCOM», у них всегда будет очень стандартный шаблон использования конструкции Retval, и только с помощью стандартного шаблона одна команда сможет достичь разработки больших и лучших систем, одна Ленивый программист может написать наименьшую логику с точки зрения количества строк, но это никогда не подходит для корпоративных приложений.

Мы тратим много денег на стандартные инструменты кода и даже пишем больше кода, чем часто необходимо, но на уровне предприятия стандартную практику и менее сложные коды лучше поддерживать и расширять.

Сказав это, я согласен с тем, что даже в спешке я не повторяю один и тот же шаблон много раз сам, но я также столкнулся с последствиями: когда код становится больше, логика усложняется, рефакторинг логики становится затруднительным.

Чтобы писать меньше кода, мы используем рефакторинг, но не сложную логику, трудную для понимания.

Даже если вы заявляете или не заявляете Retval, если у вас есть шанс разбери любой код, увидишь этот компилятор всегда объявляет один внутренняя переменная, которая используется для все равно вернитесь.

1 голос
/ 13 мая 2010

Я думаю, что лучше писать код, который всегда выполняется. Например, оператор return в первом примере всегда выполняется. Я держу ветвление до минимума, потому что как бы вы ни старались, ваша программа рано или поздно сломается. Затем вы почесаете голову, пытаясь выяснить, какие if-ветви были выполнены, а какие нет. Почему бы не избежать этого, если разрыв программы настолько вероятен, что это почти факт. :)

1 голос
/ 13 мая 2010

Я предпочитаю вторую форму, куда вы просто возвращаетесь немедленно. Мне известны только следующие соображения. Преимущества:

  • более короткий код
  • Проще следовать
  • Меньше переменных (я думаю, это часть, которой легче следовать)

Риски:

  • Может пропустить обработку очистки, которая происходит после возврата

Я не очень беспокоюсь о риске, потому что этот вид риска существует в любом случае, если вы случайно вложили код очистки в некоторый условный блок, когда вы пытаетесь управлять различными путями выполнения, сохраняя возвращаемое значение до конец. Я думаю, что лучше всего делать код проще и легче следовать, чтобы избежать такого рода рисков. Я думаю, что риску также значительно помогают структуры кодирования, доступные на современных языках, таких как «Использование» и «Попробуйте / Окончательно». Сейчас я стараюсь всегда использовать их для задач очистки, а не просто помещать код в конец блока.

Однако я делаю исключение, когда другой код в любом случае хочет получить доступ к ожидаемому возвращаемому значению в качестве переменной (например, чтобы добавить его в кэш, чтобы в следующий раз результат мог быть возвращен быстрее).

0 голосов
/ 15 мая 2010

или

function foo2(int x) {
  if (x > 5) {
    return 2;
  }
  return 7;
}
...