Статус документа
Статус документа

ГОСТ Р ИСО/МЭК 8825-3-2016 Информационная технология (ИТ). Правила кодирования АСН.1. Часть 3. Спецификация нотации контроля кодирования (ECN)

     9.16 Классы и структуры замены

9.16.1 При наличии спецификаций АСН.1 для традиционных протоколов (или при генерировании специальных кодовых последовательностей для новых протоколов) считается нормальным игнорировать элементы кодирования, в частности поля определителя, которые присутствуют только для поддержки декодирования. В спецификацию АСН.1 включаются только поля, уместные для прикладного кода (переносящие прикладную семантику).

9.16.2 Когда в таких протоколах используется более одного механизма для поддержки (к примеру) конструкций SEQENCE OF в разных местах протокола, невозможно (либо не подходит) формально указывать это в самой АСН.1.

9.16.3 Это означает, что неявно генерируемая структура кодирования не будет различать такие конструкции и не будет содержать относящиеся к кодированию поля для определителей, и необходимо изменить ее для "решения" обеих проблем, пока недоступна некоторая структура, соответствующая требованиям кодирования.

9.16.4 Первым и простейшим изменением является замена некоторых экземпляров класса (внутри неявно генерируемой структуры) на имена нового класса, которые присваиваются старому классу в операторе присвоения класса. Это делается путем создания явно генерируемой структуры с использованием раздела переименований в EDM. Этот раздел импортирует неявно генерируемую структуру из модуля АСН.1 и выполняет указанные замены мест появления (текстуальных) именованных классов. Замена может быть для всех текстуальных мест в пределах списка неявно генерируемых классов (соответствующих определениям типов АСН.1 в модуле) либо в пределах компонентов одного из таких классов, либо "всех мест появления, за исключением" мест в заданном определении или заданном компоненте (см. 15.3). Здесь важно отметить, что эти замены ограничены использованием классов, которые были определены в том операторе присвоения класса кодирования, который присваивает имя класса замены старому классу (например, "#Replacement-class ::= #Old-class"), поэтому данный механизм иногда называют в разговорах "окрашиванием". Это "окрашивание" указывает те части спецификации, которым необходимы способы кодирования, отличающиеся от способов других частей (пример "окрашивания" дается в D.3.7).

9.16.5 Даже с использованием "окрашивания" явно генерируемая структура кодирования, как и неявно генерируемая структура кодирования, содержит только поля, соответствующие полям в спецификации АСН.1, а обычно необходимо изменять генерируемые структуры, чтобы добавить поля для определителей и т.п. Необходима новая структура замены (для всей или части исходной структуры) с добавленными полями. Важно также указывать (для каждого поля исходной структуры), какие именно поля структуры замены (и какие абстрактные значения такого поля) используются для переноса семантики исходных абстрактных значений. Мы говорим об отображении абстрактных значений из исходной структуры в структуру замены.

9.16.6 Имеется много механизмов для определения объекта кодирования существующей структуры в качестве объекта кодирования для полностью отличающейся структуры замены с определенными отображениями значений между старой структурой и структурой замены. Эти механизмы описываются в 9.17.

9.16.7 Однако часто встречается более простая ситуация, в которой разработчик требует от старой структуры сформировать (сохраняя свою целостность) один компонент структуры замены со всеми абстрактными значениями, отображенными из старой структуры в соответствующее значение такого компонента структуры замены. Для этого механизма, получающего всеобщее применение, структура замены нуждается в фиктивном параметре для этого одного компонента и для создания его с реальным параметром, установленным в старую структуру. Это описано в 9.11.3.

9.16.8 При определении объектов кодирования для какого-либо класса (любого класса) всегда возможно указать, что первым действием этого объекта кодирования будет замена класса, кодируемого им, на параметризованную структуру замены, создаваемую согласно 9.16.7, с абстрактными значениями, отображенными из старого класса в этот компонент.

9.16.9 Возможно также определить объекты кодирования для класса #OPTIONAL (или для любого класса категории "факультативные возможности"), который заменяет факультативный компонент на параметризованную структуру замены (часто структуру, содержащую поле #BOOLEAN в качестве определителя наличия) (пример этого приводится в D.3.2.3).

9.16.10 Для таких классов конструктора, как #CONCATENATION, #REPETITION и т.п., возможно также определить объекты кодирования, которые заменяют не полную структуру, а отдельно каждый компонент (или только обязательные, или только факультативные компоненты).

9.16.11 Более развитым, но и более мощным механизмом является требование к действию замены включать также введение определенного поля в заголовок структуры #CONCATENATION (или аналогичной структуры) (пример этого приводится в D.3.1.5).