четверг, 19 июня 2014 г.

Про скрипты, итераторы и обработку исключений. Черновик

Чужой текст:

"
Особенности работы с перебором объектов (итераторами).

В ходе проверки функционала системы при написании теста часто требуется выполнить перебор всех форм или конкретных контролов. Делается это как для поиска одного определенного объекта, так и для получения возможности применить ко всем найденным объектам одно общее выражение (например, записать имя объекта и состояние его активности в эталон).
Простой перебор с использование 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, которое, попадая в блок EXCEPTEND, обрабатывается (исключение “гасится”, или, другими словами, снимается со стека). В противном случае, если получаем другое исключение (например, AV или ASSERT), то оно никак не обрабатывается и кладется в стек. После этого оно начинает перемещаться в начало стека, пока не станет первым (пользователь увидит сообщение об ошибке в системе), или пока оно не попадет в блок EXCEPTEND, где описано дальнейшее поведение при получении именно этого исключения.
При попытке использовать EXIT для выхода из перебора контролов получается, что при выполнении условия прекращается только текущая итерация с текущей формой:

Перебрать формы” (
Перебрать контролы” (
Если ( Условие ) то ( EXIT )
)
)

Для корректной остановки циклов можно использовать ASSERT, но он подойдет не для всех ситуаций.
Следуя логике из вышеизложенного понятно, что для корректной остановки перебора объектов следует создать исключение и вовремя обработать его, чтобы оно не успело дойти до пользователя.

CONST cBreakcBreak
: “Закончить перебор”
CBreak RAISE
;
WORDWORKER “Выполнить перебор
TRY
( WordToWork DO )
EXCEPT
if ( CurrentException Exception:Message НЕРАВНО cBreak ) then
( RAISE )
END
;

В итоге получаем код:

Выполнить перебор” (
Перебрать формы” (
Перебрать контролы” (
Если ( Условие ) то ( “Закончит перебор” )
)
)
)

Код получился универсальным. Он позволит избежать переписывания старого кода или его частичного дублирования, если возникнет необходимость проверить другие, но близкие по логике требования. Слова “Выполнить перебор”, “Перебрать формы” и “Перебрать контролы” продолжат работать как вместе, так и по отдельности."

Комментариев нет:

Отправить комментарий