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

Brief: идентификация элементов

Идентификаторы и пространства имён

Именованные элементы системы — свойства, действия, пользовательские классы, формы, элементы навигатора, группы свойств и действий, окна, таблицы, метакоды: к каждому обращаются по имени (идентификация элементов).

Элемент создаётся в пространстве имён, которое задаёт модуль инструкцией NAMESPACE (по умолчанию — имя модуля), а инструкция PRIORITY перечисляет дополнительные пространства имён, приоритетные при поиске; обе — в заголовке модуля.

Обращение записывается простым идентификаторомname — или составным, с явным пространством имён — Sale.Document. Строка <пространство имён>.<имя>полное имя элемента (именование).

Аналогия: пакеты и импорты, только приоритетное пространство задаётся один раз в заголовке модуля.

MODULE Sale;
REQUIRE System, Utils;
NAMESPACE Sale;

CLASS Document 'Документ'; // полное имя — Sale.Document

Именование

Именование рекомендует начинать имя элемента системы с маленькой буквы, имя класса — с большой, каждое следующее слово в имени — с большой: myFirstName, MySuperClass; сама грамматика идентификатора регистр не ограничивает. Уникальность требуется среди элементов одного типа, а не по всей системе: класс и форма могут носить одно и то же полное имя, и свойство с действием тоже. Внутри одного типа есть свои исключения — метакоды могут делить полное имя, если принимают разное количество параметров, свойства и действия — если различаются сигнатурой, — так что полное имя свойства само по себе не уникально.

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

Sale.Document                  // класс
Item.gender[Item.Article] // свойство: полное имя и сигнатура

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

Поиск элементов

По короткому имени элемент находит алгоритм поиска, учитывающий: само имя (регистрозависимо), зависимость модулей — кандидат должен быть объявлен в модуле, от которого зависит модуль поиска, — явно указанное пространство имён, а при его отсутствии приоритет собственного пространства модуля и пространств из PRIORITY.

Для свойств и действий к этому добавляются классы параметров: подходят кандидаты, чьей сигнатуре соответствуют классы аргументов, из них выбирается наиболее конкретный. Сигнатуру можно указать в самом обращении: name[AClass](b).

Если подходящих кандидатов несколько или ни одного, платформа выдаёт ошибку при запуске.

Переименование и migration.script

Переименование элемента или перенос в другое пространство имён меняет каноническое имя, а значит разрывает связь элемента с уже сохранёнными данными и настройками. Соответствие старого и нового имён описывает файл migration.script в CLASSPATH сервера приложений: блоки V<номер версии> { ... }, из которых при старте применяются блоки с версией выше сохранённой в базе. Механизм — миграция.

Тип измененияЧто сохраняет
PROPERTYнастройки политики безопасности и рефлексии для свойства или действия
STORED PROPERTYто же плюс переименование поля в базе, то есть данные первичного свойства
FORM PROPERTYнастройки таблицы для свойства или действия на форме
CLASSобъекты пользовательского класса и связанные с ними данные — но не канонические имена первичных свойств, у которых класс входит в сигнатуру: они меняются вместе с ним, автоматически не отслеживаются и требуют собственных записей STORED PROPERTY, иначе сервер переименует осиротевшую колонку в _DELETED_ плюс ее прежнее имя в базе — а если колонка с таким именем уже есть, просто удалит ее, — и новое свойство начнет с пустого
OBJECTданные, связанные со статическим объектом
TABLEпереименование таблицы вместо переноса записей
NAVIGATORнастройки политики безопасности для элемента навигатора
V0.3.1 {
STORED PROPERTY Item.gender[Item.Article] -> Item.dataGender[Item.Article]
CLASS Date.DateInterval -> Date.Interval
}