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
Словосочетание «разные типы» понимается здесь как возможность одновременного на-
личия в очереди объектов различных классов. Если мы захотим иметь общую реализацию
для очередей «разных типов» с содержимым одного типа, то для этого придется воспользо-
ваться более развитыми объектно-ориентированными средствами, чем необходимо для по-
яснения модуляризации.