Работаем над скриптом
#9
Нам нужно сделать один элементарный логический блок эмулирующий «ИЛИ», с минимальным вариантом ветвлений, чтобы можно было сразу блок идентифицировать, отследить логику в одном блоке ElseIF.
Здесь у тебя только ELSE а блок ElseIF получится черти где, и сверху и снизу, в общем правила получаются универсальными. Мы повторим универсальность, которая и без того есть в скрипте. Нам нужно создать правила для написания конкретных логических блоков, к конкретному логическому элементу, состоящему из одной скрипт-процедуры.
<Список команд IF> В этом месте ты вставляешь оптимизацию, это ты как программист уже пытаешься оптимизировать систему выполнения скрипта, а этим будет заниматься генератор скрипта. Задачу оптимизации мы пока не ставим, это отдельная задача. Во время генерации скрипта, генератор проанализирует скрипт и сгруппирует вызовы процедур, если надо. В общем, ты написал именно так, как у Нивала есть сейчас. Таким элементарным блоком представлена логика IF, ELSE, а нам нужно IF, ELSEIF, ELSEIF, ….. В самом обработчике скрипта зарезервирована возможность обработки условия ELSEIF, просто Нивальский конструктор почему-то был реализован на сложную схему эмулирования IF, ELSEIF и последовательность ELSEIF неиспользуется как логический элемент.
Опять же, мы немного отклоняемся в сторону. Так как первоначально я завел тему об отсутствии логики «ИЛИ» в скрипте, а здесь мы уже говорим сразу о трех логических элементах: защите от повтора выполнения процедуры, IF, ELSEIF и простого блока IF, ELSE.
Хорошо. Я использую это отступление, чтобы показать на этом примере от чего нам нужно отказаться. Так как ты написал, у Нивала получается сразу все, и кейс, и зависимые условия и последовательность, и все, все, все. То есть, глядя на этот кусок кода нельзя сказать с уверенностью, что какая-то другая процедура не вызывает какую-то часть этого виртуального кейса. Например, кто нам мешает вызвать кусок кода из третьей процедуры, т.е. коды, которые будут в списке: <Список команд ELSE>. Так мы получаем неоднозначность, а если в коде неоднозначность, то это не элементарный блок, а составной блок. Получается, что мы не получим «CASE» как логическую единицу, а будем думать, что это кейс хотя на самом деле это будет просто несколько процедур завязанных в цепочку, где любой сторонний скрипт можем втесаться, и даже создать бесконечный цикл в такой последовательности. Поэтому если говорить о IF, ELSEIF, то его нужно делать в одной процедуре скрипта, с признаками, что это скрипт IF, ELSEIF.
Script VCheck #0#1
(
If
(
<Список условий IF>
)
then
(
KillScript()
<Список вызова скрипт триггеров IF>
)
If
(
<Список условий ELSEIF>
)
then
(
KillScript()
<Список вызова скрипт триггеров ELSEIF>
)
If
(
)
then
(
KillScript()
<Список вызова скрипт триггеров ELSE>
)
)

Итог.
Речь не идет об оптимизированном коде, где мы упростим, свяжем и закрутим связи друг на друга и так далее, речь идет о логическом элементе «ИЛИ» в строке условий! При этом нам нужно «перелопатить» скрипт, чтобы идентифицировать логику уже имеющихся процедур и конвертировать оптимизированную логику у нивала в явный логический вид, пусть даже умышленно увеличивая кол-во повторяющихся процедур.
Ответ


Сообщения в этой теме
Работаем над скриптом - от sun - 07.05.2003, 10:13

Перейти к форуму:


Пользователи, просматривающие эту тему: 1 Гость(ей)