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

Объектно-ориентированное программирование (ООП) - одна из парадигм программирования, которая рассматривает программу как множество "объектов", которые взаимодействуют между собой. Основу ООП составляют три основные концепции: инкапсуляция, наследования и полиморфизм. Одним из преимуществ ООП является лучшая модульность программного обеспечения (тысячу функций процедурного языка, в ООП можно заменить несколькими десятками классов со своими методами). Несмотря на то, что эта парадигма появилась в 1960-х годах, она не имела широкого применения в 1990-х, когда развитие компьютеров и компьютерных сетей позволил писать чрезвычайно объемное и сложное программное обеспечение, что заставило пересмотреть подходы к написанию программ. Сегодня многие языков программирования или поддерживают ООП или вполне объектно-ориентированными (в частности, Java, C #, C + +, Python, PHP, Ruby и Objective-C, ActionScript 3).

Объектно-ориентированное программирование уходит своими корнями к созданию языка программирования Симула в 1960-х годах, одновременно с усилением дискуссий о кризисе программного обеспечения. Вместе с тем, как усложнялось аппаратное и программное обеспечение, было очень трудно сохранить качество программ. Объектно-ориентированное программирование частично решает эту проблему путем подчеркивания модульности программы [1].

В отличие от традиционных взглядов, когда программу рассматривали как набор подпрограмм, или как список инструкций компьютеру, ООП программы можно считать совокупностью объектов. Согласно парадигмы объектно-ориентированного программирования, каждый объект способен получать сообщение, обрабатывать данные, и передачи другим объектам. Каждый объект - своеобразный независимый автомат с отдельным назначением и ответственностью [2].


1. Определение ООП

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

По мнению Алана Кея, разработчика языка Smalltalk, которого считают одним из "отцов-основателей" ООП, объектно-ориентированный подход заключается в следующем наборе основных принципов:

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

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


2. История

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

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

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

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

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


3. Фундаментальные понятия

В результате исследования Деборы Дж. Армстронг ( англ. Deborah J. Armstrong ) [4] компьютерной литературы, изданной за последние 40 лет, удалось отделить фундаментальные понятия (принципы), использованы в большинстве определений объектно-ориентированного программирования. К ним относятся:

Класс
Класс определяет абстрактные характеристики некоторой сущности, включая характеристики самой сущности (ее атрибуты или свойства) и действия, которые она способна выполнять (его поведения, методы или возможности). Например, класс Собака может характеризоваться чертами, присущими всем собакам, в частности: порода, цвет меха, способность лаять. Классы вносят модульность и структурированность в объектно-ориентированную программу. Как правило, класс должен быть понятным для не программистов, которые знают предметной области, что в свою очередь, значит, что класс должен иметь значение в контексте. Также, код реализации класса должно быть достаточно самодостаточным. Свойства и методы класса, вместе называются его членами.
Объект
Отдельный экземпляр класса (создается после запуска программы и инициализации полей класса). Класс Собака отвечает всем собакам путем описания их общих черт; объект Сірко является одним отдельным собакой, отдельным вариантом значений характеристик. Собака имеет мех; Сірко имеет коричнево-белый мех. Объект Сірко является экземпляром (экземпляром) класса Собака. Совокупность значений атрибутов отдельного объекта называется состоянием. На основе класса Собака можно, также, создать другой объект Дружок, который будет отличаться от объекта Сірко своим состоянием (например цветом меха). Оба объекта (Сирко и Дружок) являются экземплярами класса Собака.
Метод
Возможности объекта. Поскольку Сірко - Собака, он может лаять. Поэтому гавкати() является одним из методов объекта Сірко. Он может иметь и другие методы, в частности: місце(), или їсти(). В рамках программы, использование метода должно влиять только на один объект; все Собаки могут лаять, но надо чтобы лаял только один отдельный собака.
Сообщения
"Передача данных от одного процесса другому, или передачи вызовов методов." [4]
Наследование
Класс может иметь "подклассы", специализированные, расширенные версии сверхкласса. Могут даже образовываться целые деревья наследования. Например, класс Собака может иметь подклассы Коллі, Пекінес, Вівчарка и т.п. Так, Сірко может быть экземпляром класса Вівчарка. Подклассы наследуют атрибуты и поведение своих родительских классов, и могут вводить свои собственные. Наследование может быть единичное (один непосредственный родительский класс) и множественное (несколько родительских классов). Это зависит от выбора программиста, который реализует класс и языка программирования. Так, например, в Java разрешено только одинарное наследование, а в С + + и то и другое.
Сокрытие информации (инкапсуляция)
Сокрытие деталей о работе классов от объектов, которые используются или посылают им сообщения. Так, например, класс Собака имеет метод гавкати(). Реализация этого метода описывает как должно происходить лай (например, сначала вдихнути() а затем видихнути() на выбранной частоте и громкости). Петр, хозяин пса Сірка, не должен знать как он лает. Инкапсуляция достигается путем указания, какие классы могут обращаться к членам объекта. Как следствие, каждый объект представляет каждому иному классу определенный интерфейс - члены, доступные другим классам. Инкапсуляция нужна для того, чтобы предотвратить использование пользователями интерфейса тех частей реализации, которые, скорее всего, будут меняться. Это позволит облегчить внесение изменений, то есть, без необходимости изменять и пользователей интерфейса. Например, интерфейс может гарантировать, что щенки могут добавляться только к объектам класса Собака кодом самого класса. Часто члены класса обозначаются как публичные ( англ. public ), Защищенные ( англ. protected ) И частные ( англ. private ), Определяя, доступны они всем классам, подклассам, или только класса в котором они определены. Некоторые языки программирования идут еще дальше: Java использует ключевое слово private для ограничения доступа будет разрешен только из методов того же класса, protected - только из методов того же класса и его потомков и из классов с того же пакета, C # и VB.NET открывают некоторые члены только для классов из той же сборки путем использования ключевого слова internal (C #) или Friend (VB.NET), а Eiffel позволяет указывать какие классы имеют доступ к любым членов.
Абстрагирование
Упрощение сложной действительности путем моделирования классов, соответствующих проблеме, и использования приемлемого уровня детализации отдельных аспектов проблемы. Например Собака Сірко большую часть времени может рассматриваться как Собака, а когда нужно получить доступ к информации специфичной для собак породы колли - как Коллі и как Тварина (возможно, родительский класс Собака) при подсчете животных Петра.
Полиморфизм
Полиморфизм означает зависимость поведения от класса, в котором это поведение вызывается, т.е. два или более классов могут реагировать по-разному на одинаковые сообщения. Например, если Собака получает команду голос(), то в ответ можно получить Гав; если Свиня получает команду голос (), то в ответ можно получить Рох-рох. На практике - это реализуется путем реализации ряда подпрограмм (функций, процедур, методы и т.д.) с одинаковыми именами, но с разными параметрами. В зависимости от того, что передается и выбирается соответствующая подпрограмма.

3.1. Прототипная-ориентированное программирование

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

4. Критика

  • Результаты исследования Potokьа и других [1] не показали существенной разницы в производительности между ООП и процедурным подходами.
  • Christopher J. Date заявляет, что критическое сравнение ООП с другими технологиями, в частности, реляционной практикой является очень сложным из-за отсутствия согласованности и четкого определения ООП [5]
  • Александр Степанов утверждает, что ООП обеспечивает математически ограниченную точку зрения, и назвал его "почти таким большим обманом, как и Искусственный интеллект" (видимо, имея в виду неудачные и излишне "раздутые" проекты по созданию искусственного интеллекта в 1980-х).
  • Эдсгер Дийкстра "... то, что общество требует превосходя - это панацея. Конечно, панацея имеет различные названия - иначе вы не продали ничего подобного "Structured Analysis and Design", "Software Engineering", "Maturity Models", "Management Information Systems", "Integrated Project Support Environments" "Object Orientation" и " Business Process Re-engineering "(последние известные, как IPSE, OO и BPR соответственно)." EWD 1175 The strengths of the academic enterprise.

5. Источники информации

  1. Meyer, chapter 3
  2. Booch, chapter 2
  3. Гради Буч, Роберт А. Максимчук, Майкл В. Энгля, Бобби Дж. Янг, Джим Коналлен, Келли А. Хьюстон. Объектно-ориентированный анализ и проектирование с примерами приложений. М.: Вильямс, 2008. - 720с.
  4. а б Armstrong, "The Quarks of Object-Oriented Development." In descending order of popularity, the "quarks" are: Inheritance, Object, Class, Encapsulation, Method, Message Passing, Polymorphism, Abstraction
  5. CJ Date, Introduction to Database Systems, 6th-ed., Page 650

См.. также

Разработка программного обеспечения
Известны
деятели
Кент Бек ? Гради Буч ? Фред Брукс ? Barry Boehm ? Уорд Каннингем ? Оле-Йохан Даль ? Том Демарк ? Эдсгер Вибе Дейкстра ? Дональд Кнут ? Мартин Фаулер ? Чарльз Энтони Ричард Хоар ? Watts Humphrey ? Майкл Энтони Джексон ? Ивар Якобсон ? Craig Larman ? James Martin ? Bertrand Meyer ? David Parnas ? Winston W. Royce ? James Rumbaugh ? Никлаус Вирт ? Эдвард Иордан ? Стив Макконнелл
Процесс
Концепции
Моделирование данных ? Архитектура ПО ? Функциональная спецификация ? Язык моделирования ? Парадигма программирования ? Программное обеспечение (Методология разработки ? Цикл разработки ? Качество ? качества ? Структурный анализ)
Направления
Программирование ( Аспектно-ориентированное ? Объектно-ориентированное ? Проблемно-ориентированное) ? Онтология ? Сервисно-ориентированная архитектура ? Оценка затрат на разработку
Модели
разработки
Гибкая методология разработки ? Cleanroom ? CASE ? Итеративная разработка ? RUP ? OpenUP ? RAD ? Scrum ? MSF ? Спиральная модель ? Водопадная модель ? XP ? V-Model ? Dual Vee Model ? DSDM
Другие модели
CMM ? CMMI ? Модель данных ? Function model ? IDEF ? Information model ? Metamodeling ? Object model ? View model ? UML
Другое
Информатика ? Компьютерная инженерия ? Организационная инженерия ? История разработки ПО ? Конфигурационное управление ? Документирование ? Управление проектами ? Управление программами ? Общее управление качеством ? Эргономика ? Системотехника ? Обратная разработка