Определение ООП и его основные концепции

Автор работы: Пользователь скрыл имя, 31 Октября 2013 в 11:02, доклад

Краткое описание

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

Содержание

1 История
2 Основные понятия
3 Определение ООП и его основные концепции
3.1 Сложности определения
3.2 Концепции
4 Особенности реализации
5 Подходы к проектированию программ в целом
6 Родственные методологии
6.1 Компонентное программирование
6.2 Прототипное программирование
6.3 Класс-ориентированное программирование
7 Производительность объектных программ
8 Критика ООП
9 Объектно-ориентированные языки
10 Примечания
12 Литература

Прикрепленные файлы: 1 файл

Доклад.docx

— 43.93 Кб (Скачать документ)

Содержание

 

1 История

2 Основные понятия

3 Определение ООП и  его основные концепции

3.1 Сложности определения

3.2 Концепции

4 Особенности реализации

5 Подходы к проектированию  программ в целом

6 Родственные методологии

6.1 Компонентное программирование

6.2 Прототипное программирование

6.3 Класс-ориентированное программирование

7 Производительность объектных  программ

8 Критика ООП

9 Объектно-ориентированные  языки

10 Примечания

12 Литература

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

История

 

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

Формирование КОП от ООП  произошло, как случилось формирование модульного от процедурного программирования: процедуры сформировались в модули — независимые части кода до уровня сборки программы, так объекты сформировались в компоненты — независимые части  кода до уровня выполнения программы. Взаимодействие объектов происходит посредством  сообщений. Результатом дальнейшего  развития ООП, по-видимому, будет агентно-ориентированое программирование, где агенты — независимые части кода на уровне выполнения. Взаимодействие агентов происходит посредством изменения среды, в которой они находятся.

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

Первым языком программирования, в котором были предложены принципы объектной ориентированности, была Симула. В момент своего появления (в 1967 году), этот язык программирования предложил поистине революционные идеи: объекты, классы, виртуальные методы и др., однако это всё не было воспринято современниками как нечто грандиозное. Тем не менее, большинство концепций были развиты Аланом Кэйем и Дэном Ингаллсом в языке Smalltalk. Именно он стал первым широко распространённым объектно-ориентированным языком программирования.

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

Основные понятия

 

Абстрагирование — это способ выделить набор значимых характеристик объекта, исключая из рассмотрения незначимые. Соответственно, абстракция — это набор всех таких характеристик.

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

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

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

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

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

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

 

Определение ООП  и его основные концепции

 

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

Наличие инкапсуляции достаточно для объектности языка программирования, но ещё не означает его объектной ориентированности — для этого требуется наличие наследования.

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

Язык Self, соблюдая многие исходные положения объектно-ориентированного программирования, ввёл альтернативное классам понятие прототипа, положив начало прототипному программированию, считающемуся подвидом объектного.

 

Сложности определения

 

ООП имеет уже более  чем сорокалетнюю историю, но, несмотря на это, до сих пор не существует чёткого общепринятого определения  данной технологии. Основные принципы, заложенные в первые объектные языки  и системы, подверглись существенному  изменению (или искажению) и дополнению при многочисленных реализациях  последующего времени. Кроме того, примерно с середины 1980-х годов термин «объектно-ориентированный» стал модным, в результате с ним произошло то же самое, что несколько раньше с термином «структурный» (ставшим модным после распространения технологии структурного программирования) — его стали искусственно «прикреплять» к любым новым разработкам, чтобы обеспечить им привлекательность. Бьёрн Страуструп в 1988 году писал, что обоснование «объектной ориентированности» чего-либо, в большинстве случаев, сводится к ложному силлогизму: «X — это хорошо. Объектная ориентированность — это хорошо. Следовательно, X является объектно-ориентированным».

Тимоти Бадд пишет:

Роджер Кинг аргументированно настаивал, что его кот является объектно-ориентированным. Кроме прочих своих достоинств, кот демонстрирует  характерное поведение, реагирует  на сообщения, наделён унаследованными  реакциями и управляет своим, вполне независимым, внутренним состоянием.

По мнению Алана Кея, создателя языка Smalltalk, которого считают одним из «отцов-основателей» ООП, объектно-ориентированный подход заключается в следующем наборе основных принципов (цитируется по вышеупомянутой книге Т. Бадда).

 

Всё является объектом.

 

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

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

Каждый объект является представителем класса, который выражает общие свойства объектов (таких, как целые числа  или списки).

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

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

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

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

Определить ООП можно  и многими другими способами.

 

Концепции

 

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

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

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

Однако общность механизма  обмена сообщениями имеет и другую сторону — «полноценная» передача сообщений требует дополнительных накладных расходов, что не всегда приемлемо. Поэтому в большинстве  ныне существующих объектно-ориентированных  языков программирования используется концепция «отправка сообщения  как вызов метода» — объекты  имеют доступные извне методы, вызовами которых и обеспечивается взаимодействие объектов. Данный подход реализован в огромном количестве языков программирования, в том числе C++, Object Pascal, Java, Oberon-2. В настоящий момент именно он является наиболее распространённым в объектно-ориентированных языках.

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

 

Особенности реализации

 

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

Информация о работе Определение ООП и его основные концепции