Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
учебник по информат.doc
Скачиваний:
75
Добавлен:
11.02.2015
Размер:
718.85 Кб
Скачать

Получение индекса книги с указанием ее авторов

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

var

Index1,

Author1,

Author2 : String;

begin

...

Index1

:=Exempl1.Index;

Author1

:= Exempl1.FirstName;

Author2

:= Exempl1.SecondName;

...

end;

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

procedureGetIndex

(

const Book:

Rbook;

var Index1,

Author1,

Author2:

String

);

begin

Index1

:= Book.Index;

Author1

:= Book.FirstName;

Author2

:= Book.SecondName;

end;

Как и ранее, вместо “жесткого” кодирования переменной конкретной книги, процедура GetIndex ссылается на общую переменную Book, передаваемую в качестве параметра. Она передается как параметр вида const во избежание копирования значения фактического аргумента в локальный параметр Book во время вызова. Параметр const обеспечивает обращение к переменной как к ссылке без копирования ее значения, и, кроме того, она не может быть случайно изменена внутри процедуры.

Параметры Index1, Author1 и Author2 являются выходными параметрами, через которые передаются соответствующие строки индекса, фамилии первого и второго авторов книги. Поэтому они объявляются как параметры var и их измененные значения могут передаваться из процедуры.

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

Соединение подпрограмм с данными

Рассмотренный пример демонстрирует типичный сценарий для случая не-объектого подхода к программированию. Здесь данные, запись Rbook, определены независимо от подпрограмм, которые оперируют с этими данными: Initialize и GetIndex. Ничего в способе определения этих объектов не помогает обнаружить связь между программой и данными. Нам остается лишь догадываться, какие подпрограммы работают вместе с этими элементами данных.

Другая часть проблемы с записью Rbook состоит в том, что ее определение “открыто” и ее детали подвержены всем видам “злоупотреблений”. Например, ничто не может помешать кому-либо присвоить значение ‘Ivanov’ полю Publishing.

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

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

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

Объектно-ориентированный подход определяет, что подпрограммы и данные, с которыми они оперируют, тесно связаны между собой. Объектно-ориентированная парадигма объединяет данные с соответствующей программой, которая оперирует с этими данными, и, таким образом, создает единое цельное образование: ОБЪЕКТ.

14