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

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

Все вышесказанное привело к появлению нового, объектно- ориентированного, подхода к программированию (ООП).

В начале 1980-х гг. Б. Страуструп разработал язык C++, ставший первым промышленно используемым языком, использующим объектно-ориентированный подхода к программированию. Язык C++ был построен на базе двух языков — С и Simula 67, языка программного моделирования, разработанного в Европе. К этому моменту имелись и другие объектно-ориентированные языки, наиболее известным из которых был Smalltalk, являющийся чистым объектно-ориентированным языком. Однако ни один из них не нашел такого широкого применения, как C++.

В 1991 г. нидерландским программистом Гвидо ван Россумом был разработан язык программирования Python, включающий в себя как процедурные, так и объектно-ориентированные возможности.

В 1995 г. фирмой Sun Microsystems был разработан на основе языков С и C++ новый язык Java, используемый для создания интерактивных Web-страниц и в разработке приложений на базе Internet и Intranet, а также для реализации ПО устройств, взаимодействующих по сети. Объектный подход к программированию использован в новых версиях языков программирования Pascal, C++, Modula, Java

Ключевым понятием ООП является понятие объекта.

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

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

Однотипные объекты объединяются в классы. Класс — это совокупность объетов, имеющих одинаковые свойства и методы.

Основыми принципами ООП являются:

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

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

Инкапсуляция упрощает создание и сопровождение больших программ, так как инкапсулированные в объекте функции обмениваются с программой сравнительно небольшими объемами данных. В результате замена или модификация данных и методов, инкапсулированных в объект, как правило, не влечет за собой существенной модификации всей программы в целом. Кроме того, инкапсуляция дает возможность определения правил доступа к элементам объекта класса. Атрибуты доступа private, protected, public объявляют элементы класса соответственно закрытыми, защищенными и открытыми для доступа.

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

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

Различают несколько видов полиморфизма:

  • • общий полиморфизм (перегрузка операций, преобразование типов, перегрузка функций);
  • • чистый полиморфизм (виртуальные функции, абстрактные классы);
  • • параметрический полиморфизм.

Перегрузка операций — это переопределение действий операций применительно к объектам конкретных классов. Преобразование типов данных при совместном их использовании тоже является одним из методов полиморфизма.

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

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

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

Преимущества полиморфизма проявляются в следующем:

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

Итак, объектно-ориентированный подход к программированию имеет ряд существенных преимуществ перед структурным подходом:

  • • возможность более адекватного моделирования предметной области и, соответственно, программирования в понятиях, максимально приближенных к предметной области;
  • • многократное использование написанного кода;
  • • сокращение времени разработки и отладки программ.

Однако следует отметить и ряд недостатков объектно-ориентированного подхода:

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

Инкапсуляция снижает скорость доступа к данным. Запрет на прямой доступ к нолям класса извне приводит к необходимости создания и использования методов доступа, что ведет к дополнительным расходам.

Код, относящийся к классам-потомкам может находиться не только в этих классах, но и в их классах-предках. Это приводит к снижению скорости трансляции и выполнения программы.

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

 
Посмотреть оригинал
< Пред   СОДЕРЖАНИЕ   ОРИГИНАЛ     След >