Перейти к основному содержимому
Версия: 5.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);