Раздел 7.1 - Объектно-ориентированное программирование: Обзор

Главной новой возможностью Ada 95 является введение полной поддержки объектно-ориентированного (ОО) программирования. В Ada всегда присутствовала мощная поддержка близкого по смыслу подхода к разработке программного обеспечения, называемого ``объектно-базированным''. Прежде чем начать изучение того, каким образом в Ada поддерживается ООП, важно понять сущность объектно-ориентированного подхода, поэтому в этом уроке приводится обзор его основных принципов. Если вы уже хорошо знакомы с объектно-ориентированным подходом, можете сразу переходить к следующему уроку.

Функциональная декомпозиция

Сначала немного истории. В разработке программного обеспечения всегда существовали подходы, позволявшие упростить задачу. Один из широко известных подходов называется ``функциональной декомпозицией''. В этом подходе функция в программе разбивается (``декомпозируется'') на меньшие функции. В свою очередь, эти функции разбиваются на еще меньшие, и т.д. Например, функция ``есть_завтрак'' может быть разбита на функции ``снять_упаковку'', ``съесть_пищу'' и ``выбросить_мусор''. Функциональная декомпозиция очень просто реализуется в Ada с использованием подпрограмм. Функциональная декомпозиция по-прежнему является полезным методом решения некоторых задач, но она работает не слишком хорошо, если структура данных сложна. Поэтому для систем с нетривиальными структурами данных были разработаны другие подходы.

Объектно-базированный и объектно-ориентированный подходы

Два других подхода тесно связаны между собой и называются ``объектно- ориентированным'' и ``объектно-базированным'' подходами (последний также называют ``абстракцией типов данных''). Каждый из них является способом упрощения программ, существенно отличающимся от функциональной декомпозиции. В обоих случаях систему описывают в с помощью ``объектов''; каждый объект представлен в виде данных и набора операций над ними. Объекты могут быть реальными или абстрактными вещами, важными для решаемой задачи. Структура объекта и набор операций задаются с помощью типа объекта (также называемого классом). Пусть необходимо создать объект машина с элементом данных объем_оставшегося_топлива и операциями заправить и ехать(пункт_назначения). Можно создать два объекта типа машина с именами моя_машина и ваша_машина. У каждой из машин будет собственный объем_оставшегося_топлива и каждой машине будут соответствовать собственные операции заправить и ехать(пункт_назначения). В Ada всегда существовала поддержка такого подхода, реализуемая с помощью пакетов и типов.

Отличие между объектно-ориентированным и объектно-базированным подходами состоит в том, что в объектно-ориентированном подходе вводится концепция наследования для отображения способа человеческого мышления при классификации объектов. Наследование позволяет определить новые типы, (называемые также классами), которые являлись бы расширением уже существующих и формировали бы их иерархию. Наследование представляет собой отношение ``является типом чего-то'' (в отличие от отношения ``является частью чего-то'' или какого-либо другого отношения). Продолжая наш пример, можно создать два новых типа с именами ``мотоцикл'' и ``автобус'', которые являются разновидностями машин. Таким образом, мотоцикл и автобус будут наследниками типа машина. Отметим, что тип с именем ``колесо'' в общем случае не должен наследоваться от типа машина, так как колесо само по себе является не машиной, а ее частью.

Тип наследует все структуры данных и операции, т.е. в нашем примере автобус также будет иметь операцию ехать(пункт_назначения). Еще более важным является то, что, после создания нового типа, можно задать дополнительные операции, относящиеся только к нему или переопределить существующие для выполнения специальных действий над ним. К примеру, для автобуса можно добавить операцию, позволяющую ему взять_пассажиров, и эта новая операция будет применима только к автобусам, но не мотоциклам или другим машинам. Таким же образом можно переопределить операцию ``ехать(пункт_назначения)'' для автобусов, с тем, чтобы ее можно было выполнять каким-либо другим способом.

ООП является применением объектно-ориентированного подхода для разработки программного обеспечения. Грейди Буч (Grady Booch) [1994] дал следующее определение ООП: ``Объектно-ориентированное программирование - это метод реализации, в котором программы организуются в виде взаимодействующих наборов объектов, каждый из которых представляет собой экземпляр класса, а классы являются членами иерархии, связанной отношением наследования''.

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

Предупреждение: Излишнее упрощение

Важно понять, что изложение материала в этом уроке является во многом сильно упрощенным. В частности, определение термина ``объектно- ориентированный'' не такое уж и простое, что послужило поводом многих споров; нами выбрано его определение для ``классических языков''. В статье Object-Oriented Frequently Asked Questions (OO FAQ) приводятся обсуждение различных определений и методов, а так же доводы в пользу некоторых объектно-ориентированных подходов и реализаций. Отметим, что в Ada обращается особое внимание на безопасность и эффективность, в то время, как для других объектно-ориентированных языков характерны такие достоинства, как развитые лингвистические средства, простота или совместимость с более старыми языками. ОО FAQ содержит также библиографию изданий для получения дополнительной информации об объектно-ориентированных подходах.

Функциональная декомпозиция, определение которой дано выше, - это обычный способ реализации в Fortran и Pascal, хотя опять же, определения не универсальны и не обязательно принимаются всеми. В частности, не следует путать функциональную декомпозицию с процедурными языками программирования, которые поддерживают подход, являющийся существенно отличающимся расширением функциональной декомпозиции. Существуют другие системы декомпозиционных подходов (такие, как логическое программирование), описание которых выходит за рамки данного учебника. Можно также возразить, что абстракция типов данных и объектно-ориентированный подход - не одно и то же; такие доводы в общем основываются на более подробных определениях, которые никогда не были общепринятыми.


Упражнение:

Ниже приведены описания двух различных систем. Какое из описаний более ``объектно-ориентировано''?

Система 1 является противоракетной системой с тремя основными типами компонентов: радар, пусковая_установка и ракета. Радар сканирует область неба, определенную переменной область_сканирования. Когда радар находит цель, он отсылает пусковой установке сообщение ``найдена цель''. Когда пусковая_установка получает это сообщение и боевая_часть ``готова'', пусковая_установка выбирает ракету для запуска и посылает ракете команду ``пуск''. Ракета принимает команду ``пуск'', содержащую время запуска и предполагаемое положение цели, а затем стартует в заданное время. Есть два вида ракет: ракеты_большой_дальности и ракеты_малой_дальности.

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

Какое из описаний более ``объектно-ориентировано''?

  1. Система 1.
  2. Система 2.

Вы можете также:

PREVIOUS Перейти к предыдущему разделу

NEXT     Перейти к следующему разделу

OUTLINE  Вернуться к содержанию Урока 7

David A. Wheeler (dwheeler@ida.org)

Перевод: Юрий Королев   Общая редакция перевода: Г.Ю. Сисюк

Исходная копия этого документа находится по адресу "http://www.adahome.com/Tutorials/Lovelace/s7s1.htm".

Исходная копия перевода размещена на сайте http://www.ada-ru.org