Главная » Просмотр файлов » М. Бен-Ари - Языки программирования. Практический сравнительный анализ (2000)

М. Бен-Ари - Языки программирования. Практический сравнительный анализ (2000) (1160781), страница 38

Файл №1160781 М. Бен-Ари - Языки программирования. Практический сравнительный анализ (2000) (М. Бен-Ари - Языки программирования. Практический сравнительный анализ (2000)) 38 страницаМ. Бен-Ари - Языки программирования. Практический сравнительный анализ (2000) (1160781) страница 382019-09-19СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 38)

type Ptr is access Airplane_Package.Airplanes;

-- Тип с компонентом ADT

procedure Display(Parm: in Airplane_Package.Airplanes);

-- Параметр ADT

A: Airplane_Package.Airplane_Data;

Index: Integer;

begin

A .:=... ;

Airplane_Package.New_Airplane(Airplane, A, Index);

Display(Airplane);

end Air_Traffic_Control;

За использование ADT вместо абстрактных объектов данных придется запла­тить определенную цену: так как в теле пакета больше нет ни одного неявного объекта, каждая интерфейсная процедура должна содержать дополнительный параметр, который явно сообщает подпрограмме, какой именно объект нуж­но обработать.

Вы можете спросить: а как насчет «абстракции»? Поскольку тип Airplaines теперь объявлен в спецификации пакета, мы потеряли все абстракции; боль­ше нельзя изменить структуру данных, не повлияв на другие единицы, ис­пользующие пакет. Кроме того, кто-нибудь из группы программистов может скрытно проигнорировать процедуры интерфейса и написать «улучшенный» интерфейс. Мы должны найти решение, в котором имя типа находится в спе­цификации так, чтобы его можно было использовать, а детали реализации ин­капсулированы — что-нибудь вроде следующего:

package Airplane_Package is

type Airplane_Data is ... end record;

type Airplanes; -- Неполное объявление типа

end Airplane_Package;

package body Airplane_Package is

type Airplanes is -- Полное объявление типа

record

Database: array(1..1000) of Airplane_Data;

Current_Airplanes: Integer 0...Database'Last;

end record;

end Airplane_Package;

Потратьте несколько минут, чтобы проанализировать этот вариант самостоя­тельно перед тем, как идти дальше.

Что касается пакета, то с этими объявлениями нет никаких проблем, пото­му что спецификация и тело формируют одну область объявлений. Проблемы начинаются, когда мы пробуем использовать пакет:

with Airplane_Package;

procedure Air_Traffic_Control is

Airplane_1: Airplane_Package.Airplanes;

Airplane_2: Airplane_Package.Airplanes;

end Air_Traffic_Control;

Язык Ada задуман так, что компиляции спецификации пакета достаточно, чтобы сделать возможной компиляцию любой единицы, использующей па­кет. Фактически, не нужно даже, чтобы существовало тело пакета, когда ком­пилируется использующая единица. Но чтобы откомпилировать приведен­ную выше программу, компилятор должен знать, сколько памяти нужно вы­делить для Airplane_1 и Airplane_2; аналогично, если эта переменная исполь­зуется в выражении или передается как параметр, компилятор должен знать размер переменной. Таким образом, если представление ADT инкапсулиро­вано в тело пакета, откомпилировать программу будет невозможно.

Приватные (private) типы

Поскольку мы имеем дело с реальными языками программирования, которые должны компилироваться, не остается ничего другого, кроме как вернуть полную спецификацию типа в спецификацию пакета. Чтобы достичь абст­ракции, используется комбинация самообмана и правил языка:

package Airplane_Package is

type Airplane_Data is ... end record;

type Airplanes is private;

-- Детали будут заданы позже

procedure New_Airplane(Data: in Airplane_Data; I: out Integer);

procedure Get_Airplane(I: in Integer; Data: out Airplane_Data);

private

type Airplanes is -- Полное объявление типа

record

Database: array(1 ..1000) of Airplane_Data;

Current_Airplanes: Integer 0.. Database'Last;

end record;

end Airplane_Package;

Сам тип первоначально объявлен как приватный (private), в то время как пол­ное объявление типа записано в специальном разделе спецификации пакета, который вводится ключевым словом private. Тип данных абстрактный, пото­му что компилятор предписывает правило, по которому единицам, обращаю­щимся к пакету через with, не разрешается иметь доступ к информации, запи­санной в закрытой (private) части. Им разрешается обращаться к приватному типу данных только через подпрограммы интерфейса в открытой (public) час­ти спецификации; эти подпрограммы реализованы в теле, которое может иметь доступ к закрытой части. Так как исходный код использующих единиц не зависит от закрытой части, можно изменить объявления в закрытой части, не нарушая правильности исходных текстов использующих единиц; но, ко­нечно, нужно будет сделать перекомпиляцию, потому что изменение в закры­той части могло привести к изменению выделяемого объема памяти.

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

Ограниченные типы

Достаточно объявить объект (переменную или константу) приватного типа, и над ним можно будет выполнять операции присваивания и проверки на ра­венство, так как эти операции выполняются поразрядно независимо от внут­ренней структуры. Существует, однако, концептуальная проблема, связанная с разрешением присваивания и проверки равенства. Предположим, что в ре­ализации массив заменен на указатель:

package Airplane_Package is

type Airplanes is private;

private

type Airplanes_jnfo is

record

Database: array(1..1000) of Airplane_Data;

Current_Airplanes: Integer O..Database'Last;

end record;

type Airplanes is access Airplanes_info;

end Airplane_Package;

Мы обещали, что при изменении закрытой части не потребуется менять ис­пользующие единицы, но здесь это не так, потому что присваивание делается для указателей, а не для указуемых объектов:

with Airplane_Package;

procedure Air_Traffic_ControI is

Airplane_1: Airplane_Package.Airplanes;

Airplane_2: Airplane_Package.Airplanes;

begin

Airplane_1 := Airplane_2; -- Присваивание указателей

end Air_Traffic_Control;

Если присваивание и проверка равенства не имеют смысла (например, при сравнении двух массивов, которые реализуют базы данных), язык Ada позволя­ет вам объявить приватный тип как ограниченный (limited). Объекты ограничен­ных типов нельзя присваивать или сравнивать, но вы можете явно написать свои собственные версии для этих операций. Это решит только что описанную про­блему; при преобразовании между двумя реализациями можно изменить в теле пакета явный код для присваивания и равенства, чтобы гарантировать, что эти операции по-прежнему имеют смысл. Неограниченными приватными типами следует оставить лишь «небольшие» объекты, которые, вероятно, не подверг­нутся другим изменениям, кроме добавления или изменения поля в записи.

Обратите внимание, что если приватный тип реализован с помощью ука­зателя, то в предположении, что все указатели представлены одинаково, уже не важно, каков тип указуемого объекта. В языке Ada такое предположение фактически делается и, таким образом, указуемый тип может быть определен в теле пакета. Теперь изменение структуры данных благодаря косвенности доступа не требует даже перекомпиляции единиц с конструкцией with:

package Airplane_Package is

type Airplanes is private;

private

type Airplanes_info; -- Незавершенное объявление типа

type Airplanes is access Airplanes_info;

end Airplane_Package;

package body Airplane_Package is

type Airplanes_info is -- Завершение в теле

record

Database: array(1..1000) of Airplane_Data;

Current_Airplanes: Integer O..Database'Last;

end record;

end Airplane_Package;

ADT является мощным средством структурирования программ благодаря чет­кому отделению спецификации от реализации:

• Используя ADT, можно делать серьезные изменения в отдельных компо­нентах программы надежно, не вызывая ошибок в других частях про­граммы.

• ADT может использоваться как инструмент управления разработкой: архитектор проекта разрабатывает интерфейсы, а каждый член группы программистов реализует один или несколько ADT.

• Можно выполнить тестирование и частичную интеграцию, применяя вырожденные реализации отсутствующих тел пакетов.

В главе 14 мы подробнее поговорим о роли ADT как основы объектно-ори­ентированного программирования.

13.5. Как писать модули на языке C++

Язык C++ — это расширение языка С, и поэтому здесь тоже существует поня­тие файла как единицы структурирования программ. Наиболее важным рас­ширением является введение классов (classes), которые непосредственно реа­лизуют абстрактные типы данных, в отличие от языка Ada, который использу­ет комбинацию из двух понятий: пакета и приватного типа данных. В следую­щей главе мы обсудим объектно-ориентированное программирование, кото­рое основано на классах; а в этом разделе объясним основные понятия клас-

сов и покажем, как они могут использоваться для определения модулей.

Класс аналогичен спецификации пакета, которая объявляет один или не-

сколько приватных типов:

class Airplanes {

public:

struct Airplane_Data {

char id[80];

int speed;

int altitude;

};

void new_airplane(const Airplane_Data & a, int & i);

void get_airplane(int i, Airplane_Data & a) const;

private:

Airplane_Data database[1000];

int current_airplanes;

int find_empty_entry();

};

Обратите внимание, что имя класса, которое является именем типа, также слу­жит в качестве имени инкапсулирующей единицы; никакого самостоятельного имени модуля не существует. Класс имеет общую и закрытую части. По умолча­нию компоненты класса являются приватными, поэтому перед общей частью необходим спецификатор public. Фактически, при помощи спецификаторов public и private можно задать несколько открытых и закрытых частей вперемежку, в отличие от языка Ada, который требует, чтобы для каждой части был только один список объявлений:

class С {

public:

private:

public:

….

private:

…..

};

Объявления в общей части доступны любым модулям, использующим этот класс, в то время как объявления в закрытой части доступны только внутри класса. Спецификатор const в get_airplane — это следующее средство управ­ления, он означает, что подпрограмма не изменяет никакие данные внутри объекта класса. Такие подпрограммы называются инспекторами (inspectors).

Поскольку класс является типом, могут быть объявлены объекты (кон­станты и переменные) этого класса, так называемые экземпляры класса:

Airplanes Airplane; // Экземпляр класса Airplanes

int index;

Airplanes::Airplane_Data a;

Airplane.new_airplane(a, index); // Вызов подпрограммы для экземпляра

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

Синтаксис вызова подпрограммы отличается от синтаксиса, принятого в языке Ada, из-за различий в исходных концепциях. Вызов в языке Ada:

Airplane_Package.New_Airplane(Airplane, A, Index);

рассматривает пакет как применение ресурса — процедуры New_Airplane, ко­торой должен быть задан конкретный объект Airplane. Язык C++ полагает, что объект Airplane — это экземпляр класса Airplanes, и, если вы посылаете объекту сообщение (message) new_airplane, для этого объекта будет выполнена соответствующая процедура.

Обратите внимание, что даже такие подпрограммы, как find_empty_entry, которые используются только внутри класса, объявлены в определении класса. Язык C++ не имеет ничего похожего на тело пакета, пред­ставляющее собой единицу, которая инкапсулирует реализацию интерфей­са и других подпрограмм. Конечно, внутренняя подпрограмма недоступна другим модулям, потому что она объявлена внутри закрытой части. В языке C++ проблема состоит в том, что, если необходимо изменить объявление find_empty_entry или добавить другую приватную подпрограмму, придется перекомпилировать все модули программы, которые используют этот класс; в языке Ada изменение тела пакета не воздействует на остальную часть про­граммы. Чтобы достичь на языке C++ реального разделения интерфейса и реализации, следует объявить интерфейс как абстрактный класс, а затем получить конкретный производный класс, который содержит реализацию

Характеристики

Тип файла
Документ
Размер
2,54 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
Как Вы думаете, сколько людей до Вас делали точно такое же задание? 99% студентов выполняют точно такие же задания, как и их предшественники год назад. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6363
Авторов
на СтудИзбе
310
Средний доход
с одного платного файла
Обучение Подробнее