Почему хорошо сначала проверять «ложь» в операторе if? - PullRequest
0 голосов
/ 02 ноября 2018

Например, следующий код проверяет сначала ложь, а затем истину. Есть ли какие-либо преимущества в производительности или экономия времени при этом?

if (!touch('some_file.txt', $time)) {
    echo 'Whoops, something went wrong...';
} else {
    echo 'Touched file with success';
}

вместо

if (touch('some_file.txt', $time)) {
    echo 'Touched file with success';
} else {
    echo 'Whoops, something went wrong...';
}

Ответы [ 3 ]

0 голосов
/ 02 ноября 2018

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

if (!$true)
   return false;

long code...

Вместо очень длинных скобок иногда довольно сложно отследить.

0 голосов
/ 02 ноября 2018

На самом деле проверка на «ложь» - это не вопрос производительности, это вопрос цикломатической сложности. Позвольте мне прояснить: Представьте, что вам нужно выполнить 4 или 5 условий, прежде чем вы сможете выполнить действие:

if (condition1 === true) {
    ...code

    if (condition2 === true) {
        ...code

        if (condition3 === true) {
            ...code

            if (condition4 === true) {
                ...code

                if (condition5 === true) {
                    ...code
                    return value;
                }
            }
        }
    }
}

Это было бы очень сложно понять, верно? Теперь давайте применим правило «уйти раньше», проверив «ложь». Код ниже делает то же самое, что и код выше:

if (condition1 === false) {
    return;
}

...code of condition 1 when is true
if (condition2 === false) {
    return;
}


...code of condition 2 when is true
if (condition3 === false) {
    return;
}


...code of condition 3 when is true
if (condition4 === false) {
    return;
}

...code of condition 4 when is true
if (condition5 === false) {
    return;
}

return value;

Видите, как код намного чище и проще для чтения? Это просто потому, что вы сохранили вложенные уровни до минимума, а не накапливали их.

Надеюсь, это ответит на ваш вопрос.

0 голосов

Сначала вы можете проверить правду, но в большинстве случаев вы будете взаимодействовать со своим кодом, если false (например, файл не существует, поэтому вы можете поместить return false в блок if.

А если вы используете if (touch()), вам придется написать много кода в {} блоке

Сравните:

if (touch(file)) {
    //do something...
    // do domething else...
    if (file contensts) {
        //do something....
        //and so on...
        if() {
           // you can continue yourself...
        }
    }
    // continue...
}

и

if (!touch(file)) {
    throw new Error('some error');
    // or return false
}

//do something...
// do domething else...

if (!contents(file)) {
    return false;
}

// continue...

Так что, чтобы придерживаться одного стиля, каждый проверяет false сначала

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