Файл: Основные понятия объектно- ориентированного программирования.pdf
Добавлен: 04.04.2023
Просмотров: 154
Скачиваний: 2
Введение
Объектно-ориентированный подход в программировании стал особенно популярен в последние несколько десятилетий: производители ПО один за другим создают объектно-ориентированные версии своих продуктов, практически все современные языки программирования поддерживают данную методологию, широкое распространение получили системы визуального программирования, образованные на её. Механизмы, похожие на наследование в ООП, можно обнаружить в области искусственного интеллекта, где для представления информации широко применяются иерархические структуры. Архитектура современных компьютеров также строится из отдельных модулей, разнообразных по внутренней организации, но объединенных общими интерфейсами. Можно с уверенностью сказать, что достоинства ООП при разработке сложных систем признаются подавляющим большинством разработчиков. Неуклонно растет количество публикаций, учебных и популярных изданий, посвященных ООП. Студенты и начинающие программисты все чаще выбирают объектно-ориентированные языки в качестве платформы для обучения.
В данной работе мы рассмотрим причины и истоки появления объектно-ориентированной парадигмы, узнаем, как она развивалась и какие формы принимала, разберем основополагающие принципы и термины данной концепции. Также мы постараемся не обойти вниманием практическую сторону применения объектно-ориентированного подхода: рассмотрим наиболее известные объектно-ориентированные языки программирования, порассуждаем о плюсах и минусах данного подхода и о его возможном будущем.
Глава 1. История и предпосылки возникновения
1.1. Формирование объектно-ориентированного подхода
Объектно-ориентированное программирование возникло в качестве реакции на очередной кризис ПО и обусловлено ограниченностью методов программирования, существовавших ранее. Разработка проектов путем непосредственного написания кода устарела: с возрастанием размера и сложности программ стало понятно, что такой подход не всегда удачен. Структурное программирование, много лет остававшееся главным способом организации программ, перестало справляться с неуклонно растущей сложностью программных продуктов. Программы стали слишком объемными, а список команд - слишком громоздким, что стало приводить к огромному количеству ошибок и как следствие срывам сроков и материальному ущербу.[1] Результатом борьбы с данной проблемой и стали первые разработки в области объектно-ориентированной концепции.[2]
Зарождение объектно-ориентированного подхода, как парадигмы восприятия мира, можно отнести едва ли не к временам Карла Линнея, высказавшего идею рода и вида — прототип иерархической организации - и Чарльза Дарвина, эти виды классифицировавшего. Из-за похожего способа решения задач в повседневной жизни объектно-ориентированные идеи часто проще понять новичку, чем профессиональному разработчику, который привык размышлять и оперировать совсем другими категориями.[3]
Впервые объектный подход проявил себя в разработке программно-аппаратного графического планшета (Sketchpad: A Man-Machine Graphical Communications System), разработанного Иваном Сазерлендом, принимавшем участие в создании симуляторов вертолетов в военно-научном агентстве DARPA. Сазерленд известен тем, что защитил восемь патентов по компьютерной графике, проектировал шагающих роботов в Калифорнийском университете, а позже занял должность вице-президента Sun Microsystems. С помощью светового пера и выпадающих разделов меню пользователь графического планшета мог рисовать на дисплее различные изображения, перемещать их и хранить в памяти. Вместо понятия «класс» Сазерленд использовал определение «мастер», а объект, существующий на экране, был его экземпляром.
Первые разработки в области объектно-ориентированного программирования можно отнести к 60-м годам. Именно тогда стал очевидным постоянный рост сложности компьютерных систем и необходимость продумывания методов, помогающих с ней справиться. Далеким предком современных ООЯП принято считать язык Simula 67, созданный сотрудниками Норвежского Вычислительного Центра Кристеном Нюгором и Оле-Йоханом Далем для моделирования сложных систем. Первая реализация Simula оказалась малоэффективной. Разработчикам не удалось объяснить ценности своего изобретения, кроме того, на пьедестале языков тогда господствовал Фортран. Simula остался языком, используемым лишь в образовательных целях для подготовки будущих программистов.
Одним из «отцов» объектно-ориентированного программирования считается американский ученый, лауреат премии Тьюринга и автор запоминающейся фразы «лучший способ спрогнозировать будущее — изобрести его», Алан Кей.[4] В соавторстве с коллегами из Xerox PARC Кей в 1970-х годах разработал на основе Simula объектно-ориентированный язык Smalltalk, в свою очередь оказавший большое влияние на развитие Objective-C, Actor, Java, Erlang, Groovy, Ruby и многих других языков программирования.[5]
В 1974 году основоположник концепции искусственного интеллекта Марвин Мински отделил описание класса объекта от его конкретного представления, предугадав современное понятие объекта в C++. В 1976 году программистом Кристеном Нюгором был создан язык BETA, в котором появилась концепция шаблонов.[6]
Следующий важный этап развития объектно-ориентированных технологий пришелся на конец 70-х. В 1979 году сотрудник фирмы Bell Labs Бьёрн Страуструп проектирует и реализует язык, названный им ≪С с классами≫. Желая перенести возможности Simula в быстрый и многофункциональный язык С, (базовый язык системы UNIX, на которой работали компьютеры Bell Labs), Страуструп добавляет в С возможность работы с классами и объектами, в результате чего становятся доступными практические задачи моделирования.[7] По воспоминаниям Страуструпа С++ был призван совместить в себе средства организации программ, присущие Simula и эффективность, гибкость, свойственные языку С.
Предыстория С++ началась за пару лет до его официального появления. Бьерн Страуструп работал над докторской диссертацией в лаборатории вычислительной техники Кембриджского университета. Именно тогда его заинтересовал подход к построению программ из четко определяемых модулей. Экспериментируя с моделированием, Страуструп смог по достоинству оценить гибкость языка Simula и его возможности естественного переноса понятий из предметной области на языковые конструкции, не встречавшиеся в других языках.[8] В то же время Страуструп заметил, что реализация Simula не была достаточно масштабируемой: она хорошо справлялась с небольшими программами, но для более крупных была не приспособлена. Кроме того, производительность итоговой программы была очень низкой, что объясняется особенностями языка и его реализацией. Страуструп как-то заметил, что язык его мечты — это Algol68 с классами, как в Simula, но на практике С оказался более подходящим для воплощения мечты. «С с классами» долгое время продолжал рассматриваться лишь как диалект С, даже классы носили название абстрактных типов данных. Много лет после создания С++ ушло на его поддержку и разработку сопутствующей документации, а также на выпуск новых, улучшенных версий.
Новоизобретенный язык очень скоро стал настоящим хитом, из «С с классами» был переименован в С++, и в следующие несколько десятилетий продолжил развиваться и обогащаться новыми конструкциями и возможностями.[9] С++ доказал, что объектно-ориентированное программирование— это не просто перечень новых свойств, добавленных в уже существующий язык, это совершенно иной подход к процессам решения задач и разработки программного обеспечения.
Первая всемирная конференция по объектно-ориентированным системам состоялась уже в 1986 году, а через год инженер Apple Уильям Аткинсон создал систему HyperCard - прообраз современных визуальных сред разработки. В 1989 году рядом крупных компаний (3Com, American Airlines, Canon, Hewlett-Packard, Philips Telecommunications, Sun Microsystems и другие) была создана группа OMG (Object Management Group), поставившая своей целью сформировать стандарты объектного программирования и упростить внедрение приложений с помощью кроссплатформенных технологий. Именно тогда началась разработка единого стандарта CORBA (Common Object Request Broker Architecture) – набора спецификаций, определяющих способы объектно-ориентированного взаимодействия без привязки к конкретным языкам. Последняя официальная версия стандарта была выпущена в 2002 году.
Еще большую популярность данная технология получила во второй половине 90-х, в эпоху расцвета сети Интернет.[10] Именно из С++ были заимствованы основные конструкции и возможности для языка Java, позволяющего как простое создание и использование компонентов, так и конструирование многокомпонентных программ. В 2000 году Microsoft анонсирует объектную платформу .NET и новый язык программирования C#, вобравший в себя лучшие качества Java, однако предложенный в противовес ему.[11]
В последующие годы появлялось огромное количество новых концепций и методологий разработки ПО. Все они по-своему определяли взаимодействие заказчиков, постановщиков задач и разработчиков, но ни один язык моделирования не может похвастаться универсальностью UML. Благодаря этому языку графического описания можно применить один и тот же подход к разработке проектов разной сложности и структуры. [12]
В настоящее время объектно-ориентированный подход при разработке систем различной степени сложности является общепризнанным. Появляются новые языки и среды разработки, совершенствуются стандарты, но одновременно с этим растут и технологические запросы общества, усложняются возникающие задачи. Возможно, в недалеком будущем будет создан объектно-ориентированный язык, в котором наконец удастся реализовать все принципы и обширные возможности, задуманные авторами Smalltalk почти полвека назад.
1.2 Отличия от других методов
Существует два наиболее известных подхода к созданию программ – процедурно-ориентированный и объектно-ориентированный. Можно написать код, используя любой из этих методов, однако между ними существует ряд принципиальных различий.
Основной структурой процедурного метода является подпрограмма или процедура, отсюда и его название. Данные по большей части расположены отдельно от процедур и являются глобальными. Они легко подвергаются модификации вне области видимости кода: зачастую доступ к данным может стать неконтролируемым и непредсказуемым. Кроме того, процедурное программное обеспечение обычно рассматривается как инструмент для решения конкретной задачи, вследствие чего, программа может оказаться непригодной для решения других более сложных проблем, даже при условии использования тех же самых данных.[13] При работе с объектами все эти проблемы решаются путем объединения данных и поведения. Понятие глобальных данных в объектно-ориентированных моделях почти полностью отсутствует, что обеспечивает высокую степень целостности информации.[14]
В отличие от объектно-ориентированного подхода процедурный не дает возможности выделения абстракций, в основе же ООП лежит принцип представления программы как совокупности связанных между собой абстрактных объектов, входящих в иерархическую структуру.[15] Еще одно существенное отличие — возможность повторного использования кода, которая делает разработку программного обеспечения быстрее и эффективнее.
Резюмируя, можно сказать, что процедурное программирование больше подходит для решения задач средней сложности. В случае усложнения требований к программе, гораздо эффективнее будет обратиться к объектно-ориентированному подходу.
1.3 Сущность концепции и методологии
Между объектно-ориентированным подходом и объектно-ориентированным языком программирования есть значительная разница. Подход — это парадигма, первичная идея, язык же – это инструмент поддержки парадигмы. В этой главе мы обсудим концепцию объектно-ориентированного программирования, а не технологию, так как технологии, особенно в индустрии разработки программного обеспечения склонны к постоянным изменениям, а концепция является некоей константой, однако постоянно эволюционирующей и претерпевающей изменения. Самый значительный скачок эта эволюция совершила в последние десятилетия, собственно, как и эволюция всей технологической сферы, но основные идеи актуальны сегодня так же, как и несколько десятков лет назад.[16]