Какой синтаксис лучше для возвращаемого значения? - PullRequest
4 голосов
/ 26 сентября 2008

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

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

    return returnValue;
}

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

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

Ответы [ 13 ]

4 голосов
/ 26 сентября 2008

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

3 голосов
/ 26 сентября 2008

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

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

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

2 голосов
/ 26 сентября 2008

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

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

2 голосов
/ 26 сентября 2008

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


return expression ? MethodCall() : Expression;

1 голос
/ 20 октября 2008

Возврат из метода сразу в любой из следующих ситуаций:

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

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

1 голос
/ 26 сентября 2008

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

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

return expression ? MethodCall() : Expression;

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

1 голос
/ 26 сентября 2008

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

Субъективно ли это лучше или нет.

0 голосов
/ 26 сентября 2008

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

0 голосов
/ 26 сентября 2008

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

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;
0 голосов
/ 26 сентября 2008

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

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

...