Пакеты

Пакеты

В семидесятые годы двадцатого века, в связи с развитием идей скрытия информации и абстракции данных, возникла необходимость в форме модуля, более совершенном, чем подпрограмма. Появилось несколько языков проектирования и программирования, наиболее известные из них: CLU, Modula-2 и Ada. В них предлагается сходная форма модуля, называемого в языке Ada пакетом, CLU - кластером, Modula - модулем. В нашем обсуждении будет использоваться термин пакет.4.4)

Пакеты - это единицы программной декомпозиции, обладающие следующими свойствами:

[x]. P1 В соответствии с принципом Лингвистических Модульных Единиц, "пакет" это конструкция языка, так что каждый пакет имеет имя и синтаксически четко определенную область.

[x]. P2 Описание каждого пакета содержит ряд объявлений связанных с ним элементов, таких как подпрограммы и переменные, которые в дальнейшем будут называться компонентами (features) пакета.

[x]. P3 Каждый пакет может точно определять права доступа, ограничивающие использование его компонентов другими пакетами. Другими словами, механизм пакетов поддерживает скрытие информации.

[x]. P4 В компилируемом языке (таком, который может быть использован для реализации, а не только для спецификации и проектирования) поддерживается независимая компиляция пакетов.

Благодаря свойству P3, пакеты можно рассматривать как абстрактные модули. Их главным вкладом в программирование является свойство P2, удовлетворяющее требованию Группирования Подпрограмм. Пакет может содержать любое количество связанных с ним операций, таких как создание таблицы, включение, поиск и удаление элементов. И нетрудно увидеть, как решение, основанное на использовании пакета, будет работать в рассматриваемом здесь примере табличного поиска. Ниже - в системе обозначений, заимствованной из нотации, используемой в последующих лекциях этого курса для ОО-ПО - приводится набросок пакета INTEGER_TABLE_HANDLING, описывающий частную реализацию таблиц целых чисел, основанную на использовании двоичных деревьев:

package INTEGER_TABLE_HANDLING feature

type INTBINTREE is

record

-- Описание представления двоичного дерева, например:

info: INTEGER

left, right: INTBINTREE

end

new: INTBINTREE is

-- Возвращение нового инициализированного INTBINTREE.

do ... end

has (t: INTBINTREE; x: INTEGER): BOOLEAN is

-- Содержится ли x в t?

do ... Реализация операции поиска ... end

put (t: INTBINTREE; x: INTEGER) is

-- Включить x в t.

do ... end

remove (t: INTBINTREE; x: INTEGER) is

-- Удалить x из t.

do ... end

end -- пакета INTEGER_TABLE_HANDLING

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

Пакеты-клиенты теперь могут работать с таблицами, используя различные методы из INTEGER_TABLE_HANDLING. Введем синтаксическое соглашение, позволяющее клиенту пользоваться методом f из пакета, для чего позаимствуем нотацию из языка CLU: P$f. В нашем примере типичные фрагменты программного текста клиента могут иметь вид:

-- Вспомогательные описания:

x: INTEGER; b: BOOLEAN

-- Описание t типа, определенного в INTEGER_TABLE_HANDLING:

t: INTEGER_TABLE_HANDLING$INTBINTREE

-- Инициализация t новой таблицей, создаваемой функцией new пакета:

t := INTEGER_TABLE_HANDLING$new

-- Включение x в таблицу, используя процедуру put пакета:

INTEGER_TABLE_HANDLING$put (t, x)

-- Присваивание True или False переменной b,

-- для поиска используется функция has пакета:

b := INTEGER_TABLE_HANDLING$has (t, x)

Отметим необходимость введения двух связанных между собой имен: одного для модуля, здесь это INTEGER_TABLE_HANDLING, и одного для его основного типа данных, здесь это INTBINTREE. Одним из ключевых шагов к ОО-программированию явится объединение этих двух понятий. Но не будем опережать события.

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

with INTEGER_TABLE_HANDLING then

... Здесь has означает INTEGER_TABLE_HANDLING$has, и т.д. ... end

Другим очевидным недостатком пакетов рассмотренного вида является их неспособность удовлетворять требованию Изменчивости Типов: приведенный выше модуль пригоден лишь для таблиц целых чисел. Однако, вскоре мы увидим, как устранить этот недостаток, делая пакеты универсальными (generic).

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

Языки, поддерживающие работу с пакетами, несколько различаются своими механизмами скрытия информации. Например, в языке Ada, внутренние свойства типа, такого как INTBINTREE, будут доступны клиентам, если не объявить тип как private (закрытый).

Часто для усиления скрытия информации в языках с инкапсуляцией предлагается объявлять пакет, состоящий из двух частей, интерфейса (interface) и реализации (implementation)(См. лекция 11 и лекция 5 курса "Основы объектно-ориентированного проектирования"). Закрытые элементы, такие как объявление типа или тело подпрограммы, включаются в раздел реализации. Однако такой подход приводит к добавочной работе для разработчиков модулей, заставляя их дублировать заголовки объявлений компонентов. При глубоком осмыслении правила Скрытия Информации все это не требуется. Подробнее эта проблема обсуждается в последующих лекциях.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг:

3.3. Пакеты в языке UML

Из книги автора

3.3. Пакеты в языке UML Пакет – основной способ организации элементов модели в языке UML. Каждый пакет владеет всеми своими элементами, т. е. теми элементами, которые включены в него. Про соответствующие элементы пакета говорят, что они принадлежат пакету или входят в него. При


Пакеты и репозитории

Из книги автора

Пакеты и репозитории Все дистрибутивы Linux, и Mint тут не исключение, организованы по пакетному принципу. Точно также, в виде пакетов, распространяются и любые дополнительные программы для них, создаваемые независимыми разработчиками. И потому одна из важных задач


Необходимые пакеты

Из книги автора

Необходимые пакеты Сервер FTP: ftp://ftp.linuxfromscratch.org/ Сервер HTTP: http://ftp.linuxfromscratch.org/ Загрузите все необходимые пакеты для компиляции системы LFS в одном tar-архиве: Все пакеты LFS – 105,560 KB: ftp://ftp.linuxfromscratch.org/lfs-packages/4.0/lfs-packages-4.0.tar http://ftp.linuxfromscratch.org/lfs-packages/4.0/lfs-packages-4.0.tar Или все пакеты по


14.3.1. Пакеты SYN

Из книги автора

14.3.1. Пакеты SYN Пакеты SYN используются для запроса на установку соединения. Вы можете отвергать эти пакеты для того, чтобы прервать попытки установить соединение.Иногда это необходимо, если вы хотите получать пакеты только в одном направлении, например, рабочая станция


4.20.7 Пакеты или PDU?

Из книги автора

4.20.7 Пакеты или PDU? Существует незначительная сложность в способе пересылки информации по Х.25. Некоторые сети X.25 передают пакеты очень маленького размера. Однако передать весь высокоуровневый PDU (например, датаграмму IP) можно через непрерывную последовательность пакетов


4.4. Офисные пакеты

Из книги автора

4.4. Офисные пакеты Open Office и К OfficeВ среде Linux наибольшее распространение получили два офисных пакета: K Office и Open Office, оба — свободно распространяемые. В большинство дистрибутивов включены они оба, так что вы можете выбирать инструмент, исходя из конкретной задачи.Пакет Open


19.2.4.5. В Linux создавайте RPM-пакеты

Из книги автора

19.2.4.5. В Linux создавайте RPM-пакеты Де-факто стандартным форматом для устанавливаемых бинарных пакетов в Linux является формат, используемый диспетчером пакетов Red Hat Linux, RPM (Red Hat Package manager). Он имеется в большинстве популярных дистрибутивов Linux и поддерживается фактически всеми


5. Лекция: Имена. Пакеты

Из книги автора

5. Лекция: Имена. Пакеты В этой лекции рассматриваются две темы – система именования элементов языка в Java и пакеты (packages), которые являются аналогами библиотек из других языков. Почти все конструкции в Java имеют имя для обращения к ним из других частей программы. По ходу


9.1.1. Пакеты и зависимости

Из книги автора

9.1.1. Пакеты и зависимости Пакет, как правило, содержит программу и вспомогательные файлы. Но не всегда в пакете находится все необходимое для запуска программы. Пакет может не содержать библиотеку, которую использует программа, а также другие программы, которые нужны для


Собираем пакеты

Из книги автора

Собираем пакеты Ну что ж, от теории плавно перейдем к практике. Ведь чтобы научится что-то хорошо защищать, необходимо взломать это. Нижеследующий текст никоим образом нельзя расценивать как руководство к действию. Материал приведен исключительно в ознакомительных


Пакеты

Из книги автора

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


Пакеты: оценка

Из книги автора

Пакеты: оценка По сравнению с подпрограммами, механизм пакетов приводит к существенному совершенствованию разбиения системы ПО на абстрактные модули. Собрать нужные компоненты "под одной крышей" крайне полезно как для поставщиков, так и для клиентов:[x]. Автор