Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Непейвода Н.Н. -> "Основания программирования " -> 251

Основания программирования - Непейвода Н.Н.

Непейвода Н.Н., Скопин И.Н. Основания программирования — Институт компьютерных исследований , 2002. — 919 c.
Скачать (прямая ссылка): osnovanprogramm2002.pdf
Предыдущая << 1 .. 245 246 247 248 249 250 < 251 > 252 253 254 255 256 257 .. 316 >> Следующая

§ 12.2. ОБЪЕКТНАЯ МОДУЛЬНОСТЬ
В данном разделе рассматривается, как средства объектно-ориентированного программирования сочета тся с модуляризацией программ, и в каком направлении идет их развитие. ля этой цели луче всего подходит линия развития TURBO и Delphi (Object Pascal) языка Pascal. Изложение иллюстрируется на модификации демонстрационного примера из § 8.6.3.
Первый объектно-ориентированный диалект Pascal^ в линии TURBO — TURBO Pascal версии 5.5. н предлагает программисту лиь минимально необходимые средства поддержки данного стиля. Как и в последующих версиях языка, задача объектной модуляризации реается на основе модульности версии TURBO Pascal'я 5.0, рассмотренной в предыдущем разделе. Но новые средства дают и новые возможности. В частности, появляется под-дерка рассмотрения представления (в примере — массив Container; пере-
12.2.
723
менне IB и IE, связанные с алгоритмом кольцевого буфера, м пока будем считать частью реализации) отдельно от реализации. Теперь можно вовсе не знать, является Container массивом или чем-то иным, — метод работы с этим объектом, описанные в отдельном модуле, обеспечива т реализаци всем необходимым. Более того, мы можем рассматривать такие Container'ы, которе в состоянии принимать на хранение объект разных типов, да е не зная того, каким способом это достигается. Тем самым решается проблема реализации очереди с содержимым разных типов.6 Сама очередь становится объектом-наследником от Container^. Как следствие, методы работы с этим объектом оказыва тся и методами объектов очередь. ля реализации очереди, как кольцевого буфера нужны переменные IB, IE, BFull и BEmpty, рассмотрение которых совместно с Container'ом выделяет очередь как самостоятельную структуру данных. В новой ситуации естественно задавать MaxSize не константой, а атрибутом конкретного экземпляра очереди. Кроме того необходимо реение вопроса об элементе, который предъявляется в оибочной ситуации, когда делается попытка чтения из пустой очереди, т. е. о значении NotEl. Оно должно быть не целочисленной константой, а каким-то выделенным значением одного из типов содержимого Container. Без сведений о конкретных очередях узнать их выделенные элементы невозмо но, значит, определение NotEl, как и MaxSize, ну но возло ить на инициализа-ци очереди. результате представление очереди определено более точно: это Container, IB, IE, BFull, BEmpty, MaxSize и NotEl.
Для независимого от реализации понимания очереди в объектном стиле ну но декларировать методы для работы с объектами конструируемого типа. Это те же процедуры PutElQueue, GetElQueue и StateQueue, которые были представлены в первой реализации, а так е новая процедура (со старм именем) InitQueue, дополнительные действия которой — установка для MaxSize значения, передаваемого через параметр, генерация представляющего очередь объекта типа Container и определение NotEl. После окончания работы с экземпляром очереди этот экземпляр дол ен бть уничто ен, соответственно, появляется ее метод-деструктор DoneQueue.
Ее одно проектное реение, которое ну но принять, касается проце-
6 Словосочетание «разные типы» понимается здесь как возможность одновременного наличия в очереди объектов различных классов. Если мы захотим иметь общую реализацию для очередей «разных типов» с содержимым одного типа, то для этого придется воспользоваться более развитыми объектно-ориентированными средствами, чем необходимо для пояснения модуляризации.
724
12.
дуры IncI. Это служебная процедура, осуществляющая "закольцовывание" буфера с помощью манипулирования индексом. Если оставить ее в прежнем виде, то она становится методом конструируемого типа объектов, т. к. ее алгоритм зависит от атрибута объекта MaxSize. В то е время, предоставлять IncI на уровне использования не нужно. В TURBO Pascal'е версии 5.5 средств разграничения предоставляемх и слу ебных методов не предусмотрено, а значит, придется специально сообщать пользователю модуля об этих особенностях реализации. Более того, в этом языке нет средств оградить пользователя модуля от прямого обраения к атрибутам объектов. качестве альтернативы в данном конкретном случае уместно указать на возмо ность в -несения процедуры IncI на уровень обих средств модуля, представленных в разделе реализации, а значит, доступных только в данном модуле. Зависимость этой процедуры от контекста сводится к использованию атрибута MaxSize экземпляра очереди, которй мо но передавать через дополнительный параметр, и тогда процедура мо ет быть обей для всех экземпляров. В дальнейшем мы реализовываем первый вариант работы с IncI.
С учетом сказанного следующий фрагмент модуля AllQueue_5_5 нуждается только в одном пояснении. Мы определяем два типа для описания объектов-очередей: Tqueue и Pqueue. Первый из них задает структуру всех экземпляров очереди, а второй — тип указателей на нее. Смысл такого (практически стандартного в ) построения в том, что с объектными значениями намного удобнее работать, когда отведение памяти для них не регулируется стековым механизмом. Пока можно считать, что принятое решение диктуется особенностями реализации объектного типа Container в модуле ContainerUnit, который подключается к модулю AllQueue_5_5 в разделе uses. Программа 12.2.1
Предыдущая << 1 .. 245 246 247 248 249 250 < 251 > 252 253 254 255 256 257 .. 316 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100