Какой синтаксис лучше для возвращаемого значения?

StackOverflow https://stackoverflow.com/questions/139739

  •  02-07-2019
  •  | 
  •  

Вопрос

Я проводил масштабную проверку кода и повсюду замечаю следующую закономерность:

public bool MethodName()
{
    bool returnValue = false;
    if (expression)
    {
        // do something
        returnValue = MethodCall();
    }
    else
    {
        // do something else
        returnValue = Expression;
    }

    return returnValue;
}

Я бы сделал это не так, я бы просто вернул значение, когда знал, что оно такое.какой из этих двух шаблонов более правильный?

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

Это было полезно?

Решение

На эту тему идет долгое обсуждение здесь.

Другие советы

Многие люди рекомендуют иметь только одну точку выхода из ваших методов.Шаблон, который вы описали выше, соответствует этой рекомендации.

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

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

Я бы использовал тройную систему, чтобы уменьшить структуры управления...


return expression ? MethodCall() : Expression;

Подозреваю, что буду в меньшинстве, но мне нравится стиль, представленный в примере.IMO, легко добавить оператор журнала и установить точку останова.Кроме того, при последовательном использовании кажется проще «сопоставить шаблон», чем иметь несколько возвратов.

Однако я не уверен, что на этот вопрос существует «правильный» ответ.

Некоторые учебные заведения и книги пропагандируют практику однократного возврата.

Лучше или нет – это субъективно.

Это выглядит как часть плохого ООП-дизайна.Возможно, его следует провести рефакторинг на более высоком уровне, чем внутри одного метода.

В противном случае я предпочитаю использовать тернарный оператор, например:

return expression ? MethodCall() : Expression;

Он короче и читабельнее.

Немедленный возврат из метода в любой из этих ситуаций:

  1. Вы нашли граничное условие и вам необходимо вернуть уникальное или контрольное значение: if (node.next = null) return NO_VALUE_FOUND;
  2. Требуемое значение/состояние имеет значение false, поэтому остальная часть метода не применяется (так называемое защитное предложение).Например.: if (listeners == null) return null;
  3. Цель метода — найти и вернуть определенное значение, например: if (nodes[i].value == searchValue) return i;
  4. Вы находитесь в предложении, которое возвращает уникальное значение из метода, не используемое где-либо еще в методе: if (userNameFromDb.equals(SUPER_USER)) return getSuperUserAccount();

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

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

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

Я предполагаю, что программист взял за основу определение объекта toReturn в верхней части метода (например, List<Foo> toReturn = new ArrayList<Foo>();), а затем заполнил его во время вызова метода, и каким-то образом решил чтобы применить его к логическому возвращаемому типу, что является странным.

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

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

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

Delphi применяет этот шаблон, автоматически создавая переменную с именем «Result», которая будет иметь тип возвращаемого значения функции.Каким бы ни был «Результат» при выходе из функции, это ваше возвращаемое значение.Таким образом, ключевого слова «возврат» вообще нет.

function MethodName : boolean;
begin
  Result := False;
  if Expression then begin
    //do something
    Result := MethodCall;
  end
  else begin
    //do something else
    Result := Expression;
  end;

  //possibly more code
end;

Используемый шаблон является подробным, но его также легче отлаживать, если вы хотите узнать возвращаемое значение, не открывая окно «Регистры» и не проверяя EAX.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top