c# - if else return python



if/else, хороший дизайн (14)

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

Это приемлемо / хорошо подходит для упрощения этой функции:

bool TryDo(Class1 obj, SomeEnum type)
{
    if (obj.CanDo(type))
    {
        return Do(obj);
    }
    else
    {
        return false;
    }
}

в виде:

bool TryDo(Class1 obj, SomeEnum type)
{
    return obj.CanDo(type) && Do(obj);
}

Вторая версия короче, но, возможно, менее интуитивная.


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


Да.

Особенно с именами, похожими на ваши выбранные имена, то есть CanDoSomething и DoSomething абсолютно понятно любому компетентному программисту, что делает второй код: « если и только если условие выполнено, сделайте что-нибудь и верните результат». «Тогда и только тогда, когда» является основным значением короткозамкнутого оператора && .

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

Но в общем случае два условия могут не формировать такие близкие отношения (как в CanDo и Do ), и было бы лучше разделить их логически, потому что помещение их в одно и то же условие может не сделать интуитивного смысла.

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

С другой стороны, это тесно связанный (хотя и не совсем такой же) код:

if (condition)
    return true;
else
    return false;

это всегда должно быть преобразовано в это:

return condition;

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


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


ИМО это только ОК, если вторая функция не имеет побочных эффектов. Но поскольку Do () имеет побочные эффекты, я бы пошел с if.

Мое правило состоит в том, что выражение не должно иметь побочных эффектов. При вызове функций с побочным эффектом используйте инструкцию.
В этом руководстве возникает проблема, если функция возвращает код ошибки. В этом случае я принимаю присваивание этого кода ошибки переменной или прямо ее возвращаю. Но я не использую возвращаемое значение в сложном выражении. Поэтому, возможно, я должен сказать, что только внешний вызов функции в выражении должен иметь побочный эффект.

См . Блог Эрика Липперта для более подробного объяснения.


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

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


Ни то, что, когда TryDo возвращает False, вы не можете определить, было ли это потому, что «Not CanDo» или «Do return False».

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

Если результат не имеет смысла, намерение будет более ясным с

void TryDo(Class1 obj, SomeEnum type)
{
    if (obj.CanDo(type))
        Do(obj);
    return;
}

Если результат имеет смысл, тогда должен быть способ разграничения двух «ложных» возвратов. IE Что означает «If (! TryDo (x))»?

Изменить: Другими словами, код OP говорит, что «я не умею плавать» - это то же самое, что «я пытался плавать и утонуть»


Никогда не делай этого. Держите его простым и интуитивно понятным.


Укороченная версия скрывает тот факт, что Do делает что-то. Похоже, вы просто делаете сравнение и возвращаете результат, но вы на самом деле делаете сравнение и выполняете действие, и не очевидно, что код имеет этот «побочный эффект».

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


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

Этого можно достичь:

return obj.CanDo(type)? Do(obj) : false;

Или,

if(obj.CanDo(type)) return Do(obj);
return false;

Я нахожу это превосходным, потому что этот же стиль можно тиражировать независимо от типа возврата. Например,

return (array.Length > 1)? array[0] : null;

Или,

return (curActivity != null)? curActivity.Operate() : 0;

Тот же стиль можно также расширить до ситуаций, которые не имеют возвращаемого значения:

if(curSelection != null)
    curSelection.DoSomething();

Мои два цента.


Я думаю, что Class1 Type должен определить, может ли он это сделать, учитывая значение SomeEnum.

Я оставил бы решение о том, может ли он обрабатывать вводные данные для принятия решения:

bool TryDo(Class1 obj, SomeEnum type)
{
    return obj.Do(type));    
}

Я мог бы ненавидеть это, но как насчет:

if (obj.CanDo(type)) return Do(obj);
return false;

Мне не нравится иметь брекеты для одного лайнера.


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

bool TryDo(Class1 obj, SomeEnum type)
{
    bool result = false;

    if (obj.CanDo(type))
    {
        result = Do(obj);
    }

    return result;
}

Держите или удалите фигурные скобки назад вокруг тела инструкции if по вкусу.

Мне нравится этот подход, потому что он иллюстрирует, что результат является false если что-то еще не происходит, и я думаю, что это более ясно показывает, что Do() что-то делает и возвращает логическое значение, которое TryDo() использует в качестве возвращаемого значения.


Мне не нравится этот дизайн, и, возможно, не по понятной причине. Меня это беспокоит. return Do (obj); Для меня нет смысла, чтобы функция Do имела тип возврата bool. Является ли это заменой ошибок, вызывающих ошибку? Скорее всего, эта функция должна быть недействительной или возвращать сложный объект. Сценарий просто не должен появляться. Также, если bool как-то имеет смысл сейчас, он может легко перестать иметь смысл в будущем. С изменением кода вам потребуется больше рефинансирования для исправления





if-statement