Объектно-ориентированное программирование




 

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

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

Создатели ООП – выдающиеся норвежские ученые К. Нигаард (Cristen Nygaard) и Оле-Йохан Даль (Ole-Johan Dahl). Работая над моделированием судовождения, Нигаард понял, что существующие программные средства малоэффективны в создании столь сложных программ, и тогда Нигаард начал разрабатывать концепции нового программирования, позволяющего преодолеть

барьеры сложности, которое впоследствии было названо объектно-ориентированным (сам термин был придуман Аланом Кеем, автором языка Java). Вместе с Оле-Йоханом Далем Нигаард разработал основные положения ООП и практические механизмы их реализации, которые затем были воплощены в первом ООЯ Simula. Заслуги этих ученых были по достоинству оценены мировым научным сообществом, и в 2001 г. Нигаард и Даль стали лауреатами премии имени Алана Тьюринга – своеобразного аналога Нобелевской премии в области вычислительных наук.

Язык Simula пользовался известностью в академических кругах, однако по ряду причин не завоевал популярности среди разработчиков коммерческого ПО. Тем не менее основные идеи и возможности ООП были очень привлекательны для программистов. Впоследствии были созданы другие ООЯ: Смолток (1980), Си++ (1985), Eiffel (1986), Object Pascal (1986) и Delphi (1995), Oberon-2 (1991), Java (1991), Visual Basic (1991) и многие другие. Некоторые из этих языков стали промышленными стандартами в программировании.

 

Особенности ООП

 

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

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

абстрагирование (отбрасывание несущественных деталей);

обобщение (выделение общих существенных признаков у разных явлений или предметов);

классификация (осознание связи между явлениями и степени их схожести).

Эти простые приемы помогают человеку справиться со сложностью рассматриваемых явлений. И объектно-ориентированные языки программирования также должны предоставлять подобные средства для «борьбы со сложностью» программ. Для реализации объектно-ориентированного подхода в языки программирования вводятся новые понятия:

объекты – особые программные структуры, объединяющие данные и алгоритмы их обработки;

инкапсуляция – сокрытие подробностей функционирования объектов;

наследование –«сокращенный» способ создания новых классов;

полиморфизм – возможность применения нескольких реализаций одной функции.

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

Классы – это объектные типы данных. Подобно тому как целые числа принадлежат какому-нибудь целочисленному типу (например, Integer или Byte), объекты также принадлежат какому-либо объектному типу – классу. Все объекты одного класса имеют одинаковый набор полей и одинаковый набор методов.

В некоторых языках (Си++, Java) объекты называются экземплярами класса (Instances).

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

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

С позиций «борьбы со сложностью» инкапсуляция позволяет переложить часть контроля за правильностью работы с объектами на компилятор (компьютер).

Различные ООЯ предлагают разные возможности по инкапсуляции полей и методов (от полного отсутствия и до автоматического сокрытия всех полей). В промышленных ООЯ, таких как Си++, Java, Delphi, Eiffel и т.д., предусмотрено три уровня инкапсуляции полей и методов:

Public – на обращение к публичным полям и методам объектов нет никаких ограничений;

Protected – прямое обращение к защищенным полям и методам возможно только из методов данного класса и методов дочерних классов;

Private – прямое обращение к приватным полям и методам возможно исключительно из методов данного класса.

Наследование – создание новых классов путем дописывания только отличий от уже существующих классов, опуская описания совпадающих элементов. При наследовании новый класс называется классом-потомком (производным, дочерним, подклассом), а исходный – классом-предком (базовым, родительским, суперклассом).

Наследование сокращает размер программы за счет исключения повторных описаний. Все поля и методы, объявленные в классе-предке, автоматически переносятся в класс-потомок, и их принято называть унаследованными (Inherited).

При необходимости любой родительский метод можно переопределить – т.е. назначить выполнение другого алгоритма в случае вызова одноименного метода класса-потомка.

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

Совокупность всех классов-предков и классов-потомков называется иерархией классов.

Наследование классов – центральное понятие ООП, на нем прямо или косвенно базируются все остальные понятия и механизмы. Абсолютному большинству механизмов ООП, чтобы проявить свои преимущества, требуется построение иерархий классов.

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

Если провести аналогию с реальной жизнью, то полиморфизм соответствует обобщенным действиям. Например, глагол «музицировать» означает «играть на музыкальном инструменте». Но на разных музыкальных инструментах играют по-разному. Термин один, а вариантов действия – много. Значит, «музицировать» – полиморфное действие. В ООП действию «музицировать» соответствовал бы полиморфный метод, имеющий свои реализации для каждого класса музыкальных инструментов.

В ООП есть два вида полиморфных методов – перегруженные и виртуальные.

Перегруженные методы предназначены для выполнения одинаковых по смыслу операций с данными разных типов. Они имеют одинаковые имена, но разные списки аргументов и/или тип возвращаемого значения.

Виртуальные методы предназначены для выполнения одинаковых по смыслу операций в объектах родственных, но не совпадающих классов. Виртуальные методы имеют одинаковые имена и прототипы. Их главная особенность – они всегда точно соответствуют реальному классу объекта.

Типичный пример перегруженных функций – функция SQR в Паскале. Она вычисляет квадрат числа, причем для целых аргументов результат будет также целым, а для вещественных – вещественным.

Достоинства виртуальных методов проявляются только при использовании иерархии классов. Типичная схема использования виртуальных методов такова:

1. В классе-предке иерархии объявляется полиморфный метод, который описывает некое полезное действие. При этом либо он использует виртуальный метод, либо сам является виртуальным.

2. В классах-потомках соответствующий виртуальный метод переопределяется – для каждого класса-потомка это полезное действие выполняется по-своему.

3. При вызове для объекта, принадлежащего классу-потомку, полиморфного метода на деле используется виртуальный метод класса-потомка (а не класса-предка).

Яркий пример подобного использования виртуальных методов – система графического оконного интерфейса Delphi или Visual Basic: каждый видимый элемент графического интерфейса – кнопка, ползунок, окно и т. п. – должен быть потомком класса TControl. В классе TControl вводятся общие полиморфные методы отрисовки элементов графического интерфейса, а любой его потомок может нарисовать себя на экране своим собственным способом.

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-04-03 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: