Перейти к основному содержимому
Версия: 7.0

Правила: свойства

Правила свойств

  1. Ассистент НЕ ДОЛЖЕН объявлять свойство, если оно используется только один раз.

    Исключение: свойство всё же можно объявить, если оно добавляется на форму.

  2. Каждый параметр свойства ДОЛЖЕН использоваться в его выражении. Неиспользуемые параметры запрещены.

  3. Ассистент ОБЯЗАН предполагать стандартное распространение NULL для выражений свойств: если любой параметр равен NULL, результат равен NULL.

    Исключения, которые НЕ обнуляют результат при одном операнде NULL: операторы выбора — OVERRIDE, возвращающий первый не-NULL операнд, и IF ... THEN ... ELSE, у которого устойчиво к NULL именно УСЛОВИЕ: условие NULL уводит в ветку ELSE, а не-NULL возвращает значение THEN как есть, поэтому IF TRUE THEN NULL ELSE 1 — это NULL, — MIN / MAX, устойчивая к NULL арифметика (+) / (-), конкатенация CONCAT (операнд NULL пропускается вместе со своим разделителем) и агрегаты GROUP (GROUP SUM, GROUP MAX и т. д.) — операнд или значение NULL пропускается, а не распространяется. OR, NOT и XOR тоже не распространяют: не-NULL операнд читается как TRUE, поэтому NULL OR TRUE — это TRUE, а NOT NULL — тоже TRUE. Распространяет как раз AND: он возвращает TRUE, только когда оба операнда не NULL, поэтому TRUE AND NULL — это NULL. GROUP LAST пропускает NULL, только пока у него нет WHERE: условием служит как раз не-NULL-ность агрегируемого выражения. При явном WHERE строка, ему удовлетворяющая, отдает свое значение, даже если это значение NULL.

    Эти исключения всё же дают NULL, когда:

    • все операнды или агрегируемые значения равны NULL — кроме NOT, весь смысл которого в том, чтобы ответить там TRUE;
    • (+) / (-) или GROUP SUM даёт 0 (нулевой результат возвращается как NULL).
  4. Ассистент НЕ ДОЛЖЕН использовать GROUP AGGR внутри произвольных выражений.

    GROUP AGGR допустим только в определениях свойств.

    Рассуждая о нём, ассистент ОБЯЗАН трактовать GROUP AGGR как GROUP MAX с дополнительным ограничением.

  5. Ассистенту СЛЕДУЕТ избегать лишних условий, когда семантика языка уже даёт требуемый результат.

  6. Ассистент НЕ ДОЛЖЕН создавать свойство, выражение которого равно одному из его параметров.

  7. Ассистент НЕ ДОЛЖЕН создавать несколько свойств с идентичными выражениями.

  8. Если свойство вычисляется из другого свойства, но имеет другие параметры, ассистенту СЛЕДУЕТ постараться сохранить то же имя свойства.

  9. Чтобы проверить, что свойство равно NULL, ассистенту СЛЕДУЕТ использовать IF NOT property(...).

    Чтобы проверить, что оно не NULL, ассистенту СЛЕДУЕТ использовать IF property(...).

  10. Ассистенту СЛЕДУЕТ указывать CHARWIDTH в определении свойства, а не в дизайне формы.

Для простой композиции свойства, которая лишь пробрасывает другое свойство, ассистенту НЕ СЛЕДУЕТ повторять CHARWIDTH на производном свойстве, если оно не должно отличаться.

  1. Для статических объектов ассистент НЕ ДОЛЖЕН использовать свойства staticCaption или staticName.

    Вместо них ассистент ОБЯЗАН использовать caption и name.

    Это касается и записи: caption и name — простые композиции над хранимыми заголовком и именем, поэтому присваивание в них проходит в хранимое свойство. Заголовок статического объекта присваивается через caption; имя менять нельзя — изменение name запрещено системным ограничением.

  2. Имена свойств СЛЕДУЕТ делать краткими и избегать лишних слов.

  3. Ассистенту НЕ СЛЕДУЕТ использовать в имени свойства слова, дублирующие имена классов параметров, кроме случаев, когда это нужно для ясности.

  4. Ассистенту НЕ СЛЕДУЕТ указывать явное пространство имён для свойства без необходимости.

  5. Создавая для собственного атрибута одного объекта DATA-свойство — или простую композицию от DATA-свойства (например, когда тянется имя связанного объекта), — ассистент ОБЯЗАН осознанно решить, относить ли его к системной группе id или base через IN.

    Атрибуты, образующие бизнес-идентификацию объекта и показываемые в его представлении, СЛЕДУЕТ относить к группе id; прочие основные атрибуты — к группе base (id вложена в base).

    Свойство НЕ СЛЕДУЕТ помещать в id или base, когда оно не является собственным основным атрибутом объекта.

  6. При делении значений целочисленных классов ассистент ОБЯЗАН приводить к NUMERIC один из операндов, а не результат.

    Отношение двух целых чисел — целочисленное деление, поэтому внешнее приведение вида NUMERIC[16,4](a * b / c) молча отбрасывает дробную часть; правильная форма — NUMERIC[16,4](a) * b / c.

  7. Класс в объявлении параметра (prop(SubClass x)) — это сигнатура, а не фильтр времени выполнения: он разрешает одноимённые свойства и задаёт сигнатуру, но вычисляемое множество определяется свойствами, использованными в выражении. Чтение свойства родительского класса с параметром, объявленным классом-потомком, всё равно идёт по ВСЕМ объектам родительского класса (например, в GROUP SUM — молча неверные итоги).

    Чтобы ограничить множество классом, ассистент ОБЯЗАН добавить явное условие x IS SubClass (или использовать свойство, объявленное на этом классе-потомке).

  8. В операторе GROUP ... BY ассистент НЕ ДОЛЖЕН перечислять в блоке BY верхние параметры, использованные в выражениях оператора: каждый такой параметр уже неявно является группировкой — параметром создаваемого свойства — и остаётся на своём месте в сигнатуре.

    При явном списке параметров слева BY-выражения отображаются по порядку только на параметры, не использованные в выражениях; несовпадение количества или классов даёт ошибку.

Правила абстрактных свойств (+=)

  1. Класс значения реализации += ОБЯЗАН укладываться в класс значения, объявленный у абстрактного свойства; неявного приведения нет — реализация с более широким классом отвергается при старте сервера с ошибкой «wrong value class of implementation».

    Выражение, расширяющее класс значения, — прежде всего конкатенацию строк, складывающую длины операндов (ISTRING[326] при объявленном ISTRING[250]), — ассистент ОБЯЗАН обернуть в явное приведение к объявленному классу: f(X x) += ISTRING[250](a(x) + b(x));

Правила упорядочивания (ORDER)

  1. Там, где две строки могут разделить ключ порядка, а ответ зависит от того, какая из них победит, — какая из двух строк одной даты станет GROUP LAST, какую из двух строк равного приоритета возьмет TOP 1, на какую шагнет назад PARTITION PREV, — ассистент ОБЯЗАН выписать различитель явно, обычно сам объект: ORDER date(d), d.

    Для части таких случаев платформа дополняет неполный порядок сама, поэтому симптомом будет не разброс от запуска к запуску, а то, что выбрана та строка, которую отбирает служебный порядок по интерфейсам, — а его предметная область не просила. Выписанный различитель и делает выбор задуманным.

  2. Накопительный PARTITION SUM ... ORDER без TOP и OFFSET — тот случай, когда различитель добавлять по привычке НЕ ДОЛЖНО. Его рамка по умолчанию дает всем строкам с одинаковым ключом порядка одно и то же накопленное значение. Добавленный различитель меняет результат — с итога на группу равных ключей на итог на строку, — а это решение о предметной области, а не мера предосторожности. Под TOP или OFFSET действует обычное правило 1: они отбирают строки, и какие именно — стоит сказать.

  3. PARTITION LAST не читает порядок, чтобы вычислить свое значение: это значение текущей строки. Отбирает по порядку GROUP LAST.