Как правильно создать условие If ... Then



Эти примеры покажут как правильно создавать условия, повышая быстродействие и компактность записи. Быстродействие можно заметить в циклах при повторении операций несколько тысяч раз. Следует учитывать, что условие заданное выражением между операторами If и Then может иметь только два логических состояния Да=1=True или Нет=0=False. Значение 0 или пустая строка "" интерпретируются как Нет=0=False, все остальные положительные или отрицательные числа или не пустая строка интерпретируются как Да=1=True. Приоритет операторов в выражении смотрите в разделе "Операторы"


Избавление от вложенности условий

If $k = 8 Then
    If $z = 5 Then
        Exit
    EndIf
EndIf


; Заменить на одно условие
If $k = 8 And $z = 5 Then
    Exit
EndIf


Последовательное условие с одинаковым результатом

If $k = 8 Then
    Exit
EndIf
If
$z = 5 Then
    Exit
EndIf


; Заменить на одно условие
If $k = 8 Or $z = 5 Then
    Exit
EndIf


Излишнее приравнивание. Вычисляется верность условия 1=1 (верно, и результат 1) или 0=1 (не верно, и результат 0), но возврат успешности функции FileExists уже является результатом верности.

If FileExists($path) = 1 Then Exit
; Заменить на
If FileExists($path) Then Exit


Аналогично предыдущему. Условие заданное выражением между операторами If и Then является одним из двух значения "Да" или "Нет", при этом число 0 приравнивается к Нет=0=False, все остальные значения приравниваются к Да=1=True

If @error<>0 Then Exit
; Заменить на
If @error Then Exit


Аналогично предыдущему. Пустая строка "" приравнивается к Нет=0=False, "не пустая строка" приравнивается к Да=1=True

If $sString <> '' Then Exit
; Заменить на
If $sString Then Exit


Сравнение одного значения с несколькими значениями. Вариант с оператором Switch работает быстрее.

If $k = 3 Or $k = 8 Or $k = 12 Or $k = 43 Or $k = 67 Then Exit

; Заменить на
Switch $k
    Case 3, 8, 12, 43, 67
        Exit
EndSwitch


Инвертирование

If FileExists($path) = 0 Then Exit
; Заменить на
If Not FileExists($path) Then Exit


Инвертирование с перестановкой блоков

If Not FileExists($sPath) Then
    Exit
Else

    FileDelete($sPath)
EndIf

; Заменить на
If FileExists($sPath) Then
    FileDelete($sPath)
Else
    Exit
EndIf


Примеры аналогов

If $k <> 12 Then
If
$k - 12 Then


Примеры аналогов

If $a <> 3 And $b <> 5 And $c <> 7 Then
If Not
($a = 3 Or $b = 5 Or $c = 7) Then


Диапазоны

If $k >= 2 And $k <= 8 Then
    $k = 3
EndIf

; Аналогично
Switch $k
    Case 2 To 8
        $k = 3
EndSwitch


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

Do
    If $Trg Then
        ; ... много кода
        $cg = ClipGet()
        If $cg = 'Завершить' Then ExitLoop
        ; ... много кода
        Exit
    EndIf
Until
1


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

If $n = 5 Then $n = 15
If $n = 3 Then $n = 33
If $n = 8 Then $n = 23

; Заменить на
Switch $n
    Case 5
        $n = 15
    Case 3
        $n = 33
    Case 8
        $n = 23
EndSwitch