Части ABL-класса
ABL-класс содержит определение атрибутов, определение и реализацию конструкторов, методов и деструкторов. Конструкторы используются для создания экземпляра класса во время выполнения. Деструктор используется для очистки ресурсов после удаления экземпляра класса.
Атрибуты класса
Атрибуты класса, на рисунке отмечены как «Customer data definitions», используются для хранения значений для экземпляра класса во время выполнения. Каждый созданный экземпляр класса имеет собственные значения для атрибутов класса. Значения атрибутов экземпляра класса присваиваются в момент создания экземпляра или методами класса во время выполнения.
Существует четыре типа атрибутов для ABL-класса:
Тип атрибута |
Описание |
Variable | Используется для хранения значений встроенных или пользовательских типов данных. Хорошей практикой считается определять переменные как private или protected, что обеспечит доступ к переменным только из методов класса. |
Property | Используется для хранения значений встроенных или пользовательских типов данных. Свойства подобны переменным, но они позволяют настаивать способы чтения или установки значений. Хорошей практикой считается определять свойства как public для чтений, и как private или protected для установки. Такой подход позволяет контролировать к свойствам из кода других частей приложения. |
Temp-Table | Используется для хранения агрегированных данных, таких как записи из соответствующей таблицы реляционной базы данных. Как правило временные таблицы содержат данные нескольких типов. Хорошей практикой считается определять временные таблица как private. О временных таблицах вы узнаете больше на следующем уроке. |
DataSet | Используется для хранения данных, которые представляют собой совокупность временных таблиц. Применение ABL DataSet это хорошая практика для определения данных для классов бизнес-сущностей. О наборах данных вы узнаете больше на следующем уроке. |
Определение атрибутов в качестве переменных
Определение переменных для классов аналогично определению переменных для процедур. Единственно и главное отличие заключается в указании области видимости переменной.
Упрощённый ABL-синтаксис определения атрибута класса в виде переменной:
define <visibility> variable <variable name> as <type-name> [no-undo].
visibility
Область видимости атрибута. Допустимые значения: private, protected, public. Область видимости для переменных рекомендуется устанавливать private или protected.
variable name
Имя переменной. Должно начинаться с буквы и может содержать буквы, цифры, символы нижнего подчёркивания или дефисы. Не допускается использование пробелов или точек в имени переменной.
type-name
Один из допустимых типов данных ABL или пользовательский тип данных.
no-undo
Рекомендован для всех описываемых переменных. При использовании no-undo в случае отката транзакции значение переменной не будет возвращено в исходное состояние. Необходимости в восстановлении исходного значения переменной бывает очень редко, поэтому для более эффективной работы программного кода для переменных всегда рекомендуется указывать no-undo.
В следующем примере демонстрируется определение атрибута класса Department в виде переменной. Каждый экземпляр этого класса будет иметь собственное значение этого атрибута. Поскольку атрибут определён как private, он будет доступен только методам этого класса.
class Sandbox.TestClasses.Department: define private variable NextEmployeeIndex as integer no-undo. end class.
Свойства класса
Как и переменная, свойство класса содержит значение встроенного или пользовательского типа данных, но у свойства дополнительно есть встроенные методы доступа get() и set(), которые используются, чтобы получить доступ к данным свойства. Это полезно, так как вы можете определить свойство, которое будет считано другой частью приложения, но установлено может быть только методами класса. Кроме того, вы можете добавить свой код в методы доступа get() и set() и тем самым определить как значение свойства будет считываться и устанавливаться. Например, вы можете реализовать метод доступа set() для преобразования значения PostalCode в стандартный формат.
Хорошей практикой является определение свойства в качестве public для чтения и private или protected для установки. Это позволит вам контролировать как будет осуществляться доступ к данным из код других частей приложения. Большинство атрибутов, которые вы будете добавлять в ABL-класс, будут определены как свойства.
Определение атрибута в качестве свойства
Свойство класса определяется так же, как переменная, за исключением того, что используется ключевое слово property. Дополнительно вы указываете средства доступа get и set. По желанию, вы можете настроить поведение методов доступа get() и set().
При определении свойства также необходимо указать область видимости свойства и области видимости методов доступа get() и set(). Видимость методов get() и set() может соответствовать видимости свойства или может быть более ограниченным чем видимости свойства.
Упрощённый синтаксис для определения свойства класса:
define[<visibility>] property <property-name> as <type-name> [no-undo] <visibility> get [(): <body of get that returns property> end get]. <visibility>] set [(<parameter>): <body of set that sets property> end set].
visibility
Может быть public, private или protected.
property-name
Имя атрибута.
type-name
Встроенный тип данных ABL или пользовательский тип данных.
parameter
Значение, используемое для установки свойства. Должно соответствовать типу данных свойства.
Использование мастера Add Property
С помощью Developer Studio и мастера Add Property вы можете легко генерировать определение свойства в файле класса. Мастер Add Property создаст большую часть кода, необходимую для определения свойства класса.
Порядок использования мастера:
- В OpenEdge Editor установить курсор на строку, где необходимо добавить определение свойства. Хорошей практикой считается размещать определения свойств после определения переменных.
- На «чистой» строке щёлкнуть правой кнопкой мыши и выберать пункт Source -> Add Property. Откроется мастер Add Property.
- Ввести имя свойства.
- Указать область видимости свойства. Хорошей практикой считается устанавливать область видимости для свойства public.
- Выбрать тип данных для свойства с помощью разворачиваемого списка.
- Если предполагается, что свойство будет массивом, то выбрать Extent и, по желанию, указать количество элементов массива. Об использовании массивов вы узнаете позже на этом уроке.
- Если свойство должно иметь инициализирующее значение, то установить его.
- Для метода Get оставить установленным флаг Readable и установить флаг Insert implementation, если планируется добавить свой код. Указать область видимости для чтения свойства.
- Для метода Set оставить установленным флаг Writable и установить флаг Insert implementation, если планируется добавить свой код. Указать область видимости для свойства.
- Щёлкнуть по кнопке Generate. Будет создан код для определения свойства. Если вы указали, что вы собираетесь добавить свой код, то вы должны добавить ABL-код в блок в определении свойства.
Следующий пример демонстрирует определение некоторых свойств в классе Employee:
class Sandbox.TestClasses.Employee: define public property Address as character no-undo get. set. define public property PostalCode as character no-undo get. set(input arg as character): /* code to standardize the PostalCode */ end set. define public property JobTitle as character no-undo get. private set. . . . /* rest of class definition */
Здесь:
- свойство Address определено как public, его методы доступа имеют такую же область видимости. Таким образом другие части приложения имеют возможность и читать, и устанавливать значение свойства;
- свойство PostalCode определено как public, его методы доступа имеют такую же область видимости. Но метод set имеет «заглушку» для пользовательской реализации. Здесь вы должны добавить свой код для трансформации значения свойства.
- свойство JobTitle определено как public, но только методы этого класса могут устанавливать значение свойства. Другие части приложения могут читать это свойство, но не могут устанавливать его значение.