Skip to content

Type System

Gennady Lebedev edited this page Sep 24, 2020 · 7 revisions

Things

ADT

Algebraic data type - основа системы типов:

  • Thing - общий sealed для всех остальных типов в домене
  • Abstract - позволяет за собой скрывать разнородные значения
  • The - именованные инстансы в текущем домене
  • Spec - спецификации, состоящие из полей для наполнения в инстансах
  • Plain - плоские типы (числа, строки и т.п.)
  • List и Index - коллекции всего вышеперечисленного

Plain

Плоские типы нужны для использования в домене, как минимальная и неделимая дальше единица спецификации данных.

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

Size, Number Format

Вводятся, чтобы уйти от многочисленных "машинных" типов для обозначения чисел. На примере ScalaTypes показано как задать внутренние типы через Number.

Text

Особенность многих ЯП (включая Java, Scala) в том, что они не задают размер строк, т.к. максимальный размер строки в системе - 2Гб - едва ли можно называть "ограничением", ведь даже одна строка такого размера будет доставлять проблемы.

На уровне связей между доменами можно будет пропагировать и вычислять максимальный размер строки в конкретном поле, для этого в Text вводится явное ограничение на размер. ScalaString при этом имеет ограничение java.lang.Integer.MAX_VALUE

Композиция

Классы Thing, Abstract, Spec, The используются для композиции, построения связей между сущностями домена.

На уровне scala-кода:

  • Thing - sealed trait, extends ADT
  • Abstract - case class, extends Thing
  • Spec - case class, extends Thing
  • The - case class, extends Thing

На уровне объектов в Domain:

  • Thing - Abstract("Thing")
  • Abstract - Spec("Abstract", ...)
  • Spec - Spec("Spec", ...)
  • The - Spec("The", ...)

Переход Thing -> Abstract("Thing") позволяет описать систему в терминах себя, дает возможность само-рефлексии.

TO-BE

Thing TO-BE

  • 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 где такая конструкция необходима сама по себе для реализации предметной области.

Clone this wiki locally