Опубликован: 23.10.2005 | Доступ: свободный | Студентов: 4089 / 201 | Оценка: 4.44 / 4.19 | Длительность: 33:04:00
Специальности: Программист
Лекция 15:

OO-программирование и язык Ada

Ключевые концепции

  • Язык Ada, изучаемый как представитель класса "инкапсулирующих языков", включающего также Modula-2, предлагает конструкции модульной декомпозиции - пакеты (и задачи).
  • Внимание уделяется скрытию информации: интерфейс и реализация объявляются отдельно.
  • Универсальность увеличивает гибкость пакетов.
  • Конфликты между методологическими и реализационными требованиями порождают "закрытый" раздел - концептуально секретный, но синтаксически включаемый в интерфейс.
  • Пакет - это чисто синтаксический механизм. Модули отделены от типов. Невозможен никакой механизм наследования.
  • Исключения отделяют обнаружение ошибок от их обработки, но не дают чудесного решения проблемы ошибок времени выполнения.
  • Механизм исключений Ada должен использоваться только дисциплинированным путем; любое выполнение обработчика исключений должно приводить либо к повтору операции, либо к появлению исключения в вызывающей программе.
  • Типы задач могут, в принципе, использоваться для реализации классов без наследования, но это решение непрактично в современном окружении.
  • Ada 95 делает возможным определение нового типа, порожденного существующим типом с поддержкой переопределения подпрограмм, полиморфизма и динамического связывания.

Библиографические замечания

[Booch 1986a] обсуждает (под маркой "ОО-проектирование", но не используя классы, полиморфизм и т. д.) как достичь некоторых преимуществ объектной ориентации в Ada.

Официальное описание языка Ada [ANSI 1983] не рекомендуется ни для чтения в постели ни как начальный курс. Для этих целей доступна многочисленная литература.

Ссылки на другие модульные языки, упомянутые в начале этой лекции: [Mitcell 1979] - Mesa, [Wirth 1982] - Modula-2, [Liskov 1981, Liskov 1986] - CLU, [Shaw 1981] - Alphard.

Комментированный список учебников по Ada 95 приведен в [Feldman-Web]. Я благодарен Ричарду Рихли и Магнусу Кемке за прояснение ряда вопросов относительно Ada 95, конечно, высказанные здесь замечания принадлежат мне. Магнус Кемке указал мне на диссертацию Матса Вебера.

Упражнения

У15.1 Как выиграть, не используя скрытия

Проблема компиляции пакетов Ada, приведшая к появлению закрытого раздела в интерфейсе, в равной степени затрагивает и ОО-языки, если среда программирования поддерживает независимую компиляцию классов. В действительности, проблема кажется более серьезной из-за наследования: объявленная переменная типа C, может во время выполнения ссылаться на экземпляры не только типа C, но и любого класса-наследника. Поскольку любой наследник может добавить свои атрибуты, размер этих экземпляров различен. Если C - отложенный класс, невозможно даже присвоить его экземплярам размер по умолчанию. Объясните, почему, несмотря на эти замечания, ОО-нотация этой книги не нуждается в языковой конструкции, подобной механизму private языка Ada. (Подсказка: Ваши рассуждения должны рассматривать, в частности, следующие понятия: расширенные типы в сравнении со ссылочными типами, отложенные классы и технические приемы, используемые в нашем ОО-каркасе для создания спецификации абстрактных классов, не требующие от автора классов ш_ написания двух отдельных частей модуля.) Обсудите компромиссы того и другого решения. Можете ли Вы предложить другие подходы к решению проблемы каркаса языка Ada?

У15.2 Родовые параметры подпрограммы

Родовые параметры пакетов Ada могут быть не только типами, но и подпрограммами. Объясните релевантность этой возможности для реализации ОО-понятий и ее ограничения. (См. также приложение В.)

У15.3 Классы как задачи (для программистов Ada)

Перепишите класс COMPLEX как тип задачи Ada. Приведите примеры, использущие результирующий тип.

У15.4 Добавление классов к Ada

(Это упражнение предполагает хорошее знание языка Ada.) Придумайте адаптацию Ada 83, сохраняющую понятие пакета, но расширяющую записи до классов с полиморфизмом, динамическим связыванием и наследованием (единичным или множественным), в соответствии с общими принципами ОО.

У15.5 Пакеты-классы

(Это упражнение предполагает хорошее знание Ada 83.) Используя в качестве образца типы задач, придумайте адаптацию Ada 83, поддерживающую пакеты, создающие экземпляры во время выполнения, а, следовательно, играющие роль классов с полиморфизмом, динамическим связыванием и наследованием.