Следует ли в выражении If-Else для возврата метода явно указывать Else, если за ним неявно следуют? - PullRequest
6 голосов
/ 20 апреля 2010

У меня есть метод, который проверяет определенные вещи и возвращает логическое значение на основе этих проверок. Он включает в себя один раздел ветвления If, который проверяет около 5 условий в последовательности. Если какое-либо из этих условий вернет true, метод будет return true;. Если ни одно из условий не возвращает true, метод будет return false;. Поскольку код после раздела If будет выполняться только в том случае, если не выполняется ни одно из условий, этот код логически идентичен включению фактического оператора Else.

Так лучше ли в действительности писать в выражении Else такую ​​ситуацию?

EDIT

Оказывается, мне нужна была информация о том, какое условие фактически сработало "true" для некоторых из них, поэтому я изменил метод, чтобы он возвращал int, где -1 представляет "ложную" ситуацию. Логика все еще остается, если ни одно из условий не выполняется, он вернет -1. Таким образом, у меня больше нет опции сгущения return (cond1 || cond2 || cond3 || cond4 || cond5);, но я благодарю всех за это предложение, поскольку я действительно не думал об этом (в первую очередь потому, что cond3 - очень сложное условие, включающее проверку пересечения в средних точках двух пар). объектов DateTime, так что это будет выглядеть ужасно). Хотя природа метода изменилась, природа этого вопроса не изменилась, и все ответы по-прежнему в основном применимы ...

Код в настоящее время перефразирует его и вырезает весь посторонний код, который определяет cond1 - cond5 ...

if (cond1) { return 1; }
else if (cond2) { return 2; }
else if (cond3) { return 3; }
else if (cond4) { return 4; }
else if (cond5) { return 5; }

Ответы [ 7 ]

11 голосов
/ 20 апреля 2010

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

if( a )
   someResult = doSomething();
else if( b )
   someResult = doSomethingElse();
else
   someResult = doSomethingAnyways();

return someResult;

яснее, чем:

if( a )
    return doSomething();
if( b )
    return doSomethingElse();
return doSomethingAnyways();
5 голосов
/ 20 апреля 2010

Я предпочитаю что-то подобное возвращать жесткие значения.

static bool SomeFunc(string arg)
{
    bool result = false;

    if (arg.Length < 10)
    {
        result = true;
    }
    else if (arg.StartsWith("foo"))
    {
        result = true;
    }

    if (!result && arg.EndsWith("foo"))
    {
        result = true;
    }

    return result;
}
4 голосов
/ 20 апреля 2010

Все, что выражает ваше намерение лучше всего и / или является наиболее читабельным.

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

if (condition1)
    return true;
if (condition2)
    return true;
if (condition3)
    return true;
return false;

или

if (condition1)
    return true;
else if (condition2)
    return true;
else if (condition3)
    return true;
else
    return false;

или

return condition1
    || condition2
    || condition3;

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

3 голосов
/ 20 апреля 2010

Лично я обычно предпочитаю использовать ELSE, потому что я думаю, что это делает намерение более ясным. Если вы напишите

if (sensorScan()==ENEMY)
  return FIRE_PHASERS;
else
  return SEND_GREETING;

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

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

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

2 голосов
/ 20 апреля 2010

Звучит так, будто вы спрашиваете:

if ((condition1) ||
   (condition2) ||
   (condition3) ||
   (condition4) ||
   (condition5) )
{
   return true;
}
else
{  return false;
}

можно превратить в это:

if ((condition1) ||
   (condition2) ||
   (condition3) ||
   (condition4) ||
   (condition5) )
{
  return true;
}
return false;

Да.

Рассмотрим это также:

return
   (condition1) ||
   (condition2) ||
   (condition3) ||
   (condition4) ||
   (condition5);
1 голос
/ 20 апреля 2010

Это чисто вопрос стиля и вкуса.

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

if (SomeCondition())
    return "Boxers";
else
    return "Briefs";

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

if (!OvenOn())
    return false;
if (timeRemaining <= 0d)
    return false;
if (DoorOpen())
    return false;
return true;

Эта схема, по-моему, дает наибольшую ясность, на мой взгляд.

1 голос
/ 20 апреля 2010

Трудно сказать, фактически не видя ваш код, но, учитывая, что у вас есть ряд условий, которые выдают true, может быть, было бы понятнее просто выполнить код и получить окончательный return false; в конец:

public bool MyComplicatedTest()
{
    if (complicated_condition1)
    {
        return true;
    }

    if (complicated_condition2)
    {
        return true;
    }
    ....

    return false;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...