Author Topic: Оптимизация кода  (Read 1021 times)

0 Members and 1 Guest are viewing this topic.

novhome

  • Освоившийся
  • **
  • Posts: 31
    • View Profile
Оптимизация кода
« on: August 27, 2021, 02:49:06 PM »
Подскажите, есть ли возможность оптимизировать такой код. Когда вложенность небольшая, то все норм. Когда уровней становится много, то сложно не запутаться.

Code: (Clickermann) [Select]
program1()
SWITCH($st1)
CASE(0)
program2()
SWITCH($st2)
CASE(0)
program3()
SWITCH($st3)
CASE(0)
program4()
SWITCH($st4)
CASE(0)
program5()
SWITCH($st5)
CASE(0)
// И так далее
CASE(1)
exit()
END_SWITCH // $st5
CASE(1)
exit()
END_SWITCH // $st4
CASE(1)
exit()
END_SWITCH // $st3
CASE(1)
exit()
END_SWITCH // $st2
CASE(1)
exit()
END_SWITCH //$st1

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Оптимизация кода
« Reply #1 on: August 27, 2021, 06:48:16 PM »
Зачем использовать CASE при двух значениях?
Можно обойтись вложенными IF-ELSE, но это почти те же яйца только в профиль
Code: (clickermann) [Select]
program1()
IF($st1 = 0)
    program2()
    IF($st2 = 0)
        program3()
        IF($st3 = 0)
            program4()
            IF($st4 = 0)
                program5()
                IF($st5 = 0)
                    // И так далее
                ELSE
                    exit()
                END_IF
            ELSE
                exit()
            END_IF
        ELSE
            exit()
        END_IF
    ELSE
        exit()
    END_IF
ELSE
    exit()
END_IF

В твоём случае, даже вложенность не нужна если exit что-то завершает вместе с скриптом. Или в начале заданы все $st1, $st2... = 1
Code: (clickermann) [Select]
program1()
IF($st1 = 1)
    exit()
END_IF

program2()
IF($st2 = 1)
    exit()
END_IF

program3()
IF($st3 = 1)
    exit()
END_IF

program4()
IF($st4 = 1)
    exit()
END_IF

program5()
IF($st5 = 1)
    exit()
END_IF

// И так далее

Смотря что ты хочешь сделать и какой вокруг остальной код. У тебя каждая подпрограмма ставит флаг "вызывать exit() или нет"? Смотря что в это эксите. Если это так и это флаг, то почему вызов exit() не перенести в сами подпрограммы. Вложенность не уберётся, но она станет поприятней
Code: (clickermann) [Select]
program1()
IF($st1 = 0)
    program2()
    IF($st2 = 0)
        program3()
        IF($st3 = 0)
            program4()
            IF($st4 = 0)
                program5()
                IF($st5 = 0)
                    // И так далее
                END_IF
            END_IF
        END_IF
    END_IF
END_IF

Если подпрограммы всегда строго идут в таком порядке, можно пойти дальше и условия работы подпрограммы перенести прямо в них
Code: (clickermann) [Select]
SUB(program2)
    IF($st1 = 0)
        // внутренности
    END_IF
END_SUB
SUB(program3)
    IF($st2 = 0)
         // внутренности
    END_IF
END_SUB
// и т.д.
Тогда код вызова становится совсем прямым
Code: (clickermann) [Select]
program1()
program2()
program3()
program4()
program5()
« Last Edit: August 27, 2021, 06:54:12 PM by Vint »