Вот тут - http://18delphi.blogspot.ru/2013/11/gui-2_7.html я писал про WORDWORKER, WORDWORKERFUNCTION и слова "между" и "строго между".
Но я ещё обещал рассказать про логические операторы.
Сейчас расскажу.
Итак.
У нас было слово "между".
Выглядело оно вот так:
Два вложенных IF. Нормально.
Но как же логические операторы?
Они у нас есть.
На "хардкорном" уровне их использование выглядит так:
От одного IF - избавились.
Но по-моему - всё равно - "ужасно".
Обратная польская запись.
Будем исправлять ситуацию.
Введём слово:
Мы ввели оператор "И" - мало того, что он ИНФИКСНЫЙ, так он ещё и ЛЕНИВЫЙ.
Т.е. он может не вычислять ВСЁ ВЫРАЖЕНИЕ, если уже понятен результат.
Тогда наш пример переписывается так:
Поработаем ещё.
Введём слова:
Тогда наш пример можно переписать вот так:
Ну или в конечном итоге:
Оператор IF - нам стал НЕ НУЖЕН. Он - "скрыт" во вспомогательных словах.
Аналогично:
И:
Вот как-то так...
Понятное дело, что всё это относится и к операторам || и != и т.п. и т.п.
Позже - я ОБЯЗАТЕЛЬНО расскажу - "как это устроено внутри".
P.S. Хочу ещё "краем коснуться" вот этого - "Оператор IF - нам стал НЕ НУЖЕН. Он - "скрыт" во вспомогательных словах." - это - ВАЖНО. По моему ГЛУБОКОМУ убеждению - высокоуровневые тесты - ДОЛЖНЫ быть избавлены от управляющих конструкций типа IF, WHILE, LOOP, TRY и т.д. и т.п.
Они должны представлять собой лишь НАБОР ПОСЛЕДОВАТЕЛЬНЫХ действий. Которые либо проходят, либо - не проходят.
Это - ВАЖНО. НА САМОМ деле - ВАЖНО.
А управляющие конструкции ДОЛЖНЫ БЫТЬ "упакованы" во "вспомогательные слова" словарей.
Ещё раз. ЭТО - ВАЖНО.
Для того, чтобы тесты были понятны и ДЕТЕРМИНИРОВАНЫ.
Но я ещё обещал рассказать про логические операторы.
Сейчас расскажу.
Итак.
У нас было слово "между".
Выглядело оно вот так:
BOOLEAN WORDWORKERFUNCTION между INTEGER IN anX INTEGER VAR "Нижняя граница" INTEGER VAR "Верхняя граница" WordToWork // - слово справа, а на самом деле может быть "последовательность слов", за счёт оператора "скобки" (о нём я расскажу позже) DO // - вычисляем переданное слово =: "Верхняя граница" // - снимаем со стека верхнюю границу =: "Нижняя граница" // - снимаем со стека нижнюю границу anX "Нижняя граница" >= IF ( X "Нижняя граница" <= IF true =: Result ELSE false =: Result ) ELSE false =: Result END //между
Два вложенных IF. Нормально.
Но как же логические операторы?
Они у нас есть.
На "хардкорном" уровне их использование выглядит так:
BOOLEAN WORDWORKERFUNCTION между INTEGER IN anX INTEGER VAR "Нижняя граница" INTEGER VAR "Верхняя граница" WordToWork // - слово справа, а на самом деле может быть "последовательность слов", за счёт оператора "скобки" (о нём я расскажу позже) DO // - вычисляем переданное слово =: "Верхняя граница" // - снимаем со стека верхнюю границу =: "Нижняя граница" // - снимаем со стека нижнюю границу anX "Нижняя граница" >= anX "Верхняя граница" <= && IF true =: Result ELSE false =: Result END //между
От одного IF - избавились.
Но по-моему - всё равно - "ужасно".
Обратная польская запись.
Будем исправлять ситуацию.
Введём слово:
BOOLEAN WORDWORKERFUNCTION И BOOLEAN IN aLeft aLeft IF WordToWork DO IF true =: Result ELSE false =: Result ELSE false =: Result END // И
Мы ввели оператор "И" - мало того, что он ИНФИКСНЫЙ, так он ещё и ЛЕНИВЫЙ.
Т.е. он может не вычислять ВСЁ ВЫРАЖЕНИЕ, если уже понятен результат.
Тогда наш пример переписывается так:
BOOLEAN WORDWORKERFUNCTION между INTEGER IN anX INTEGER VAR "Нижняя граница" INTEGER VAR "Верхняя граница" WordToWork // - слово справа, а на самом деле может быть "последовательность слов", за счёт оператора "скобки" (о нём я расскажу позже) DO // - вычисляем переданное слово =: "Верхняя граница" // - снимаем со стека верхнюю границу =: "Нижняя граница" // - снимаем со стека нижнюю границу ( anX "Нижняя граница" >= ) И ( anX "Верхняя граница" <= ) IF true =: Result ELSE false =: Result END //между
Поработаем ещё.
Введём слова:
BOOLEAN WORDWORKERFUNCTION "меньше или равно" INTEGER IN aLeft aLeft WordToWork DO <= =: Result END // "меньше или равно" BOOLEAN WORDWORKERFUNCTION "больше или равно" INTEGER IN aLeft aLeft WordToWork DO >= =: Result END // "больше или равно"
Тогда наш пример можно переписать вот так:
BOOLEAN WORDWORKERFUNCTION между INTEGER IN anX INTEGER VAR "Нижняя граница" INTEGER VAR "Верхняя граница" WordToWork // - слово справа, а на самом деле может быть "последовательность слов", за счёт оператора "скобки" (о нём я расскажу позже) DO // - вычисляем переданное слово =: "Верхняя граница" // - снимаем со стека верхнюю границу =: "Нижняя граница" // - снимаем со стека нижнюю границу ( anX "больше или равно" "Нижняя граница" ) И ( anX "меньше или равно" "Верхняя граница" ) IF true =: Result ELSE false =: Result END // между
Ну или в конечном итоге:
BOOLEAN WORDWORKERFUNCTION между INTEGER IN anX INTEGER VAR "Нижняя граница" INTEGER VAR "Верхняя граница" WordToWork // - слово справа, а на самом деле может быть "последовательность слов", за счёт оператора "скобки" (о нём я расскажу позже) DO // - вычисляем переданное слово =: "Верхняя граница" // - снимаем со стека верхнюю границу =: "Нижняя граница" // - снимаем со стека нижнюю границу ( anX "больше или равно" "Нижняя граница" ) И ( anX "меньше или равно" "Верхняя граница" ) =: Result END // между
Оператор IF - нам стал НЕ НУЖЕН. Он - "скрыт" во вспомогательных словах.
Аналогично:
BOOLEAN WORDWORKERFUNCTION меньше INTEGER IN aLeft aLeft WordToWork DO < =: Result END // меньше BOOLEAN WORDWORKERFUNCTION больше INTEGER IN aLeft aLeft WordToWork DO > =: Result END // больше
И:
BOOLEAN WORDWORKERFUNCTION "строго между" INTEGER IN anX INTEGER VAR "Нижняя граница" INTEGER VAR "Верхняя граница" WordToWork // - слово справа, а на самом деле может быть "последовательность слов", за счёт оператора "скобки" (о нём я расскажу позже) DO // - вычисляем переданное слово =: "Верхняя граница" // - снимаем со стека верхнюю границу =: "Нижняя граница" // - снимаем со стека нижнюю границу ( anX больше "Нижняя граница" ) И ( anX меньше "Верхняя граница" ) =: Result END // "строго между"
Вот как-то так...
Понятное дело, что всё это относится и к операторам || и != и т.п. и т.п.
Позже - я ОБЯЗАТЕЛЬНО расскажу - "как это устроено внутри".
P.S. Хочу ещё "краем коснуться" вот этого - "Оператор IF - нам стал НЕ НУЖЕН. Он - "скрыт" во вспомогательных словах." - это - ВАЖНО. По моему ГЛУБОКОМУ убеждению - высокоуровневые тесты - ДОЛЖНЫ быть избавлены от управляющих конструкций типа IF, WHILE, LOOP, TRY и т.д. и т.п.
Они должны представлять собой лишь НАБОР ПОСЛЕДОВАТЕЛЬНЫХ действий. Которые либо проходят, либо - не проходят.
Это - ВАЖНО. НА САМОМ деле - ВАЖНО.
А управляющие конструкции ДОЛЖНЫ БЫТЬ "упакованы" во "вспомогательные слова" словарей.
Ещё раз. ЭТО - ВАЖНО.
Для того, чтобы тесты были понятны и ДЕТЕРМИНИРОВАНЫ.
Комментариев нет:
Отправить комментарий