Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ТРПО учебное пособие.doc
Скачиваний:
24
Добавлен:
22.08.2019
Размер:
3.13 Mб
Скачать

4.3.2.1 Фиксированные типы данных абстрактного типа

Данный подход ориентирован на использование языков, «плохо» поддерживающих сложные структуры данных. При реализации такого подхода правильность проектирования программ зависит, главным образом, от программиста. Компилятор не в состоянии найти ошибки в использовании этих данных, так как программист определяет данные абстрактного типа как структуру данных и оформляет каждую операцию с такими данными в виде отдельной процедуры; при этом со структурами обращаются как с параметрами.

Например, для того чтобы задать стек, программист должен добавить следующее объявление в каждую процедуру, которая содержит обращение к стеку.

declare 1 STACK,

2 ENTRIES(100) TYPE(INTEGER),

2 TOPOFSTACK TYPE(INTEGER);

После этого программист должен написать процедуры для PUSH, POP и любых других функций над стеком. Если проект построен по такому способу, то его перевод на язык программирования сохранит структуру данных абстрактного типа. Достоинство такого способа состоит в том, что его можно использовать для любого языка программирования (рис. 4.12).

Рис. 4.12 — Фиксированные данные абстрактного типа

Однако такая организация данных имеет существенные недостатки, так как компоненты любой структуры видны во всех процедурах, которые используют эти структуры. Программист должен изменять структуры осторожно с помощью определенных операторов и не вводить кажущиеся «безвредными» операторы для непосредственного обращения к данным. Используемый тип оператора может вызвать неприятности, если каждая компонента не будет заменена соответствующим образом.

Несмотря на отмеченные недостатки, данный способ может оказаться единственно возможным для некоторых языков программирования.

4.3.2.2 Размещение указателей

Используя переменные типа указатель, можно построить конструкцию, близкую к фиксированным данным абстрактного типа. Предполагается, что указатель указывает на область памяти, а формат этой памяти определяется с помощью базированных переменных абстрактного типа. Используя данные абстрактного типа, пользователь определяет данные как переменную — указатель и вызывает процедуру для размещения данных и обращения к этой структуре. Для стека это может быть в виде:

declare STACK POINTER;

call STACK_INITIALIZATION(STACK);

В этом случае процедура STACK_INITIALIZATION должна быть вызвана явным образом для того, чтобы разместить стек в памяти (рис. 4.13).

Процедура STACK_INITIALIZATION должна иметь следующую структуру:

STACK_INITIALIZATION: procedure(X);

declare X POINTER;

declare 1 STACK BASED(X),

/* X – указывает на стек */

2 ENTRIES(100) FIXED,

2 TOPOFSTACK FIXED;

ALLOCATE STACK SET(X);

TOPOFSTACK = 0;

end;

Рис. 4.13 — Размещение указателей

Только в этой процедуре известна структура данных, на которые ссылается указатель STACK, поэтому довольно сложно изменить эту структуру за пределами процедуры.

Для того чтобы определить функции обращения к стеку, можно использовать операторы ENTRY. Таким образом, вся конструкция STACK в целом имеет следующий вид:

STACK: procedure;

declare X POINTER;

declare 1 STACK BASED(X);

2 ENTRIES(100) FIXED,

2 TOPOFSTACK FIXED;

/* разместить стек */

STACK_INITIALIZATION: ENTRY(X);

...

/* поместить элемент в стек */

PUSH: procedure(X, элемент);

...

return;

/* извлечь элемент из стека */

POP: procedure(X, элемент);

...

return;

...

end;

Рассмотренный способ удовлетворяет основным предъявляемым требованиям: имена структур и их представления разъединены, все операции со стеком сосредоточены внутри одной процедуры (только из этой процедуры можно обращаться к данным). Однако данному способу присущ тот же недостаток, что и первому. С его помощью действительно строятся данные абстрактного типа, однако во многих современных языках не существует ограничений, которые гарантировали бы, что к этим данным никто не обращается, т.е. невозможно запретить программисту напрямую обратиться к данным, на которые ссылается указатель.