При работе в bash столкнулся с тем, что очень утомительно отслеживать в сложных или больших по обьему скриптах вложенные условия, часто где-то на 4..5 м вложении условия просто уже теряешь мысль - "зачем это делал исходя из предыдущих действий".
Пример типа:
#!/bin/bash
value_in="-1";
if [[ $value_in < 0 ]]
then
if [[ $value_in != 0 ]]
then
if [[ $value_in > 0 ]]
then
...
else
fi
else
fi
else
fi
.......
или
if [[ $value_in < 0 ]]
then
...
fi
if [[ $value_in != 0 ]]
then
...
fi
if [[ $value_in > 0 ]]
then
...
fi
if [[ $value_in == 0 ]]
then
...
fi
.....
В поиске "той самой" ошибки честно уже становится сложно понять собственно - "где"?.. Вот и решил я эту задачу несколько не стандартно, но очень хорошо читаемо и отслеживаемо.. :)
Пример ниже:
#!/bin/bash
## переменная которую мы проверяем...
value_in="-1";
## массив условий которые будут использованы
iFs=( "$value_in < 0 " "$value_in != 0 " "$value_in > 0 " "$value_in == 5 " );
## массив функций которые в соответсвии с условием обработают Then или Else
logic=( '"a0" "a1"' '"b0" "b1"' '"c0" "c1"' '"d0" "d1"' );
## собственно функции обработчики.
function a0() {
echo "run - a0";
}
function a1() {
echo "run - a1";
}
function b0() {
echo "run - b0";
}
function b1() {
echo "run - b1";
}
function c0() {
echo "run - c0";
}
function c1() {
echo "run - c1";
}
function d0() {
echo "run - d0";
}
function d1() {
echo "run - d1";
}
## *****************обработчик событий
function executor() {
if [[ ${#iFs[@]} -eq 0 ]]||[[ ${#iFs[@]} != ${#logic[@]} ]]
then echo "exit";
exit 0;
fi
echo "begin";
exfunc=();
for ((lg_index=0; lg_index != ${#iFs[@]}; lg_index++))
do
## !! debug operation...
echo "execution: function ${iFs[lg_index]}"
lg=$(echo $((${iFs[$lg_index]})) );
exfunc=( ${logic[$lg_index]} );
runfunc=$(echo ${exfunc[$lg]}| sed 's/\"//g');
$runfunc;
done
}
executor;
Здесь применена технология "мгновенного" перехода по индексу имен функций - которые должны выполнять событие согласно условий.
Проще говоря по результату полученному из бинарной операции - получаем индекс и соответсвенно имя исполняемой функции которая и обработает результат. Данная технология используется мной в разных языках программирования, и блестяще показывает быстродействие!
В некоторых языках программирования момент перехода к сожалению невозможно "перехватить" - поэтому приходится вставлять "сигнализатор" в обработчик события.
Пример на языке bash - просто показывает принцип работы. А вот использовать данную технологию можно практически везде. Всем кто читал спасибо. :)
Пример типа:
#!/bin/bash
value_in="-1";
if [[ $value_in < 0 ]]
then
if [[ $value_in != 0 ]]
then
if [[ $value_in > 0 ]]
then
...
else
fi
else
fi
else
fi
.......
или
if [[ $value_in < 0 ]]
then
...
fi
if [[ $value_in != 0 ]]
then
...
fi
if [[ $value_in > 0 ]]
then
...
fi
if [[ $value_in == 0 ]]
then
...
fi
.....
В поиске "той самой" ошибки честно уже становится сложно понять собственно - "где"?.. Вот и решил я эту задачу несколько не стандартно, но очень хорошо читаемо и отслеживаемо.. :)
Пример ниже:
#!/bin/bash
## переменная которую мы проверяем...
value_in="-1";
## массив условий которые будут использованы
iFs=( "$value_in < 0 " "$value_in != 0 " "$value_in > 0 " "$value_in == 5 " );
## массив функций которые в соответсвии с условием обработают Then или Else
logic=( '"a0" "a1"' '"b0" "b1"' '"c0" "c1"' '"d0" "d1"' );
## собственно функции обработчики.
function a0() {
echo "run - a0";
}
function a1() {
echo "run - a1";
}
function b0() {
echo "run - b0";
}
function b1() {
echo "run - b1";
}
function c0() {
echo "run - c0";
}
function c1() {
echo "run - c1";
}
function d0() {
echo "run - d0";
}
function d1() {
echo "run - d1";
}
## *****************обработчик событий
function executor() {
if [[ ${#iFs[@]} -eq 0 ]]||[[ ${#iFs[@]} != ${#logic[@]} ]]
then echo "exit";
exit 0;
fi
echo "begin";
exfunc=();
for ((lg_index=0; lg_index != ${#iFs[@]}; lg_index++))
do
## !! debug operation...
echo "execution: function ${iFs[lg_index]}"
lg=$(echo $((${iFs[$lg_index]})) );
exfunc=( ${logic[$lg_index]} );
runfunc=$(echo ${exfunc[$lg]}| sed 's/\"//g');
$runfunc;
done
}
executor;
Здесь применена технология "мгновенного" перехода по индексу имен функций - которые должны выполнять событие согласно условий.
Проще говоря по результату полученному из бинарной операции - получаем индекс и соответсвенно имя исполняемой функции которая и обработает результат. Данная технология используется мной в разных языках программирования, и блестяще показывает быстродействие!
В некоторых языках программирования момент перехода к сожалению невозможно "перехватить" - поэтому приходится вставлять "сигнализатор" в обработчик события.
Пример на языке bash - просто показывает принцип работы. А вот использовать данную технологию можно практически везде. Всем кто читал спасибо. :)
Комментариев нет:
Отправить комментарий