Основы представления информации

Страницы работы

15 страниц (Word-файл)

Фрагмент текста работы

Теперь у нас есть два экземпляра типа Rbook: Exempl1 и Exempl2, а также 100 других экземпляров, объединенных в структуру массива. Мы можем использовать эти экземпляры Rbook для хранения информации о наших книгах.

          Инициализация библиографических карточек

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

begin

...

Exempl1.FirstName

:=’Ivanov’;

Exempl1.SecondName

:= ’Petrov’;

Exempl1.Title

:= ’Computing’;

Exempl1.Publishing

:= ’ETU’;

Exempl1.Index

:= ’BBK’;

Exempl1.Date

:= ’28.01.98’;

...

end;

Можно написать такие группы операторов для всех своих библиографических карточек (книг). Но очевидно мы повторяем все время одни и те же операторы, используя разные значения Rbook.

Например, операторы по инициализации переменной Exempl2 выглядят очень похоже:

begin

...

Exempl2.FirstName

:=’Titov’;

Exempl2.SecondName

:= ’Berg’;

Exempl2.Title

:= ’Informatics’;

Exempl2.Publishing

:= ’Radio’;

Exempl2.Index

:= ’R12’;

Exempl2.Date

:= ’01.02.98’;

...

end;

Единственное отличие этого фрагмента от предыдущего заключено в том, что теперь идет ссылка на Exempl2 и соответствующим полям присваиваются другие значения.

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

procedure Initialize

(

var Exempl:

Rbook;

const FirstName,

SecondName,

Title,

Publishing,

Index,

Date:

String

);

begin

Exempl.FirstName

:= FirstName;

Exempl.SecondName

:= SecondName;

Exempl.Title

:= Title;

Exempl.Publishing

:= Publishing;

Exempl.Index

:= Index;

Exempl.Date

:= Date;

end;

Обратите внимание, что Exempl является параметром var и любые изменения его значения будут переданы фактической переменной, указанной при вызове процедуры. Все поля формального параметра Eхempl передаются в подпрограмму как аргументы. Вводя подпрограмму, вы достигаете большей степени скрытия деталей инициализации объекта от внешних модулей. Этот прием скрытия реализации информационного объекта от внешних модулей называется инкапсуляцией.

Теперь можно повторно использовать процедуру Initialize для инициализации различных переменных типа Rbook. Обратите внимание на то, как изменяется сам подход к инициализации при превращении набора операторов программы в процедуру: от мелких деталей инициализации, которыми мы должны заниматься каждый раз при инициализации переменной типа Rbook, переходим к более обобщенной логике инициализации, опуская при этом подробности.

Типичный вызов процедуры Initialize выглядит следующим образом:

begin

...

Initialize (Exempl1, ‘Ivanov’, ‘Petrov’, ‘Computing’, ‘ETU’, ‘BBK’, ’28.01.98’);

...

end;

Переменная, представляющая библиографическую карточку Exempl1, передается процедуре вместе с величинами (значениями), которые мы хотим присвоить экземпляру библиографической карточки при инициализации. Вызов подпрограммы скрывает детали инициализации. Нам не надо больше обращать внимание на детальную структуру записи при инициализации ее значения. Все низкоуровневые аспекты присваивания значений соответствующим полям осуществляются внутри процедуры и скрыты от внешнего взгляда (пользователя).

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

При не-объектном подходе возникает такая проблема, как возможность для переменной Rbook существовать в “неопределенном состоянии”, когда она объявлена

Похожие материалы

Информация о работе