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

Корректность данных (валидация)

Особых проверок корректности нет. (Кроме очевидного, поддерживаемого на уровне кода: имена значений не должны повторяться внутри одного перечисления).