Классы

Классы представляют собой категории/типы сущностей (объектов), которые могут присутствовать в предметной области. Классы определяют, какие свойства присущи их объектам, а также какими отношениями они могут связаны.

Пример класса:

//Класс с именем "Element"
class Element {
	//Свойство класса, с именем "countOfTokens" и типом int в диапазоне 1-2
	class prop countOfTokens: int[1,2] ;
	//Свойство объектов класса, с именем state и типом State (это enum)
	obj prop state: State ;

	//Отношение, которую могут иметь объекты класса с именем "has",
	// связывает объекты данного класса с объектами типа Token как "один-ко-многим"
	rel has(Token) : {1 -> *} ;
} 

В коде классы представлены классом ClassDef.
Состав базовой хранимой информации:

  • Имя класса (ClassDef.name)
  • Имя родительского класса (ClassDef.parentName)
  • Определяемый данным классом набор свойств (ClassDef.declaredProperties)
  • Определенные для класса значения свойств (ClassDef.definedPropertyValues)
  • Определяемый данным классом набор отношений (ClassDef.declaredRelationships)
  • Связанные с классом метаданные (ClassDef.metadata)

Наследование

Подобно классам в ООП языках, классы в нашей модели домена могут указывать родительский класс, от которого они наследуются (поля ClassDef.parentClassName и ClassDef.parentClass). Такой класс может быть только один - множественное наследование в системе не поддерживается.

//Родительский класс Animal, имеет свойство age
class Animal {
	obj prop age: int[0, 100] ;
}

//Дочерний класс Pet, наследуется от Animal
//имеет свойство родительского класса, а также добавляет свое свойство и отношения
class Pet : Animal {
	obj prop name: string ;
	rel hasOwner(Human) {* -> 1} ;
}

В случае наследования, дочерний класс получает все свойства и отношения, определенные в его родителе (и родителях родителя).

В общем, стандартная модель наследования ООП классов, знакомая из, например, Java (за исключением правил наследования классовых свойств)

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

Корректность класса состоит из:

Полнота

В случае указания родительского класса, он должен присутствовать в модели.

Валидность

В цепочке наследования класса не должно быть рекурсии (т.е. класс не может быть дочерним/родительским для самого себя).