Перечисления (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. Как можно понять по названиям, данное перечисление представляет собой результат сравнения двух значений: первое значение может быть меньше/больше/равно второму соответственно.
Встраивание данного типа нужно, чтобы в любой модели работал оператор сравнения, возвращающий значение данного перечисления.
Корректность данных (валидация)
Особых проверок корректности нет. (Кроме очевидного, поддерживаемого на уровне кода: имена значений не должны повторяться внутри одного перечисления).