Объектно ориентированное программирование
Объе́ктно ориенти́рованное программи́рование (ООП), парадигма программирования, в рамках которой программа представляется в виде совокупности объектов, а её выполнение состоит во взаимодействии между объектами. Объектом называется набор из данных и операций, которые можно выполнить над этими данными. Данные объекта обычно доступны для других объектов только через атрибуты (как правило, это специальные операции, которые или возвращают по запросу соответствующий элемент данных, или изменяют его значение). Взаимодействие между объектами осуществляется путём обращения объектов к операциям друг друга, т. н. отправкой сообщений (или вызовом методов), в результате также могут создаваться новые объекты.
Объекты даже с полностью одинаковыми исходными данными различны и могут изменяться независимо друг от друга (в ООП это свойство называют идентичностью). Механизм языка программирования, который позволяет создавать и использовать модули, состоящие из данных и операций, часть из которых может быть скрыта от внешнего доступа (т. е. они используются только внутри данного модуля), называется инкапсуляцией. Языки и технологии программирования, поддерживающие инкапсуляцию и идентичность объектов, а также возможность передачи объектов в качестве аргументов и результатов обращений к операциям, называются объектными (основанными на объектах). Их также часто называют объектно ориентированными.
Однако в строгом смысле объектно ориентированными называют объектные языки и технологии, которые дополнительно поддерживают механизмы наследования или делегирования. Наследование используется в языках, позволяющих явно определять классы. Класс – это тип объектов, задающий набор атрибутов и операций, одинаковых для всех объектов данного типа (значения атрибутов у разных объектов одного класса могут отличаться). Наследование – это отношение между двумя классами (классом-родителем и классом-потомком), при котором атрибуты и операции, определённые в классе-родителе (и, соответственно, имеющиеся у всех объектов данного класса), считаются определёнными и для класса-потомка (и всех его объектов). Механизм наследования позволяет программистам разрабатывать новые классы на основе существующих, добавляя только необходимые новые атрибуты и операции, тем самым реализуя многократное использование программного кода. Делегирование применяется в языках программирования, в которых нет явных классов; представляет собой отношение между объектами, при котором операции и атрибуты одного объекта (называемого прототипом) считаются определёнными у другого объекта, производного от этого прототипа (значения атрибутов производного объекта могут отличаться от их значений у объекта-прототипа). Подход, использующий механизм делегирования, называется прототипным программированием.
Для ООП характерна также возможность переопределять унаследованные или делегируемые операции, наделяя их новым смыслом (т. н. перегрузка). В результате объект класса-потомка (или производный объект) может использоваться в тех же местах программы, что и объект класса-родителя (или прототип), но обращение к его перегруженной операции будет вызывать специфичную именно для него реализацию данной операции, а не её реализацию в классе-предке (или прототипе). Такие перегружаемые операции называются виртуальными, а механизм, обеспечивающий вызов специфичной для данного объекта реализации, – динамическим связыванием.
Все основные элементы ООП впервые были реализованы в языке программирования Simula 67 (1967), предложенном норвежскими программистами К. Нюгордом и О.-Й. Далем. Однако отдельные элементы ООП встречались и раньше, например, в языке Simula I (1961–62), работах Массачусетского технологического института по искусственному интеллекту (1960-е гг.). Как отдельная парадигма программирования ООП реализовано в рамках языка Smalltalk и среды его разработки, созданных в начале 1970-х гг. на фирме Xerox PARC (США) А. Кеем. В эти же годы разработаны системы на базе различных комбинаций свойств ООП, например объектный язык CLU (1974). В начале 1980-х гг. с ростом популярности ООП были созданы объектно ориентированные расширения популярных языков программирования – CLOS (расширение языка LISP), Objective C и С++ (расширения языка C), а также множество объектно ориентированных языков, например Eiffel (1985), Oberon (1986), Java (1995). Первым языком, основанным на понятиях прототипов и делегирования, был Self (1986), наибольшее распространение из языков данной группы получил ECMAScript, ранее называвшийся JavaScript (1995).
ООП, как правило, используется совместно с объектно ориентированными анализом и проектированием (ООАП), в которых подход к анализу предметной области и высокоуровневому проектированию программного обеспечения основан на выделении классов и объектов, а также определении возможных взаимодействий между ними и выделении операций и атрибутов, используемых при таких взаимодействиях, как базы для создания программ. При этом выделяемые классы и объекты могут непосредственно соответствовать понятиям предметной области (например, вектор, клиент, счёт) или быть абстракциями, определяемыми сообразно со спецификой конкретной задачи (например, обработчик сообщений протокола HTTP, решатель алгебраических уравнений). Методы ООАП развивались на основе методов структурного проектирования программ. Первыми методами ООАП считают метод Коуда – Юрдона (1990) (американских программистов П. Коуда и Э. Юрдона) и метод американского программного инженера Г. Буча (1994), нацеленные на выделение объектов предметной области и использование соответствующих абстракций в программах. В дальнейшем было предложено несколько десятков методов ООАП, из которых наиболее известны метод OMT (1991), описанный американским программистом Дж. Рамбо и др., предназначенный для создания объектно ориентированных приложений над базами данных, и Objectory (1992), предложенный шведским программистом И. Якобсоном. Многие идеи методов ООАП интегрированы в графическом языке моделирования UML (см. CASE-технологии) и методе разработки программного обеспечения RUP (1996), созданных Бучем, Якобсоном, Рамбо и др.
В начале 21 века ООП – один из наиболее широко применяемых подходов в программировании. Его успех обусловлен поддержкой модульности программ и возможностью многократного использования программного кода (т. е. предоставление различных возможностей применения ранее написанного кода в новых программах), что облегчает сопровождение сложного программного обеспечения. Кроме того, прямое соответствие между объектами предметной области и объектно ориентированной модели на первых этапах анализа повышает наглядность моделирования, а в дальнейшем снижает затраты на внесение изменений в разрабатываемую систему. ООП позволяет достаточно эффективно создавать и поддерживать широко востребованные виды программного обеспечения – информационные системы для бизнеса, системы имитационного моделирования, интерактивное, игровое и мультимедийное программное обеспечение. Также возможно применение ООП для создания других видов систем, однако это не всегда приводит к меньшим (по сравнению с другими подходами) затратам при их разработке и сопровождении.