Булевы типы - PullRequest
       13

Булевы типы

2 голосов
/ 15 апреля 2009

Во время проверки кода я обнаружил много мест нашего кода на C #, которые выглядят так:

if(IsValid()) {
     return true;
}
else {
     return false;
}

или даже "лучше":

return (IsValid()? true : false);

Мне всегда было интересно, почему бы просто не написать код, подобный этому:

return IsValid();

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

Ответы [ 10 ]

15 голосов
/ 15 апреля 2009

Я думаю return IsValid(); - это абсолютно корректный и читаемый код.

Кстати, я бы дал пощечину любому, кто пишет (IsValid() ? true : false) в лицо. Это излишне сложно.

PS. Для этого и предназначена svn blame.

7 голосов
/ 15 апреля 2009

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

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

3 голосов
/ 15 апреля 2009

Если вы рассеянны, легко рефакторинг некоторого кода из этого:

private bool ConsiderTheOstrich()
{
    /* do ostrich things */

    if(someCondition && unpredictableThing == 5)
        return true;
    else
    {
        // log something
        return false;
    }
}

К этому:

private void IsValid() { return (someCondition && unpredictableThing == 5); }

/* ... */

private void ConsiderTheOstrich()
{
    /* do ostrich things */

    if(IsValid())
        return true;
    else
        return false; // ostrichlogger logs it for us now
}

Не замечая дополнительной возможности для краткости.

3 голосов
/ 15 апреля 2009

Причины первых двух примеров полностью человеческие:

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

Нет причин не (я знаю, что это двойной минус) идти с return IsValid();

2 голосов
/ 15 апреля 2009

Первый случай проще, когда вы отлаживаете . Когда вы шагаете по источнику, легче узнать, что является возвращаемым значением, не открывая immediate window или не запуская IsValid();, просто чтобы увидеть возвращаемое значение.

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

return IsValid ();

Наконец, разработчик может быть вынужден использовать первый или второй синтаксис из-за политики компании.

1 голос
/ 15 апреля 2009

return IsValid(); это путь. меньше кода, более лаконично - выбор чемпионов

1 голос
/ 15 апреля 2009

Я бы также просто сказал "return IsValid ();" Я думаю, что вы на 100% правы в этом

0 голосов
/ 15 апреля 2009

Отвлечение

Я знаю, что это происходило в моем коде раньше, и я могу проследить это до того момента, когда я был прерван или не обращал внимания во время кодирования (я исключительно виню ТАК!)

Незнание

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

If (integerA == integerB) { //do special stuff }

//Given integer equality; boolean equality ought to look the same...
If (isValid() == true ) { //do special stuff }

Momentum

Вот как кто-то всегда делал это, и поэтому он продолжает это делать.

0 голосов
/ 15 апреля 2009

Да, конечно, return IsValid(); было бы наиболее оптимальным, если бы у вас был только тот код, который указан выше.

Полагаю, что вступает в игру, а чем еще занимается ваша функция? Остальная часть кода может пролить больше света на то, почему разработчик должен поместить оператор if вокруг IsValid ().

В конце концов, если он просто возвращает IsValid (), то почему вызывающий код просто не проверяет IsValid () напрямую, а не имеет этот метод-обертку.

0 голосов
/ 15 апреля 2009

Я даже иногда вижу этот устаревший код, который я поддерживаю:

bool retValue;
if (IsValid()) 
{
    retValue = true;
}
else 
{
    retValue = false;
}

return retValue;

Некоторые программисты платят персонажу?

...