Перейти к основному содержимому
Версия: 4.x

Ветвление (CASE, IF, MULTI)

Оператор ветвления создает действие, которое для набора условий определяет, какое из этих условий выполняется, и вызывает соответствующее этому условию действие.

Все условия задаются как некоторые свойства и / или параметры. Соответственно, условие выполняется, если значение свойства или параметра, с помощью которого задается условие, не равно NULL.

Полиморфная форма

Также в этом операторе существует возможность не задавать условие явно, а использовать в качестве условия принадлежность сигнатуре соответствующего этому условию действия. Такую форму оператора выбора будем называть полиморфной.

Взаимоисключаемость условий

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

Стоит отметить, что такая проверка является не более чем подсказкой платформе (для лучшей оптимизации) и определенным самоконтролем со стороны разработчика. Однако, при этом использование такой проверки позволяет во многих случаях сделать код более прозрачным и читабельным (особенно в полиморфной форме оператора выбора).

Неявное задание

У этого оператора есть возможность неявного задания с помощью техники расширений, что позволяет, в частности, реализовывать полиморфизм в том виде, в котором это обычно принято делать в ООП.

Одиночная форма

Оператор ветвления в одиночной форме проверяет ровно одно условие. Если это условие выполняется, то вызывается указанное действие. Также существует возможность указать альтернативное действие, которое будет вызвано, если условие не выполняется.

к сведению

Тип взаимоисключения и неявное задание для этой формы оператора не имеют смысла / не поддерживаются

Язык

Для объявления действия, реализующего ветвление в общем случае, используется оператор CASE. Для ветвления в одиночной форме используется оператор IF, в полиморфной - оператор MULTI.

Примеры

test = DATA INTEGER (INTEGER);
caseActionTest(a) {
CASE
WHEN test(a) > 7 THEN MESSAGE '>7';
WHEN test(a) > 6 THEN MESSAGE '>6';
WHEN test(a) > 5 THEN MESSAGE '>5';
}
// Действие, сравнивающее значение свойства count с числом 3 и выдающее пользователю сообщение
moreThan3(obj) {
IF count(obj) > 3 THEN
MESSAGE '>3';
ELSE
MESSAGE '<=3';
}

checkNullName (Store st) {
IF NOT name(st) THEN
MESSAGE 'Name is null';
}
CLASS Shape;

CLASS Square : Shape;
CLASS Circle : Shape;

message (Square s) { MESSAGE 'Square'; }
message (Circle c) { MESSAGE 'Circle'; }

message (Shape s) = MULTI message[Square](s), message[Circle](s);