Пользовательские типы данных
| English | Русский |
|---|---|
| user-defined types/ˈjuːzə dɪˈfaɪnd taɪps/ | пользовательские типы |
| non-composite/nɒn ˈkɒmpəzɪt/ | несоставной |
| composite/ˈkɒmpəzɪt/ | составной |
| enumerated type/ɪˈnjuːməreɪtɪd taɪp/ | перечислимый тип |
| pointer/ˈpɔɪntə/ | указатель |
| dereference/ˌdiːˈrefrəns/ | разорвать ссылку |
| record/ˈrekɔːd/ | запись |
| set/set/ | множество |
| class/klæs/ | класс |
| attributes/ˈætrɪbjuːts/ | атрибуты |
| methods/ˈmeθədz/ | методы |
Тип, который делает ошибку невозможной
- Медицинская система хранила группу крови пациента как
STRING. Кто-то набрал "0+" вместо "O+": ноль вместо буквы. Поле приняло это, так как строка принимает всё подряд. - Ничего в программе не могло определить, что "0+" не является группой крови, поэтому ошибка прошла незаметной до момента, когда она стала критической.
- Задайте полю тип, значения которого точно соответствуют восьми группам крови, и присваивание будет отклонено сразу же при записи, компилятором, до того как программа запустится.
- Это то, что дают определяемые пользователем типы. Этот урок — те, которые названы в программе курса, и как выбирать между ними.
Почему нужны определяемые пользователем типы
- Встроенный
STRINGпозволяет хранить бессмыслицу в поле, которое должно содержать одно из нескольких допустимых значений; определяемый пользователем тип ограничивает его, чтобы компилятор ловил больше ошибок. - Реальные сущности обычно представляют собой набор значений разных типов, а встроенный тип может хранить только одно.
DECLARE MyTaxi : Vehicleявляется самодокументирующимся: он говорит, что представляет переменная, тогда какDECLARE MyTaxi : STRINGуказывает только на способ хранения.
Зачем нужны пользовательские типы? Выберите все, что подходит.
Ограничение, группировка и самодокументирование. Скорость не является причиной; важны корректность и понятность.
Некомпозитные типы: перечисляемые
- Некомпозитный тип хранит одно значение; композитный тип группирует несколько значений вместе.
- Перечисляемый тип имеет значения, которые представляют собой фиксированный список именованных констант. Имена являются значениями нового типа, хранящимися внутри как небольшие целые числа.
TYPE Vehicle = (M100, M230, T101, T102, T120, T150)
DECLARE MyTaxi : Vehicle
MyTaxi ← T102 // anything outside the list is rejected
- Применение: дни недели, цвета, коды состояний, группы крови: любая область, где допустимые значения — это короткий известный список.

Шесть именованных значений, и ничего больше не может быть присвоено
Перечислимый тип содержит:
Перечислимый тип ограничивает переменную одним из фиксированного набора именованных значений (например, дни недели).
Некомпозитные типы: указатель
- Указатель хранит адрес памяти другой переменной или
NULL, означающий «нет цели». - Чтобы разыменовать (dereference) указатель, записанный как
p^, означает получить доступ к переменной, на которую он указывает.
TYPE PNode = ^TNode // a pointer to a TNode
DECLARE p : PNode
p ← NEW TNode
p^.Value ← 42 // dereference, then reach the field
- Указатели делают возможными динамические структуры: связный список — это узлы, соединённые указателями, а дерево — узлы с двумя. Они также передают большой записи процедуре без её копирования.

Переменная хранит место нахождения данных, а не сами данные
Указатель хранит адрес памяти другой переменной, а разрыв ссылки (например, p^) дает доступ к переменной, на которую он указывает.
Указатели (с NULL, означающим «не указывает ни на что») используются для построения динамических структур, таких как связные списки и деревья.
Обращение к переменной, на которую указывает указатель, записываемое как p^, называется ____.
Указатель хранит адрес; разрыв ссылки следует по нему к данным. Именно так строятся связные списки и деревья.
Композитные типы
- Запись (record) группирует поля разных типов под одним именем в блоке
TYPE … ENDTYPE. Вы встретились с ним в теме 10. - Множество (set) — это неупорядоченная коллекция уникальных значений с операциями добавления, удаления, проверки принадлежности, объединения и пересечения.
DECLARE Available : SET OF Colour
Available ← {Red, Blue}
IF Green IN Available THEN
…
ENDIF
- Класс и его экземпляры, объекты, объединяют поля данных, атрибуты, с операциями над ними, методами.

Поля разных типов, один идентификатор
Соотнесите каждый пользовательский тип с тем, что он содержит.
Перечислимый = фиксированные именованные значения; указатель = адрес; класс = данные + поведение; множество = уникальные неупорядоченные значения.
Множество — это упорядоченная коллекция, в которой значение может встречаться несколько раз.
Множество неупорядочено, а его значения уникальны. Массив — это упорядоченная структура, допускающая повторы.
Класс
CLASS Taxi
PRIVATE Capacity : INTEGER
PUBLIC FUNCTION GetCapacity() RETURNS INTEGER
RETURN Capacity
ENDFUNCTION
ENDCLASS
- Класс — это определение; объект — это его экземпляр, одна конкретная такси со своей собственной вместимостью.
- Что отличает его от записи — это методы: запись содержит только данные, класс содержит данные и поведение, связанное с ними.
Класс объединяет:
Класс объединяет атрибуты и методы; объект — это экземпляр класса.
Что отличает класс от записи (record)?
Оба поля группы; только класс определяет поведение. Объект — это один экземпляр класса.
Разобранный пример: выберите тип и обоснуйте выбор
- Система бронирования хранит для каждого бронирования статус, который должен быть одним из: Requested, Confirmed или Cancelled. Какой пользовательский тип выбрать и почему?
- Перечисляемый тип: допустимые значения — это короткий фиксированный список, поэтому тип предотвращает присвоение любого другого значения, и код читается так же, как предметная область.
- А для самого бронирования: ссылка, дата, количество пассажиров и цена? Запись, потому что значения имеют разные типы и всегда описывают одно бронирование вместе.
- А для множества свободных мест? Множество: неупорядоченное, без дубликатов, и проверка принадлежности — это необходимая операция.
Выбор между ними
| Потребность | Тип |
|---|---|
| значение из короткого фиксированного списка | перечисляемый |
| косвенная ссылка или структура, которая растет | указатель |
| несколько полей разных типов, описывающих одно явление | запись |
| неупорядоченная коллекция уникальных значений | множество |
| состояние и поведение, действующее над ним | класс |
Лабораторная работа по программированию
Сопоставьте примеры с показанной ими программной идеей.
Для переменной, которая должна принимать одно из {Red, Green, Blue} значений, лучшим типом будет:
Фиксированный список допустимых значений — именно для этого предназначен перечислимый тип.
Потерянные баллы
- Значения перечисляемого типа — это именованные константы, а не строки.
MyTaxi ← "T102"— это другое понятие и здесь ошибочно. - Указатель хранит адрес, а не значение. Разыменование — это шаг, позволяющий получить доступ к значению.
- Множество неупорядочено и не содержит дубликатов; массив упорядочен и может содержать повторения. Формулировка вопроса подсказывает, какой тип выбрать.
- То, что делает класс более чем просто записью, — это его методы. Говорите об этом, когда спрашивают о разнице.
Вы поняли
- Пользовательские типы ограничивают то, что можно хранить, группируют связанные вместе значения и делают код самодокументируемым.
- Некомпозитные: перечисляемый (фиксированный список именованных констант) и указатель (адрес, доступ к которому осуществляется через разыменование).
- Композитные: запись (поля разных типов), множество (неупорядоченное, уникальное), класс/объект (атрибуты плюс методы).
- Выбирайте исходя из потребности и обосновывайте свойство, которое подходит: фиксированный список, косвенная ссылка, смешанные поля, уникальность или состояние с поведением.