Нестандартные типы данных очень часто используются в программировании, поскольку они более информативны, нежели стандартные типы, и потому, что их применение ведет к созданию более четкого кода. Это особенно справедливо в отношении записей. Но прежде чем приступать к изучению создания и использования записей, необходимо разобраться в создании и использовании перечислимых типов, подтипов и множеств.
Перечислимый тип — это упорядоченный список идентификаторов, который может служить хорошей заменой коллекции констант. Например, следующие константы можно заменить перечислением:
const
PAWN =
1
;
ROOK =
2
;
KNIGHT =
3
;
BISHOP =
4
;
QUEEN =
5
;
KING =
6
;
Для объявления перечислимого типа применяется следующий синтаксис:
type
ТПеречислимыйТип = (значение_1, значение_2, значение_n);
TChessFigure = (cfPawn, cfRook, cfKnight,
cfBishop, cfQueen, cfKing);Использование переменной TChessFigure вместо целочисленной переменной делает код более читабельным и позволяет компилятору Delphi осуществлять проверку типа. Каждый идентификатор в перечислении получает порядковое значение. Порядковые значения в перечислении начинаются с 0. Таким образом, Ord(cf (Pawn) равно 0.
Все порядковые процедуры и функции могут работать с перечислимыми типами.
Порядковое значение элемента перечисления можно определить также явно:
Подтип представляет часть базового типа (любого порядкового типа). Для объявления подтипа используют тот же синтаксис, что и для объявления массива:
Множества — это коллекции порядковых типов, которые могут содержать до 256 элементов. Чтобы объявить множество, вначале потребуется создать перечислимый тип. Затем для объявления множества необходимо воспользоваться следующим синтаксисом:
НовоеМиожество =
set
of
ПеречислимыйТип;
Множества действительно просты в использовании и позволяют работать с коллекцией значений. Переменная типа множества занимает всего один байт памяти. Следующий код иллюстрирует объявление нового множества на основе перечисления TDay и присвоение пустого множества переменной ThisWeek:
Операция присваивания позволяет в одном операторе присваивать множеству одно или несколько значений. Чтобы присвоить значения множеству, необходимо заключить их в квадратные скобки. В случае присваивания множеству нескольких значений, они должны разделяться запятыми:
Обычно эти операции служат для добавления или удаления элементов из множества. Однако по возможности вместо них следует применять процедуры Exclude и Include, поскольку процедуры работают быстрее, чем операции:
Exclude(ThisWeek, Friday);
Include(ThisWeek, Saturday); Include(ThisWeek, Sunday);
Зарезервированное слово in можно использовать для определения, присутствует ли во множестве указанное значение. Например, для выяснения, содержит ли множество ThisWeek элемент Wednesday, служит приведенный ниже код:
Для просмотра множества можно использовать любой из доступных циклов, в том числе цикл f or-in, применение которого требует наименьшего объема ввода с клавиатуры и ведет к созданию наиболее читабельного кода.
Листинг 7.1. Работа с множествами
Запись — это структурированный тип данных, состоящий из ряда элементов. В отличие от массива, который представляет собой просто группу переменных с общим именем и типом данных, запись — это тип данных, который содержит элементы (поля) различных типов. Для создания новой записи необходимо использовать зарезервированное слово record и объявить поля внутри блока записи. В действительности объявления полей — это объявления стандартных переменных.
Синтаксис объявления типа записи выглядит следующим образом:
После создания новый тип записи можно использовать для объявления переменной этого типа:
Для получения доступа к полям в записи применяется синтаксис с использованием точки:
Запись.Поле
Например, приведенный ниже код заполняет данными запись Book:
Обычно для получения доступа к полям записи необходимо всегда вначале указывать имя записи. Но применение зарезервированного слова with позволяет указывать имя записи только один раз. Это зарезервированное слово служит для определения блока, в котором можно непосредственно обращаться к полям указанной записи.
Синтаксис записи блока with показан ниже:
Блок with позволяет уменьшить объем исходного кода, особенно при использовании записи с большим количеством полей или записи с действительно длинным именем.
Следующий пример иллюстрирует определение полей записи в другой записи и использование массивов записей.
Листинг 7.2. Использование записей
При создании процедур и функций, которые принимают запись в качестве параметра, этот параметр должен быть объявлен как параметр-переменная или параметр-константа. Если поля в записи требуется изменять, следует использовать параметр-переменную. Если необходимо выполнять только считывание значений полей, следует использовать параметр-константу.
При использовании стандартного параметра-значения процедура вынуждена создавать копию всей записи при каждом ее вызове. В данном случае при передаче параметра-значения процедура должна скопировать 92 байта (SizeOf (TBook)). При использовании параметра-константы или параметра-переменной вызов процедуры должен передать только адрес переменной, который занимает всего 4 байта.
Как вы, вероятно, заметили, имена всех нестандартных типов начинаются с прописной буквы Т. Это всего лишь соглашение, но поскольку оно используется повсеместно и постоянно, его следует соблюдать, как если бы оно было официальным правилом.