Это плохая практика, чтобы изменить состояние внутри оператора if? - PullRequest
1 голос
/ 26 ноября 2009

Я написал код, похожий на следующий:

String SKIP_FIRST = "foo";
String SKIP_SECOND = "foo/bar";

int skipFooBarIndex(String[] list){
    int index;
    if (list.length >= (index = 1) && list[0].equals(SKIP_FIRST) ||
        list.length >= (index = 2) && 
        (list[0] + "/" + list[1]).equals(SKIP_SECOND)){
        return index;
    }

    return 0;
}

String[] myArray = "foo/bar/apples/peaches/cherries".split("/");
print(skipFooBarIndex(myArray);

Это изменяет состояние внутри оператора if путем присвоения индекса. Однако моим коллегам это очень не понравилось.

Это вредная практика? Есть ли причина для этого?

Ответы [ 14 ]

0 голосов
/ 26 ноября 2009

В C достаточно часто менять состояние внутри операторов if. Вообще говоря, я считаю, что есть несколько неписаных правил о том, где это приемлемо, например:

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

    int a;
    ...
    if ((a = getchar()) == 'q') { ... }
    
  • Увеличение значения и проверка результата:

    int *a = (int *)0xdeadbeef;
    ...
    if (5 == *(a++)) { ... }
    

А когда это не приемлемо:

По какой-то причине шрифт для разделов, который я пытаюсь пометить как код, не имеет фиксированной ширины в SO, но в шрифте с фиксированной шириной существуют ситуации, когда назначение внутри выражений if является разумным и ясным.

0 голосов
/ 26 ноября 2009

В идеале, каждый кусок кода должен делать одно. Заставить его делать больше, чем одна вещь, может сбить с толку, а запутать - это то, чего вы не хотите в своем коде.

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

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

Отметьте это в коде, который я проверяю, и я отмечу его как дефект.

0 голосов
/ 26 ноября 2009

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

0 голосов
/ 26 ноября 2009

Ну, я потратил некоторое время на чтение выше, не понимая, что происходит. Так что я бы определенно предположил, что это не идеально. Я бы не стал когда-либо ожидать, что сам оператор if () изменит состояние.

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