Правила: свойства
Правила свойств
-
Ассистент НЕ ДОЛЖЕН объявлять свойство, если оно используется только один раз.
Исключение: свойство всё же можно объявить, если оно добавляется на форму.
-
Каждый параметр свойства ДОЛЖЕН использоваться в его выражении. Неиспользуемые параметры запрещены.
-
Ассистент ОБЯЗАН предполагать стандартное распространение
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).
- все операнды или агрегируемые значения равны
-
Ассистент НЕ ДОЛЖЕН использовать
GROUP AGGRвнутри произвольных выражений.GROUP AGGRдопустим только в определениях свойств.Рассуждая о нём, ассистент ОБЯЗАН трактовать
GROUP AGGRкакGROUP MAXс дополнительным ограничением. -
Ассистенту СЛЕДУЕТ избегать лишних условий, когда семантика языка уже даёт требуемый результат.
-
Ассистент НЕ ДОЛЖЕН создавать свойство, выражение которого равно одному из его параметров.
-
Ассистент НЕ ДОЛЖЕН создавать несколько свойств с идентичными выражениями.
-
Если свойство вычисляется из другого свойства, но имеет другие параметры, ассистенту СЛЕДУЕТ постараться сохранить то же имя свойства.
-
Чтобы проверить, что свойство равно
NULL, ассистенту СЛЕДУЕТ использоватьIF NOT property(...).Чтобы проверить, что оно не
NULL, ассистенту СЛЕДУЕТ использоватьIF property(...). -
Ассистенту СЛЕДУЕТ указывать
CHARWIDTHв определении свойства, а не в дизайне формы.
Для простой композиции свойства, которая лишь пробрасывает
другое свойство, ассистенту НЕ СЛЕДУЕТ повторять
CHARWIDTH на производном свойстве, если оно не должно отличаться.
-
Для статических объектов ассистент НЕ ДОЛЖЕН использовать свойства
staticCaptionилиstaticName.Вместо них ассистент ОБЯЗАН использовать
captionиname.Это касается и записи:
captionиname— простые композиции над хранимыми заголовком и именем, поэтому присваивание в них проходит в хранимое свойство. Заголовок статического объекта присваивается черезcaption; имя менять нельзя — изменениеnameзапрещено системным ограничением. -
Имена свойств СЛЕДУЕТ делать краткими и избегать лишних слов.
-
Ассистенту НЕ СЛЕДУЕТ использовать в имени свойства слова, дублирующие имена классов параметров, кроме случаев, когда это нужно для ясности.
-
Ассистенту НЕ СЛЕДУЕТ указывать явное пространство имён для свойства без необходимости.
-
Создавая для собственного атрибута одного объекта DATA-свойство — или простую композицию от DATA-свойства (например, когда тянется имя связанного объекта), — ассистент ОБЯЗАН осознанно решить, относить ли его к системной группе
idилиbaseчерезIN.Атрибуты, образующие бизнес-идентификацию объекта и показываемые в его представлении, СЛЕДУЕТ относить к группе
id; прочие основные атрибуты — к группеbase(idвложена вbase).Свойство НЕ СЛЕДУЕТ помещать в
idилиbase, когда оно не является собственным основным атрибутом объекта. -
При делении значений целочисленных классов ассистент ОБЯЗАН приводить к
NUMERICодин из операндов, а не результат.Отношение двух целых чисел — целочисленное деление, поэтому внешнее приведение вида
NUMERIC[16,4](a * b / c)молча отбрасывает дробную часть; правильная форма —NUMERIC[16,4](a) * b / c. -
Класс в объявлении параметра (
prop(SubClass x)) — это сигнатура, а не фильтр времени выполнения: он разрешает одноимённые свойства и задаёт сигнатуру, но вычисляемое множество определяется свойствами, использованными в выражении. Чтение свойства родительского класса с параметром, объявленным классом-потомком, всё равно идёт по ВСЕМ объектам родительского класса (например, вGROUP SUM— молча неверные итоги).Чтобы ограничить множество классом, ассистент ОБЯЗАН добавить явное условие
x IS SubClass(или использовать свойство, объявленное на этом классе-потомке). -
В операторе
GROUP ... BYассистент НЕ ДОЛЖЕН перечислять в блокеBYверхние параметры, использованные в выражениях оператора: каждый такой параметр уже неявно является группировкой — параметром создаваемого свойства — и остаётся на своём месте в сигнатуре.При явном списке параметров слева
BY-выражения отображаются по порядку только на параметры, не использованные в выражениях; несовпадение количества или классов даёт ошибку.
Правила абстрактных свойств (+=)
-
Класс значения реализации
+=ОБЯЗАН укладываться в класс значения, объявленный у абстрактного свойства; неявного приведения нет — реализация с более широким классом отвергается при старте сервера с ошибкой «wrong value class of implementation».Выражение, расширяющее класс значения, — прежде всего конкатенацию строк, складывающую длины операндов (
ISTRING[326]при объявленномISTRING[250]), — ассистент ОБЯЗАН обернуть в явное приведение к объявленному классу:f(X x) += ISTRING[250](a(x) + b(x));
Правила упорядочивания (ORDER)
-
Там, где две строки могут разделить ключ порядка, а ответ зависит от того, какая из них победит, — какая из двух строк одной даты станет
GROUP LAST, какую из двух строк равного приоритета возьметTOP 1, на какую шагнет назадPARTITION PREV, — ассистент ОБЯЗАН выписать различитель явно, обычно сам объект:ORDER date(d), d.Для части таких случаев платформа дополняет неполный порядок сама, поэтому симптомом будет не разброс от запуска к запуску, а то, что выбрана та строка, которую отбирает служебный порядок по интерфейсам, — а его предметная область не просила. Выписанный различитель и делает выбор задуманным.
-
Накопительный
PARTITION SUM ... ORDERбезTOPиOFFSET— тот случай, когда различитель добавлять по привычке НЕ ДОЛЖНО. Его рамка по умолчанию дает всем строкам с одинаковым ключом порядка одно и то же накопленное значение. Добавленный различитель меняет результат — с итога на группу равных ключей на итог на строку, — а это решение о предметной области, а не мера предосторожности. ПодTOPилиOFFSETдействует обычное правило 1: они отбирают строки, и какие именно — стоит сказать. -
PARTITION LASTне читает порядок, чтобы вычислить свое значение: это значение текущей строки. Отбирает по порядкуGROUP LAST.