Инструкция BEFORE
Инструкция BEFORE - вызов действия перед вызовом другого действия.
Синтаксис
BEFORE action(param1, ..., paramN) DO aspectAction;
Описание
Инструкция BEFORE задает действие (будем называть его аспектом), которое будет вызываться перед вызовом указанного действия.
Аспект получает те же значения параметров, что и основное действие, и выполняется перед его телом при каждом вызове этого действия. Если аспект завершается оператором RETURN, тело основного действия не выполняется, как и его остальные аспекты, включая аспекты инструкции AFTER, - так аспект отменяет вызов, например после проверки условия; для вызвавшего действия вызов при этом завершается обычным образом, и оно продолжает работу со следующего действия. Несколько аспектов одного действия выполняются в порядке объявления.
Параметры
-
actionИдентификатор действия, перед которым будет вызываться аспект.
-
param1, ..., paramNСписок имен параметров действия. Каждое имя задается простым идентификатором. К этим параметрам можно обращаться при задании аспекта.
-
aspectActionКонтекстно-зависимый оператор-действие, описывающий аспект.
Примеры
changeName(Sku s, STRING[100] name) { name(s) <- name; }
// Сообщение будет показано перед каждым вызовом changeName
BEFORE changeName(Sku s, STRING[100] name) DO MESSAGE 'Changing user name';
quantity = DATA NUMERIC[16,3] (Sku);
deleteSku(Sku s) { DELETE s; }
// Проверка перед удалением: при положительном остатке удаление не выполняется, а вызвавшее действие продолжает работу
BEFORE deleteSku(Sku s) DO {
IF quantity(s) > 0 THEN {
MESSAGE 'Sku has a stock balance';
RETURN;
}
}