Чужой текст:
"
Код
получился универсальным. Он позволит
избежать переписывания старого кода
или его частичного дублирования, если
возникнет необходимость проверить
другие, но близкие по логике требования.
Слова “Выполнить перебор”, “Перебрать
формы” и “Перебрать контролы” продолжат
работать как вместе, так и по отдельности."
"
Особенности
работы с перебором объектов (итераторами).
В
ходе проверки функционала системы при
написании теста часто требуется выполнить
перебор всех форм или конкретных
контролов. Делается это как для поиска
одного определенного объекта, так и для
получения возможности применить ко
всем найденным объектам одно общее
выражение (например, записать имя объекта
и состояние его активности в эталон).
Простой
перебор с использование WORDWORKER будет
выглядеть так:
WORDWORKER
“Перебрать
формы”
WHILE (
… )
(
…
OBJECT VAR Форма
:= ( … )
Форма ( WordToWork
DO
)
)
;
В
данном примере по общим критериям
происходит поиск форм. Каждая из них
присваивается в переменную Форма. К
каждой переменной будет применено
выражение, которое передаст WordToWork DO.
Такое же действие можно выполнить и с
помощью процедуры, но WORDWORKER обладает
явным преимуществом: выражение для
работы с каждой формой будет передаваться
СПРАВА. Код становится близким к
самодокументируемому.
Пример
использования слова:
“Перебрать
формы” ( Действия_для_каждой_найденной
формы )
Используя
приведенное слово можно легко дописывать
функционал для написания тестов.
Например, выведем на печать все контролы
на всех формах:
WORDWORKER
“Перебрать контролы” OBJECT
IN
Форма
WHILE
по_контролам
Форма
( …
( WordToWork DO )
)
;
“Перебрать
формы” (
“Перебрать контролы”
. )
В
данном примере следует помнить, что
передача формы происходит СЛЕВА от
второго WORDWORKER,
а выражение для печати контролов
передается СПРАВА.
Допустим,
требуется найти перебором определенный
контрол и выйти из циклов (т.к. их два:
перебор форм и перебор контролов на
форме). Для этогоне подойдет стандартная
конструкция
EXIT
CONTINUE
BREAK
,т.к. в
каждом WORDWORKER
(как и в каждой процедуре) используется
обработка стандартного исключения:
PROCEDURE “…”
TRY
…
( RAISE EXIT )
…
EXCEPT
if Exception = EXIT then
(
)
else
RAISE
END
;
В
конце выполнения любой процедуры
создается исключение EXIT,
которое, попадая в блок EXCEPT…END,
обрабатывается (исключение “гасится”,
или, другими словами, снимается со
стека). В противном случае, если получаем
другое исключение (например, AV
или ASSERT),
то оно никак не обрабатывается и кладется
в стек. После этого оно начинает
перемещаться в начало стека, пока не
станет первым (пользователь увидит
сообщение об ошибке в системе), или пока
оно не попадет в блок EXCEPT…END,
где описано дальнейшее поведение при
получении именно этого исключения.
При
попытке использовать EXIT
для выхода из перебора контролов
получается, что при выполнении условия
прекращается только текущая итерация
с текущей формой:
“Перебрать
формы” (
“Перебрать контролы”
(
Если ( Условие ) то (
EXIT )
)
)
Для
корректной остановки циклов можно
использовать ASSERT,
но он подойдет не для всех ситуаций.
Следуя логике из вышеизложенного
понятно, что для корректной остановки
перебора объектов следует создать
исключение и вовремя обработать его,
чтобы оно не успело дойти до пользователя.
CONST
cBreak
‘cBreak’
:
“Закончить перебор”
CBreak RAISE
;
WORDWORKER
“Выполнить
перебор”
TRY
( WordToWork DO )
EXCEPT
if
( CurrentException Exception:Message НЕРАВНО
cBreak ) then
(
RAISE )
END
;
В
итоге получаем код:
“Выполнить
перебор” (
“Перебрать формы”
(
“Перебрать контролы”
(
Если ( Условие ) то (
“Закончит перебор” )
)
)
)
Комментариев нет:
Отправить комментарий