Перечисления (Enum)
Перечисления - это задаваемые пользователем (автором предметной области) типы данных, имеющих конечное (перечислимое) количество именованных значений. Они используются в первую очередь как настраиваемые типы данных для свойств.
Пример перечисления и его использования:
//Перечисление "Направление"
enum Direction {
//Значения перечисления
//Значение "вверх"
UP,
//Значение "вниз"
DOWN,
//Значение "влево"
LEFT,
//Значение "вправо"
RIGHT
}
//Класс "Указатель"
class Pointer {
//Свойство "направление указателя", имеющие тип перечисления "Направление"
obj prop pointDirection : Direction;
}
//Объект класса "Указатель"
obj myPointer : Pointer {
//Свойство объекта принимает значение "Направление:вверх"
pointDirection = Direction:UP ;
}
Стоит отметить, что в отличие от, например, Java, перечисления в нашей модели не являются классами, а значения перечисления - не являются объектами. Перечисления и их значения это отдельно задаваемый тип данных, не связанный с системой классов/объектов.
В коде определения перечислений представлены классом EnumDef
Состав базовой хранимой информации:
- Имя перечисления (
EnumDef.name
) - Значения перечисления (
EnumDef.values
) - Связанные с перечислением метаданные (
EnumDef.metadata
)
Значения перечислений представлены классом EnumValueDef
Состав базовой хранимой информации:
- Имя перечисления, которому значение принадлежит (
EnumValueDef.enumName
) - Имя самого значения (
EnumValueDef.name
) - Связанные со значением метаданные (
EnumValueDef.metadata
)
Что нужно знать про перечисления
Да особо ничего :) Они весьма простые, выше в принципе вся необходимая информация.
За исключением...
"Встроенные" перечисления
Перечисления являются единственным типом сущности в системе, для которых задаются так называемые "встроенные значения" - определения, которые всегда есть в любой модели.
Вкратце о самом термине: в теории, возможность добавить встроенные значения присутствует для любого типа сущностей (см. DefContainer#addBuiltIn
), но реализована она только для перечислений. Встроенные значения не считаются в общем количестве определений, и не выводятся в различных видах записи (например, LOQI), но присутствуют в соответствующих контейнерах, и могут быть получены методом get
, по имени.
Для перечислений такое значение одно: перечисление под названием Comparison
, которое имеет значения Comparison:less
, Comparison:greater
и Comparison:equal
. Как можно понять по названиям, данное перечисление представляет собой результат сравнения двух значений: первое значение может быть меньше/больше/равно второму соответственно.
Встраивание данного типа нужно, чтобы в любой модели работал оператор сравнения, возвращающий значение данного перечисления.
Корректность данных (валидация)
Особых проверок корректности нет. (Кроме очевидного, поддерживаемого на уровне кода: имена значений не должны повторяться внутри одного перечисления).