Оператор ABL VAR в OE 12.3
Вслед за выпуском в апреле 2020 года Long-Term Supported (LTS) версии OpenEdge 12.2 Progress Software в ноябре 2020 года выпустила Non-LTS версию OpenEdge 12.3, включив в нее целый ряд изменений и расширений, включая и некоторые расширения языка ABL.
В частности, синтаксис языка расширен оператором VAR.
Оператор VAR – это новый оператор ABL, который позволяет разработчикам определять программные переменные более кратко, подобно тому, как это делается в современных языках программирования.
Оператор VAR – это сокращенный вариант оператора DEFINE VARIABLE.
Переменные, объявленные в VAR всегда будут иметь поведение NO-UNDO, несколько переменных могут быть определены в одном операторе, скобочная запись используется для определения массивов, а знак равенства (=) используется для присвоения начальных значений.
Синтаксис:
VAR [ access-mode ] [ STATIC | SERIALIZABLE | NON-SERIALIZABLE ] type [ [ [ size ] ] ] | [ CLASS ] classname [ [ [ size ] ] ] variable [ = initial-value [, initial-value ]…] |
Подробное описание синтаксиса приведено в конце статьи.
Возможности оператора VAR
Оператор VAR:
- Является NO-UNDO, что означает, что значение переменной не будет восстановлено, если переменная изменилась во время транзакции и транзакция была отменена. Если вы хотите иметь возможность восстановить предыдущее значение переменной, используйте вместо VAR оператор DEFINE VARIABLE.
- Позволяет определить несколько переменных в одном операторе, например:
VAR CHAR s1, s2, s3. |
- Позволяет определять массивы без использования ключевого слова EXTENT, используя квадратные скобки. Если они пусты ([]), размер массива не определен. Например:
VAR CHAR[10] s4. //s4 – определенный массив из 10 элементов
VAR CHAR[] s5. //s5 – массив неопределенного размера |
- Позволяет указать начальные значения без использования ключевого слова INITIALkeyword, используя знак равенства (=), например:
VAR CHAR s6 = “My character string”. |
Ограничения оператора VAR
У оператора VAR имеются следующие ограничения:
- Оператор VARможет быть использован только в начале программы ABL, перед любыми исполняемыми операторами в блоке.
- В процедурах операторVAR должен располагаться после следующих операторов:
- USING…
- BLOCK-LEVEL ON ERROR UNDO, THROW.
- ROUTINE-LEVEL ON ERROR UNDO, THROW.
- В классах оператор VAR:
- Должен располагаться после оператора CLASS.
- Может располагаться в любом порядке внутри класса, как и другие члены класса.
- Должен располагаться в начале блока в теле метода или свойства.
- VAR не позволяет использовать сокращенные описания типов данных. Например, при указании десятичной переменной вы не можете писать VAR DEC. Вы должны написать VAR DECIMAL. В версии 12.3 CHAR и INT – это действительные ключевые слова, а не сокращения. CHAR является синонимом CHARACTER, а INT – синонимом INTEGER. Поэтому вы можете написать VAR CHAR или VAR INT.
- Другие параметры, разрешенные в операторе DEFINE VARIABLE, такие, как FORMATили LABEL, не могут быть использованы в операторе VAR. Если вам нужны эти параметры, вам необходимо использовать оператор DEFINE VARIABLE.
Примеры
В следующих примерах показаны некоторые способы использования операторов VAR вместе с эквивалентными им операторами DEFINE VARIABLE.
Четыре символьных переменных с начальными значениями по умолчанию:
VAR CHAR s1, s2, s3, s4. |
DEFINE VARIABLE s1 AS CHAR NO-UNDO.
DEFINE VARIABLE s2 AS CHAR NO-UNDO. DEFINE VARIABLE s3 AS CHARACTER NO-UNDO. DEFINE VARIABLE s4 AS CHAR NO-UNDO. |
Три целых переменных (начальное значение z равно 3, а x и y по умолчанию 0):
VAR INT x, y, z = 3. |
DEFINE VARIABLE x AS INT NO-UNDO.
DEFINE VARIABLE y AS INT NO-UNDO. DEFINE VARIABLE z AS INT INITIAL 3 NO-UNDO. |
Три переменных типа объект (класс):
VAR CLASS mypackage.subdir.myclass myobj1, myobj2, myobj3. |
DEFINE VARIABLE myobj1 AS CLASS mypackage.subdir.myclass NO-UNDO.
DEFINE VARIABLE myobj2 AS CLASS mypackage.subdir.myclass NO-UNDO. DEFINE VARIABLE myobj3 AS CLASS mypackage.subdir.myclass NO-UNDO. |
Переменная типа объект без ключевого слова CLASS:
VAR mypackage.subdir.myclass myobj1. |
DEFINE VARIABLE myobj1 AS mypackage.subdir.myclass NO-UNDO. |
Общий объект .NET:
VAR “System.Collections.Generic.List<char>” cList. |
DEFINE VARIABLE cList AS “System.Collections.Generic.List<CHAR>” NO-UNDO. |
Три переменных типа date (начальное значение d1 по умолчанию не определено (Unknown value (?))):
VAR DATE d1, d2 = 1/1/2020, d3 = TODAY. |
DEFINE VARIABLE d1 AS date NO-UNDO.
DEFINE VARIABLE d2 AS date INITIAL 1/1/2020 NO-UNDO. DEFINE VARIABLE d3 AS date INITIAL TODAY NO-UNDO. |
Переменные типа date, определенные с режимом доступа:
VAR PROTECTED DATE d1, d2 = 1/1/2020. |
DEFINE PROTECTED VARIABLE d1 AS DATE NO-UNDO.
DEFINE PROTECTED VARIABLE d2 AS DATE INITIAL 1/1/2020 NO-UNDO. |
Три определенных массива размера 3 (третий элемент x по умолчанию равен 2 (предыдущему элементу); элементы y по умолчанию равны 0):
VAR INT[3] x = [1, 2], y, z = [100, 200, 300]. |
DEFINE VARIABLE x AS INT EXTENT 3 NO-UNDO INITIAL [1, 2].
DEFINE VARIABLE y AS INT EXTENT 3 NO-UNDO. DEFINE VARIABLE z AS INT EXTENT 3 NO-UNDO INITIAL [100, 200, 300]. |
Два неопределенных массива:
VAR INT[] x, y = [1,2,3]. |
DEFINE VARIABLE x AS INT EXTENT NO-UNDO.
DEFINE VARIABLE y AS INT EXTENT NO-UNDO INITIAL [1, 2,3]. |
Массив объектов размера 2:
VAR CLASS foo[2] classArray. |
DEFINE VARIABLE classArray AS CLASS foo EXTENT 2. |
Подробнее о синтаксисе
Рассмотрим подробно элементы синтаксиса оператора VAR.
type
Указывает встроенный тип данных для определяемой переменной. Может принимать одно из значений: CHAR, CHARACTER, COM-HANDLE, DATE, DATETIME, DATETIME-TZ, DECIMAL, HANDLE, INT, INTEGER, INT64, LOGICAL, LONGCHAR, MEMPTR, RAW, RECID или ROWID. Сокращения не допускаются.
Замечание: CHAR является синонимом (не сокращением) CHARACTER, а INT – синонимом INTEGER.
[size]
Указывает, что переменная является массивом. Значение size не обязательно, если оно указано, оно означает количество элементов в массиве и должно быть целой константой. Если size не указано ([]), переменная рассматривается как неопределенный массив.
variable
Указывает имя переменной. Имена переменных должны начинаться с буквы, последующие символы могут включать буквы, цифры, точки (.), дефисы (-) и подчеркивания (_). Имена переменных не чувствительны к регистру.
initial-value
Указывает начальное значение присвоенное переменной при объявлении. Если не указано, переменной присваивается значение по умолчанию в зависимости от ее типа.
access-mode
Указывает режим доступа (PRIVATE, PACKAGE-PRIVATE, PROTECTED, PACKAGE-PROTECTED или PUBLIC) для определяемых пользователем переменных класса.
STATIC
Указывает, что определяемая пользователем переменная класса видима в сессии ABL, в которой на нее имеется ссылка. ABL создает одну копию указанной статической переменной класса при первой ссылке на тип класса, и ABL создает только одну такую копию для любого количества экземпляров создаваемого вами класса. Вы можете ссылаться на доступную статическую переменную (член данных) в любом фрагменте кода.
Без параметра STATIC определяемая пользователем переменная класса видима только в одном экземпляре класса, в котором она определена. ABL создает копию указанной переменной для каждого такого экземпляра класса, который вы создаете. Вы можете ссылаться на любую общедоступную переменную экземпляра в любой процедуре, или в любом экземпляре или статическом методе, определенных внутри или вне класса, в котором определена переменная экземпляра. Любой статический метод может ссылаться на общедоступную переменную экземпляра только с помощью объектной ссылки на экземпляр класса, который определяет переменную как член данных. Если ссылающийся статический метод определен в том же классе, что и общедоступная переменная экземпляра, класс должен создать экземпляр самого себя, чтобы иметь доступ к ссылке на экземпляр.
SERIALIZABLE | NON-SERIALIZABLE
Указывает, будет ли определяемая пользователем переменная класса участвовать в сериализации. Параметры SERIALIZABLE и NON-SERIALIZABLE могут использоваться только с переменными экземпляра (не STATIC).
CLASS classname
Определяет переменную как ссылку на объект с типом класс или интерфейс. Значение переменной по умолчанию не определено (?). Вы не можете присвоить объекту начальное значение. Значение classname – это имя класса или интерфейса ABL или .NET. Ключевое слово CLASS указывать необязательно, если имя класса не конфликтует с сокращением для встроенного типа данных.
Оператор VAR – не единственное расширение ABL в версии OE 12.3!
Следите за дальнейшими публикациями!
И Вы можете попробовать новые возможности сами, не устанавливая версию 12.3. Progress Software предоставляет сайт ABLDojo (https://abldojo.services.progress.com/), где можно попробовать код ABL в новой версии. В настоящее время сайт поддерживает версию 12.3.