Logo

29 декабря 2013 г.

Отказ от встроенных типов и булевый тип

Объявленный ранее отказ от встроенных типов оказывает большое влияние на булевый тип —единственный конечный тип, значения которого не имеют естественного представления. В других языках программирования значения «ложь» и «истина» обозначаются либо константами, либо ключевыми словами. Как поступить в Канторе?

Ранее, вместе со встроенными типами в Канторе были зарезервированы ключевые слова false и true, упрощавшие, как казалось, вывод типов при объявлении функций. Отказ от встроенных типов заставляет принять решение — либо признать булевский тип исключительным и оставить ключевые слова, либо изъять ключевые слова в пользу констант. Не усложнит ли это объявление булевых функций?

Константы и пространства имен

Основная сложность перехода на булевы константы — размещение класса Boolean в пространстве :Core. Это логично, поскольку булевый тип — один из базовых. Но из других пространств ссылки на константы будут иметь комплексный вид — :Core:Boolean.False и :Core:Boolean.True. На первый взгляд смотрится неудобно, но даже самый простой пример вносит ясность:
:Core:Boolean a = False;
Локальная функция a имеет тип :Core:Boolean, что заставляет компилятор искать объявление False в пространстве класса :Core:Boolean, объявление которого выглядит так:
public final class :Core:Boolean = [False, True];
Данное объявление подразумевает, что свойство False объявлено как статическое (концепция перечислений пока в разработке), поэтому объявление функции a валидно, и она успешно скомпилируется.

Поиск имени в пространстве класса — базовое соглашение видимости имен в Канторе, сильно упрощающее использование перечислимых типов, в том числе Boolean:

Альтернативные способы

Если базовый способ объявления булевых значений по каким-то причинам не подходит, есть как минимум два альтернативных способа — при помощи выражения или же обращением к свойству AsBoolean:
a = 0 == 1;      // выражением, как в SQL
b = 0.AsBoolean; // через свойство
Сравнение констант, дающее предопределенный результат, долгое время было распространено в СУБД, поскольку не влияло на выдачу, но задействовало оптимизатор.

Свойство AsBoolean должно быть реализовано классом, как уже сделано в классе :Core:Word — тип выведен из значения 0.

Практика использования булевых констант

Так ли часто придется явно использовать булевы константы на практике? Видятся следующие случаи:
  • Если при объявлении параметра или свойства задать тип, константа становится видна по короткому имени.
  • Параметры и свойства, имеющие значения по умолчанию, чаще всего опускаются при обращении, если значение по умолчанию подобрано верно.
  • Если булевы свойства и параметры не имеют значений по умолчанию, либо умолчания нужно перекрыть, в точке обращения тип свойства или параметра уже известен компилятору, и к соответствующей константе можно обращаться по короткому имени. Тут действует то же соглашение, что и в первом рассмотренном примере.
Единственная сложность, которая может возникнуть — обращение к перегруженному свойству с булевыми параметрами в перегруженной части. Это относится не только к булевому, но и к любому другому перечислимому типу. При пересечении имен свойств в классах перегруженных параметров возникнет коллизия, и при обращении к свойству придется указывать полное имя константы. Поскольку коллизии возникают при неправильной декомпозиции, это может стать поводом для рефакторинга и нормализации классов.

Текущее состояние

Исходя из перечисленных соглашений и случаев использования, ключевые слова false и true планируется исключить из синтаксиса, приравняв булевый тип к другим перечислимым типам. Для принятия окончательного решения требуется также проработать представление перечислимых типов в ядре (в данной статье оно дано схематично).

Комментариев нет :

Отправить комментарий

Выбрав в выпадающем списке пункт «Имя/URL», можно оставить комментарий от своего имени без предварительной регистрации.