Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Абстракция данных.






 

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

 

Исходя из дисциплины доступа к данным в модуле, функции частных значений его процедур могут быть определены полностью из текста модуля безотносительно к данным, определенным вне модуля. Однако, необходимо рассмотреть два различных взгляда – проектировщика модуля и пользователя.

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

В модуле счетчика комментарии проектировщика будут описывать действие каждой процедуры в терминах Ones, Tens и Hundreds, тогда как пользовательские комментарии раскрывают эффект тех же процедур в терминах абстрактного объекта, названного Counter. Counter не появляется, как другие переменные в состоянии выполнения, потому что он не был описан и не может быть использован напрямую в операторах вызывающей программы. Вместо этого, программист устанавливает значение счетчика через процедуры Start и Bump и обращается к его значению с помощью процедуры Value.

 

Например, комментарий к вызову Start

{обнулить счетчик}

может быть заменен на более точные комментарии

{конкретный: Ones, Tens, Hundreds: = ‘0’, ‘0’, ‘0’ }

{абстрактный: Counter: = 0 }

 

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

Значение абстрактного объекта может быть сконструировано отображением переменных значений переменных, использованных для представления объекта значению объекта. Это отображение является частью функции представления (representation function), которая ставит в соответствие (конкретные) состояния (абстрактным) состояниям. Функция представления выделяет абстрактное значение из состояния выполнения и скрывает переменные, которые составляют абстрактный объект (который именуется новым идентификатором). Например, в ContingBlanksInText, следующие состояния выполнения могут существовать после вызова Value.

 

(Абстрактное состояние)

{Counter·210, Ch·#, X100·2, X10·1, X1·0}

 

функция представления

 

{Hundreds·2, Tens·1, Ones·0, Ch·#, X100·2, X10·1, X1·0}

(Конкретное состояние)

 

(INPUT и OUTPUT опущены для экономии места)

Для того, чтобы определить функцию представления формально, будет удобно определить функцию Number, которая ставит в соответствие список символов, натуральному числу в десятичной системе исчисления, которое они представляют. Например:

Number(< ’0’, ‘0’, ‘0’>) = 0 (ноль)

Number(< ’0’, ‘1’, ‘3’>) = 13 (тринадцать)

Функция представления R для приведенной выше абстракции счетчика может быть записана следующим образом:

R = {(s, t): t такое же как s за исключением того, что оно содержит новый идентификатор Counter и t(Counter) = Number(< Hundreds(s), Tens(s), Ones(s)>)

и t не содержит идентификаторов Hundreds, Tens и Ones}

 

R отображает три символьных переменных в одну целочисленную.

Конкретная функция частного значения для Value:

V100, V10, V1: = Hundreds, Tens, Ones

Абстрактная функция:

(0 < = Counter < = 999 ->

символьное представление разряда сотен Counter,

символьное представление разряда десятков Counter

символьное представление разряда единиц Counter)

Даже если абстрактная функция частного значения определена только для цифр, нет требования в конкретной функции частного значения, чтобы Hundreds, Tens и Ones были цифрами. Если Value было выполнено до Start, обращение к значениям в Hundreds, Tens и Ones произойдет до инициализации и функция возвратит неизвестное значение.

Сложности в конкретной функции частного значения для Bump возникают не только из арифметики, которая должна быть симулирована, если Ones, Tens и Hundreds цифры, но и обработки случаев, когда она или более этих переменных цифрами не являются.

((‘0’ < = Ones < ‘9’ -> next(Ones)) |

(Ones = ‘9’ AND ‘0’ < = Tens < ‘9’ ->

Ones, Tens: = ‘0’, next(Tens)) |

(Ones = ‘9’ AND Tens = ‘9’ AND ‘0’ < = Hundreds < ‘9’ ->

Ones, Tens, Hundreds: = ‘0’, ‘0’, next(Hundreds)) |

(Ones = ‘9’ AND Tens = ‘9’ AND Hundreds = ‘9’ ->)) |

(‘0’ > Ones OR Ones > ‘9’ ->)

где next определяется как:

next = {(x, y): x и y – цифры и у следует за x в последовательности 01234567890}

С другой стороны, абстрактный комментарий для Bump вполне компактен.

(0 < = Counter < = 999 -> Counter: = Counter + 1) |

(Counter < 0 OR Counter > = 999 ->)

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.