-
Notifications
You must be signed in to change notification settings - Fork 0
Type System
Algebraic data type - основа системы типов:
-
Thing- общий sealed для всех остальных типов в домене -
Abstract- позволяет за собой скрывать разнородные значения -
The- именованные инстансы в текущем домене -
Spec- спецификации, состоящие из полей для наполнения в инстансах -
Plain- плоские типы (числа, строки и т.п.) -
ListиIndex- коллекции всего вышеперечисленного
Плоские типы нужны для использования в домене, как минимальная и неделимая дальше единица спецификации данных.
Ожидается, что разные домены будут использовать разные наборы плоских типов, сводимых к основным.
Вводятся, чтобы уйти от многочисленных "машинных" типов для обозначения чисел. На примере ScalaTypes показано как задать внутренние типы через Number.
Особенность многих ЯП (включая Java, Scala) в том, что они не задают размер строк, т.к. максимальный размер строки в системе - 2Гб - едва ли можно называть "ограничением", ведь даже одна строка такого размера будет доставлять проблемы.
На уровне связей между доменами можно будет пропагировать и вычислять максимальный размер строки в конкретном поле, для этого в Text вводится явное ограничение на размер. ScalaString при этом имеет ограничение java.lang.Integer.MAX_VALUE
Классы Thing, Abstract, Spec, The используются для композиции, построения связей между сущностями домена.
На уровне scala-кода:
-
Thing- sealed trait, extendsADT -
Abstract- case class, extendsThing -
Spec- case class, extendsThing -
The- case class, extendsThing
На уровне объектов в Domain:
-
Thing-Abstract("Thing") -
Abstract-Spec("Abstract", ...) -
Spec-Spec("Spec", ...) -
The-Spec("The", ...)
Переход Thing -> Abstract("Thing") позволяет описать систему в терминах себя, дает возможность само-рефлексии.
- ID = name + package
- вынести
name: StringизThingи всех наследников. Имя сущности, правила доступа по имени зависят от домена. Кроме прочего это уберет дубль между ID и name - перейти на
IDвместоStringвезде, где используются ссылки наThing(особенно вDomain) - в ID внести не только имя, но и пакет (package)
- в местах поиска и подстановки заполнять package текущим, если он не указан
- вынести
- внести поля в
Abstract. Разница отSpecнужна только та, что нельзя создаватьInstanceкроме как соSpecснаружи домена. -
Instance(thing: Thing)вместоInstance(spec: Spec), заменитьTheнаInstanceв домене
Не в ближайших планах, но с условием обратной совместимости:
-
Signatureдля задания сигнатур функций в дополнение кValueSpec -
Constraintsв дополнение (или вместо) isRequired вValueSpec. В принципе это будет открытый набор, который можно еще и пользовательскими проверками дополнять. Как сделать станет лучше понятно в процессе реализации DB Registry где такая конструкция необходима сама по себе для реализации предметной области.