Автор Анна Евкова
Преподаватель который помогает студентам и школьникам в учёбе.

Основные понятия объектно-ориентированного программирования (История и предпосылки возникновения ООП)

Содержание:

Введение

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

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

Глава 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]

Объектно-ориентированные концепции не зависят от используемого языка или инструмента, их скорее можно назвать способом мышления, взглядом на мир под определенным углом.[17] Главная идея заключается в том, что все программные разработки должны быть основаны на повторно используемых компонентах, как это происходит в других отраслях, например, в электронике или строительстве, а сам объектно-ориентированный подход диктует, какую форму эти компоненты должны принимать.[18]

Самый рациональный способ управления сложными системами был известен с древнейших времен — divide et impera (разделяй и властвуй). Выход — в декомпозиции системы на все меньшие и меньшие части, каждую из которых можно обрабатывать независимо от других. Решая любую сложносоставную задачу, мы должны проанализировать существующую проблему, выделить основные сущности и объединить эти сущности во множества, каждое из которых будет представлено своим состоянием и поведением. После этого можно представить каждое множество сущностей в виде класса, объявив в нём общие данные и функции, и обеспечить статическую взаимосвязь этих классов. В результате из реальных объектов предметной области мы получим организованную совокупность взаимодействующих программных объектов. Каждый из них является экземпляром определенного класса, классы же в свою очередь образуют иерархию на принципах наследования.[19] Можно сказать, что объектно-ориентированное программирование сводится к моделированию объектов, которые взаимодействуют друг с другом, посылая сообщения, в ответ на которые выполняют действия, описанные в методах, соответствующих сообщениям. Поскольку все возможные действия объекта описаны его методами, этот несложный механизм поддерживает все возможные варианты взаимодействий.[20]

Таким образом, основная мыслительная деятельность программиста реализуется главным образом в процессе описания класса. Именно на этом этапе продумываются и вводятся в структуру класса поля, методы и свойства. Чтобы понять ООП, нужно прежде всего развить в себе способность оперировать абстракциями и представлять задачу как набор взаимодействующих объектов. ООП — это не новый стиль программирования или новая группа языков, это всего лишь новая парадигма, которая требует перестройки сознания и навыков, пересмотра привычных подходов.[21]

Объектно-ориентированное программирование в основном нацелено на разработку крупных программных проектов. При этом создание отдельных элементов системы может выполняться разными специалистами. В отличие от функционального программирования ООП ставит в приоритет описание структуры проектируемой системы, а не её поведения. Цель в том, чтобы каждая элементарная единица проекта имела точно определённый набор функций и минимально вступала во взаимодействие с другими частями системы. Огромное значение при разработке программ имеет грамотное построение иерархии классов. Именно поэтому один из главных недостатков ООП — это проблема хрупкости базового класса. При полностью выстроенной иерархии оказывается очень трудным внести изменения в код классов-родителей, ведь даже малейшая доработка сразу отразится на классах-потомках.[22]

Среди основных ООП-методологий можно выделить:

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

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

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

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

2.1 Абстрагирование

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

В программировании абстракции существовали всегда. Начиная с первого программиста Ады Лавлейс и до наших времен люди создают в своих программах абстракции разной степени сложности, часто используя для этого простейшие средства. Например, Харольд Абельсон и Джеральд Джей Сассман в своей фундаментальной книге «Структура и интерпретация компьютерных программ» описывают разработку системы решения уравнений с поддержкой комплексных чисел, имея в наличии лишь процедуры и связные списки.

В объектно-ориентированном программировании под абстракцией понимается использование исключительно тех параметров и характеристик объекта, которые необходимы для его точного представления в системе. Абстрагирование является одним из важнейших инструментов ООП наряду с полиморфизмом, наследованием и инкапсуляцией. Цель в том, чтобы сократить представление об объекте до минимального, но достаточного для работы с ним и решения поставленной задачи.[26] Главная миссия разработчика — выделить наиболее значимые характеристики отдельного объекта, отличающие его от других, и определить его особенности для последующего рассмотрения и анализа.[27]

2.2 Инкапсуляция

Нередко инкапсуляцию рассматривают как признак, присущий только объектно-ориентированному программированию, но на самом деле она часто встречается и в других методиках. В ООП инкапсуляция неразрывно связана с абстрагированием. В частности, в сообществе С++ или Java принято рассматривать инкапсуляцию без сокрытия как неполноценную. В различных языках программирования понятие «инкапсуляция» может иметь одно или несколько определений:

  • механизм, ограничивающий доступ одних программных компонентов к другим;
  • конструкция, связывающая данные и методы, предназначенные для обработки этих данных.[28]

Суть инкапсуляции - в объединении в одно целое, как бы в «капсуле», всей информации об объекте - данных и методов их обработки. Таким образом, все объекты могут быть рассмотрены как минимальные самодостаточные единицы инкапсуляции.[29] Объекту нет необходимости показывать всю свою структуру и данные — на поверхности лежат лишь интерфейсы, необходимые для взаимодействия с другими сущностями, а детали реализации, не относящиеся к использованию объекта могут быть скрыты.[30] Сокрытие данных внутри объекта может осуществляться разными способами. Один из них — связывание данных с объектом путем присвоения им доступа private, public или protected. Данные с ключевым словом private могут быть использованы только внутри объекта, данными же с ключевым словом public можно оперировать и вне его. Точно так же, к функциям объекта с доступом private можно обращаться только из функций этого объекта, а к функциям объекта с доступом public предусмотрен доступ извне. Грамотное построение программы требует присваивать как можно большему количеству данных и функций статус private, обеспечивая обращение к объекту только через интерфейс. Одним из негласных правил является принцип сокрытия в объектах всего, что возможно, тем самым исключая непреднамеренный доступ и нежелательные изменения данных извне, что обеспечивает большую устойчивость и надежность объектов и всей системы в целом. Такую программу гораздо легче модифицировать, ведь при сохранении интерфейса класса можно менять его реализацию, не затрагивая внешний код. Понятие инкапсуляции тесно связано не только с сокрытием информации, но и с разграничением ответственности между клиентом и сервером. Клиенту необязательно знать, как реализованы те или иные методы в сервере. Ему достаточно знать, что данный метод делает и как к нему обратиться.[31]

В С++ определение класса состоит из двух частей: интерфейс и реализация. Интерфейс или протокол класса содержит объявление переменных и методов, а также комментарии, описывающие операции класса. Определения методов в том виде, в котором они реализованы в языке, отделены от интерфейса и размещаются в реализации класса. Интерфейс описан в заголовочном файле с расширением .H, а реализация — в файле с уточнением .CPP. В заголовочном файле размещаются объявления переменных класса и заголовки функций, реализующих методы.[32]

2.3 Наследование

Для похожих объектов в ООП предусмотрено совместное использование общих для них поведения и свойств. Самые распространенные способы организации такого использования — это классы и их наследование. Объекты, обладающие одинаковым поведением, объединяются в класс, который «хранит» информацию о структуре объектов и методах их взаимодействия. Наследование же дает возможность разделять поведение и структуру между несколькими классами.[33] Его можно назвать одним из самых мощных средств в любой объектно-ориентированной системе, ведь именно оно позволяет повторно использовать один и тот же код, избегая дублирования.[34]

Суть механизма наследования в следующем: некоторый класс объявляется базовым, из него порождается новый производный класс. Порожденный класс, обладающий состоянием и поведением базового, дополняется новыми, определёнными только в нём, данными и функциями. Каждый производный класс может добавить в структуру и поведение что-то свое, что-то из наследуемого может использовать без изменений, а что-то модифицировать. Таким образом, с помощью подклассов класс как бы «уточняет» поведение экземпляров, благодаря чему создаваемые объекты становятся более уникальными и специализированными. Классы могут наследовать друг у друга без каких-либо ограничений, тогда наследуемые компоненты будут автоматически накапливаться сверху вниз через все уровни, образуя древовидную структуру, так называемую иерархию классов. Чаще всего иерархия представляется в виде графа или дерева. Также стоит сказать, что наследование транзитивно, то есть класс может наследовать черты классов, находящихся от него на несколько уровней выше, при этом обладая способностью переопределять некоторые свойства и поведение.[35]

Язык C++/CLI, позволяет множественное наследование, при котором класс может быть создан на основе нескольких базовых классов. Однако это может привести к проблемам, связанным с неоднозначностью наследования. Чтобы избежать этого языки C# и Java, а также язык C++/CLI, запрещают множественное наследование классов, но допускают множественное наследование интерфейсов.[36]

Таким образом существует два основных типа наследования: при «простом» в системе фигурируют «базовые» («родительские») классы, производящие наследование и классы-«потомки» («наследники», «производные»), наследуемые от родительских.

В случае «множественного» наследования класс может иметь несколько предков, наследуя методы от каждого из них. Данный подход, являющийся более гибким, представлен в таких языках как «C++», «Python», «Eiffel», «UML». В то же время такое наследование может породить большое количество ошибок при наличии идентичных имён методов в классах-предках. Разработчики «Eiffel» попытались решить данную проблему следующим образом: при создании нового класса нужно указать не только импортируемые члены каждого из наследуемых классов, но и их именование в дочернем. Большинство современных объектно-ориентированных языков («C#», «Java», «Delphi») поддерживают возможность одновременного наследования от класса-предка и реализации методов нескольких интерфейсов одним и тем же классом, что позволяет заменить множественное наследование.[37]

2.4 Полиморфизм

Третья важнейшая сущность объектно-ориентированного программирования — это полиморфизм. Само слово, дословно означающее множественность форм (poly — много, morphos— форма, греч.), имеет похожие по значению термины во многих отраслях науки — полиморфные виды в биологии, полиморфные химические соединения. В программировании полиморфизм можно определить как возможность работы с разными типами данных, используя при этом единообразный интерфейс. Полиморфный объект — это некая сущность (переменная, аргумент функции), хранящая во время выполнения программы значения различных типов, полиморфные функции— это функции, имеющие полиморфные аргументы.[38] Как мы знаем, каждый подкласс наследует свойства и методы от родительских классов, однако ему могут потребоваться разные методы для ответа на одно и то же сообщение: здесь на помощь и приходит полиморфизм.[39] Его суть в возможности единообразного обращения к объектам при сохранении их уникального поведения. Одно и то же действие обозначается идентичным именем, которое используется во всей иерархии порождения классов. Например, базовый и производный классы могут иметь одноимённые функции, реализованные по-разному, обращаться к этим функциям тоже надо соответствующим образом. Полиморфизм дает возможность создавать множественные определения для операций и функций, а какое определение будет использоваться, зависит от контекста программы.[40]

2.5 Объект

Понятие объекта использовалось человеком с древнейших времен: еще античные греки высказывали идею о том, что мир можно трактовать в категориях и объектов, и событий. В XVII веке Рене Декарт замечал, что человечество рассматривает вселенную с объектно-ориентированной точки зрения, где объект — это модель окружающей действительности, существующей во времени и пространстве. В компьютерной технике понятие «объект» стало применяться при разработке компьютеров, отходящих от фон-неймановской архитектуры, дабы проложить границу между высоким уровнем программного продукта и низким уровнем вычислительной машины.[41]

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

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

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

Объект может не только изменять свое собственное состояние, но и воздействовать на другие объекты: взаимодействие осуществляется путем обмена сообщениями. Совокупность сообщений, понимаемых объектом, называется его интерфейсом. Чтобы программа полноценно функционировала, необходимо, чтобы все объекты в её составе имели максимально полные, но в то же время простые интерфейсы.[44]

Так, например, языки C++/CLI и C# описывают интерфейс как совокупность функций, свойств и событий, в языке Java интерфейс место событий занимают статические переменные. Интерфейсы тесно связаны с классами: будучи наследованным, интерфейс обязывает классы подчиняться установленным им правилам поведения. Таким образом, объекты, созданные из разных классов, наследующих идентичный интерфейс, в определённых ситуациях будут вести себя одинаково. В отличие от классов из интерфейсов невозможно создать объекты, для этого они не предназначены. Их главное назначение заключается в формировании поведения объектов путём навязывания классу объекта обязательной реализации функций, свойств и событий, указанных в интерфейсе.[45]

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

За исключением языков вроде Lua и JavaScript, где отсутствует понятие «класс», в подавляющем большинстве объектно-ориентированных языков (Java, C++, C#), все объекты являются экземплярами определенного класса. Именно в классе прописана вся необходимая для построения объекта информация, даже объём памяти, необходимый для его хранения. Сам объект хранится в системе в виде характеристик всех его полей и ссылок на методы класса, к которому он принадлежит. А вот в языке программирования Python объектами являются все возможные значения, даже классы. Другими словами, мы может создать метакласс, экземплярами которого будут другие классы.[47]

Объекты создаются при помощи конструктора класса, а уничтожаются с помощью деструктора (C++), сборщика мусора (Java и C#), или с использованием счетчика ссылок на объект и сообщения («dealloc» в Objective-C). Назначение конструктора состоит в инициализации значений данных нового объекта, а его имя совпадает с именем класса. При создании объекта обычно используется тот конструктор, параметры которого смогут обеспечить требуемые начальные значения данных объекта.[48] В С++ каждый класс должен иметь хотя бы один конструктор, но обычно их несколько. Конструктор создает «пустой» объект, распределяя память для размещения его переменных, и заполняет его, определяя, какими значениями эти переменные будут обладать. «Конструктор по умолчанию» вызывается в случае, если конструктор не был создан вручную, он не имеет параметров и не может инициализировать объекты. «Конструктор копии» имеет один единственный параметр-константу или ссылку на объект данного класса и позволяет инициализировать новый объект значением уже существующего. «Конструктор преобразования типа» также имеет один параметр, тип которого не совпадает с тем, что задан конструктором, и инициализирует новый объект другого типа, заданного в параметре.[49]

Деструктор — это функция класса, существующая для уничтожения ранее созданного объекта. Деструктор вызывается, по умолчанию, когда объект выходит из области видимости или удаляется.[50] Освобождая память, используемую объектом, он уничтожает все результаты работы конструктора. В С++ имя деструктора совпадает с именем класса с предшествующим символом "~". Тело деструктора обычно не содержит данных, за исключением случаев, когда конструктор распределил память для переменных с помощью оператора new: в этом случае в тело деструктора должен помещаться оператор delete, освобождающий память.

2.6 Класс

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

Класс — это некий шаблон, своеобразный «чертеж», описывающий объекты определенной структуры и поведения и определяющий механизмы создания экземпляра класса. Посредством переменных класс описывает структуру объекта, посредством методов — его поведение. Таким образом, методы и переменные прописаны в классе, в то время как индивидуальные значения переменных определены в экземпляре.[52] Попытка объяснить взаимосвязь классов и объектов напоминает стремление разрешить извечную дилемму о яйце и курице. В данном случае можно сказать, что первым все-таки был именно класс, так как без него объект не может появиться.[53]

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

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

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

Вот как будет выглядеть создание нового класса в языке С++:

class Имя класса

{

Раздел атрибутов;

Раздел операций

}

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

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

В С++ переменную называют элемент-данное, а метод — элемент - функция, так как реализация метода представляет собой функцию в обычном понимании этого слова. В других языках программирования, например в Delphi, метод может быть представлен процедурой.[55]

Чтобы каждый раз заново не разрабатывать похожие классы, существуют созданные профессиональными программистами библиотеки классов стандартных объектов. Имея в наличии подходящую библиотеку классов, достаточно добавить её в файл программы, выбрать необходимый класс и создать из него нужное количество объектов с требуемыми значениями. Библиотеки значительно ускоряют написание программ, увеличивают их надёжность, так как создаются из неоднократно проверенных и отлаженных классов. Наиболее известны и популярны среди программистов такие библиотеки классов как STL, MFC, ATL, .NET Framework Class Library, java.lang, java.util,java.io и другие.[56]

Глава 3. Объектно-ориентированные языки программирования

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

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

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

1. объектные (Smalltalk, Simula-67, Java, C#). Эти языки наиболее строго следуют объектной парадигме;

2. объектно-ориентированные (С++, Object Pascal Objective-C). Для языков данной группы ООП является приоритетным подходом, но не единственно возможным;

3. смешанные с поддержкой ООП (Common Lisp с CLOS, Clojure). В этих языках объектный подход реализуется посредством использования библиотек и расширений.

Языки каждой из групп обладают своими неоспоримыми достоинствами. Например, Smalltalk, наиболее наглядно представляющий объектную парадигму, не нашел широкого применения из-за проблем с быстродействием. Язык Java перегружен тяжелыми синтаксическими конструкциями и ориентирован главным образом на кроссплатформенные приложения. C#, во многом копирующий Java, имеет неплохие перспективы, но его распространение затрудняется ориентированностью лишь на продукцию Microsoft. Объектно-ориентированный С++ получил наибольшую популярность в образовательной среде, несмотря на свой главный недостаток - объём и количество библиотечных средств. Третья группа языков, уходящая корнями в Lisp-традиции, могла бы считаться наиболее перспективной для изучения, если бы не низкая востребованность Lisp-специалистов на рынке труда.

В настоящее время наиболее популярными языками объектно-ориентированного программирования являются С++, Java и C#, из них C++ употребляется наиболее широко.[58] Java уступает ему первое место, так как лишен столь важных компонентов, как указатели, шаблоны и множественное наследование, что делает его гораздо менее мощным и гибким. Другие объектно-ориентированные языки, например, С#, тоже успешно развиваются, однако также уступают по распространению C++.[59]

Глава 4. Плюсы и минусы ООП

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

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

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

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

Однако, по общему признанию, принцип наследования в ООП не является идеальным. Базовый класс, от которого происходит наследование, является слишком крупной единицей для повторного использования, а проектирование качественного базового класса крайне затруднительно и требует досконального знания всех будущих областей применения.[64]

Глава 5. Критика объектно-ориентированного подхода

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

В 2000 году на весь компьютерный мир прогремела публикация статьи доктора компьютерных наук, старшего архитектора по разработке ПО в Sun Microsystems, а позже в IBM, Ричарда Гэбриела «Почему объектно-ориентированное программирование провалилось». Острый и злободневный текст вызвал бурную полемику, в которую включились все, от редакции популярного журнала Dr. Dobb’s Journal до всемирно известного специалиста в области информационных технологий Эндрю Таненбаума.[66]

Спустя два года после выхода нашумевшей статьи, автор был приглашен на ежегодную конференцию OOPSLA — одно из самых авторитетных мероприятий IT-сообщества, затрагивающее темы, связанные с системами объектно-ориентированного программирования, языками и методологиями разработки ПО. Оппонентом Ричарда Гэбриела в профессиональном споре стал разработчик языка Scheme, специалист-теоретик по ООП Гай Стил. В качестве еще одного критика ООП выступил специалист по Lisp, автор многочисленных книг и стандартизаций Пол Грэм. К «защитникам» объектно-ориентированных технологий примкнул автор множества трудов и работ по теории ООП Джеймс Ноубл.[67]

В своем выступлении Пол Грэм замечает, что большинство концепций ООП не оправдали себя: “Метод повторного использования почему-то связали с объектно-ориентированным программированием. К примеру, библиотеки можно подгружать и повторно использовать сколько угодно, при этом неважно, написаны они в объектно-ориентированном стиле или нет.”[68]

Еще один критик ООП, Александр Степанов, участвовавший в создании C++ вместе c Бьерном Страуструпом, придерживается того же мнения: “Я уверен, что парадигма ООП методологически неверна. Она начинает с построения классов. Это, как если бы математики начинали с аксиом. Но никто не начинает с аксиом, сначала вы должны развивать алгоритмы, и только в конце сформулировать четкие и непротиворечивые интерфейсы.” Томас Поток из Oak Ridge National Laboratory привел результаты крупного исследования, показавшего отсутствие разницы в производительности между разработчиками в объектно-ориентированном и процедурном стиле.

Сам Гэбриел сравнил ситуацию с ООП с провалом концепции эфиродинамики в физике. По его мнению, объектно-ориентированное программирование создавалось как некая “серебряная пуля” в борьбе со сложностью разработки, но ему не удалось оправдать возложенных на него надежд. Все идеи из выступления Ричарда Гэбриела были им систематизированы и объединены в брошюру, выложенную в свободный доступ в дополнении к презентации.[69] Результатом столь оживленной и актуальной дискуссии стал рост числа сторонников Гэбриела, попытавшихся развернуть критику ООП в многочисленных статьях и публикация. А вот «адептам» объектно-ориентированного подхода не удалось ни оказать достойное противодействие в рамках конференции, ни оформить результаты своего выступления для последующего ознакомления.

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

Заключение

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

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

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

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

Список использованных источников

  1. Павловская Т.А. C/C++.Структурное и объектно-ориентированное программирование. СПб.: Питер, 2011. - 352 с.
  2. Лафоре Р. Объектно-ориентированное программирование в С++. СПб.: Питер, 2004. - 928 с.
  3. Бадд Т. Объектно-ориентированное программирование в действии. СПб.: Питер, 1997. - 464 с.
  4. Страуструп Б. Дизайн и эволюция С++. СПб.: Питер, 2006. - 448 с.
  5. Мейер Б. Почувствуй класс. М.: БИНОМ. Лаборатория знаний, 2011. - 775 с.
  6. Вайсфельд М. Объектно-ориентированное мышление. СПб.: Питер, 2014. - 304 с.
  7. Медведев В. Особенности ООП на С++/CLI, C3 и Java. Казань: РИЦ «Школа», 2010. - 444 с.
  8. Кирютенко Ю.А. Объектно-ориентированное программирование. М.: Вузовская книга, 2006. – 328 с.
  9. Лавров С. Программирование. Математические основы, средства, теория. СПб.: БХВ-Петербург, 2002. – 320 с.
  10. Гради Б. Объектно-ориентированное проектирование с примерами применения. М.: Конкорд, 1992. – 519 с.
  11. Бобровский С. История объектно-ориентированного программирования // PC Week — 2003. — № 28
  12. Петросян Г. Анализ объектно-ориентированной парадигмы и поиск лучшей альтернативы // Научно-технические ведомости СПбГПУ – 2012 - №6
  13. Касторнов А., Касторнова В. ООП как перспективное направление развития школьного курса информатики // Вестник ЧГУ – 2017 - №5
  14. Гербеков К., Башкаева О. ООП в школьном курсе информатики // Вестник РУДН – 2017 - №2
  15. Кэй, Алан Кёртис // Википедия. [2007—2019]. Дата обновления: 08.04.2019. URL: https://ru.wikipedia.org/?oldid=99094139 (дата обращения: 12.01.2019)
  16. Smalltalk // Википедия. [2004—2019]. Дата обновления: 11.02.2019. URL: https://ru.wikipedia.org/?oldid=98037207 (дата обращения: 12.01.2019)
  17. C++ // Википедия. [2004—2019]. Дата обновления: 24.05.2019. URL: https://ru.wikipedia.org/?oldid=100005295 (дата обращения: 15.01.2019)
  18. Объектно-ориентированное программирование // Википедия. [2004—2019]. Дата обновления: 26.02.2019. URL: https://ru.wikipedia.org/?oldid=98346572 (дата обращения: 23.01.2019)
  19. Компонентно-ориентированное программирование // Википедия. [2006—2019]. Дата обновления: 03.05.2019. URL: https://ru.wikipedia.org/?oldid=99564163 (дата обращения: 23.01.2019)
  20. Прототипное программирование // Википедия. [2006—2019]. Дата обновления: 31.05.2019. URL: https://ru.wikipedia.org/?oldid=100142782 (дата обращения: 23.01.2019)
  21. Абстракция данных // Википедия. [2004—2019]. Дата обновления: 12.05.2019. URL: https://ru.wikipedia.org/?oldid=99739812 (дата обращения: 13.02.2019)
  22. Инкапсуляция (программирование) // Википедия. [2005—2019]. Дата обновления: 18.03.2019. URL: https://ru.wikipedia.org/?oldid=98709991 (дата обращения: 13.02.2019)
  23. Наследование (программирование) // Википедия. [2005—2018]. Дата обновления: 17.12.2018. URL: https://ru.wikipedia.org/?oldid=96905999 (дата обращения: 13.02.2019)
  24. Объект (программирование) // Википедия. [2006—2019]. Дата обновления: 22.05.2019. URL: https://ru.wikipedia.org/?oldid=99964343 (дата обращения: 22.02.2019)
  25. Класс (программирование) // Википедия. [2018—2018]. Дата обновления: 04.10.2018. URL: https://ru.wikipedia.org/?oldid=95418719 (дата обращения: 22.02.2019)
  26. Савчук И. Почему ООП провалилось // CIT Forum. 2010. URL: http://citforum.ru/gazeta/165 (дата обращения: 15.04.2019)
  27. Леонов Д. Объектная парадигма не провалилась // BugTraq.Ru. 2004. URL: https://bugtraq.ru/library/programming/objectshavenotfailed.html (дата обращения: 15.04.2019)
  28. Почему ООП провалилось? // IT Community/. 2012. URL: http://it.icmp.ru/post/view/7288 (дата обращения: 15.04.2019)
  29. Майборода А. Объектная парадигма провалилась // BugTraq.Ru. 2004. URL: https://bugtraq.ru/library/programming/objectshavefailed.html (дата обращения: 15.04.2019)

  1. Павловская Т.А. Структурное и объектно-ориентированное программирование. СПб.: Питер, 2011. С. 160

  2. Лафоре Р. Объектно-ориентированное программирование в С++. СПб.: Питер, 2004. С. 33

  3. Бадд Т. Объектно-ориентированное программирование в действии. СПб.: Питер, 1997. С. 23

  4. Кей, Алан Кёртис // Википедия. [2007—2019] (дата обращения: 12.01.2019)

  5. Smalltalk // Википедия. [2004—2019] (дата обращения: 12.01.2019)

  6. Бобровский С. История объектно-ориентированного программирования // PC Week — 2003. — № 28

  7. C++ // Википедия. [2004—2019] (дата обращения: 15.01.2019)

  8. Страуструп Б. Дизайн и эволюция С++. СПб.: Питер, 2006. С. 31

  9. Мейер Б. Почувствуй класс. М.: БИНОМ. Лаборатория знаний, 2011. С. 39

  10. Вайсфельд М. Объектно-ориентированное мышление. СПб.: Питер, 2014. С. 20

  11. Медведев В. Особенности ООП на С++/CLI, C3 и Java. Казань: РИЦ «Школа», 2010. С. 3

  12. Лафоре Р. Объектно-ориентированное программирование в С++. СПб.: Питер, 2004. С. 44

  13. Кирютенко Ю.А. Объектно-ориентированное программирование. М.: Вузовская книга, 2006. С. 12

  14. Вайсфельд М. Объектно-ориентированное мышление. СПб.: Питер, 2014. С. 37

  15. Касторнов А., Касторнова В. ООП как перспективное направление развития школьного курса информатики // Вестник ЧГУ – 2017 - №5 – С. 178

  16. Вайсфельд М. Объектно-ориентированное мышление. СПб.: Питер, 2014. С. 20

  17. Бадд Т. Объектно-ориентированное программирование в действии. СПб.: Питер, 1997. С. 21

  18. Мейер Б. Почувствуй класс. М.: БИНОМ. Лаборатория знаний, 2011. С. 70

  19. Павловская Т.А. Структурное и объектно-ориентированное программирование. СПб.: Питер, 2011. С. 160

  20. Кирютенко Ю.А. Объектно-ориентированное программирование. М.: Вузовская книга, 2006. С. 14

  21. Лавров С. Программирование. СПб.: БХВ-Петербург, 2002. С. 207

  22. Объектно-ориентированное программирование // Википедия. [2004—2019] (дата обращения: 23.01.2019)

  23. Компонентно-ориентированное программирование // Википедия. [2006—2019] (дата обращения: 23.01.2019)

  24. Прототипное программирование // Википедия. [2006—2019] (дата обращения: 23.01.2019)

  25. Гради Б. Объектно-ориентированное проектирование с примерами применения. М.: Конкорд, 1992. С. 44

  26. Абстракция данных // Википедия. [2004—2019] (дата обращения: 13.02.2019)

  27. Кирютенко Ю.А. Объектно-ориентированное программирование. М.: Вузовская книга, 2006. С. 18

  28. Инкапсуляция (программирование) // Википедия. [2005—2019] (дата обращения: 13.02.2019)

  29. Кирютенко Ю.А. Объектно-ориентированное программирование. М.: Вузовская книга, 2006. С. 18

  30. Вайсфельд М. Объектно-ориентированное мышление. СПб.: Питер, 2014. С. 36

  31. Павловская Т.А. Структурное и объектно-ориентированное программирование. СПб.: Питер, 2011. С. 163

  32. Биллиг В., Мусикаев И. Книга для программистов. М.: Русская редакция, 1996. С. 205

  33. Кирютенко Ю.А. Объектно-ориентированное программирование. М.: Вузовская книга, 2006. С. 15

  34. Павловская Т.А. Структурное и объектно-ориентированное программирование. СПб.: Питер, 2011. С. 194

  35. Бадд Т. Объектно-ориентированное программирование в действии. СПб.: Питер, 1997. С. 110

  36. Медведев В. Особенности ООП на С++/CLI, C3 и Java. Казань: РИЦ «Школа», 2010. С. 23

  37. Наследование (программирование) // Википедия. [2005—2019] (дата обращения: 13.02.2019)

  38. Бадд Т. Объектно-ориентированное программирование в действии. СПб.: Питер, 1997. С. 198

  39. Вайсфельд М. Объектно-ориентированное мышление. СПб.: Питер, 2014. С. 41

  40. Павловская Т.А. Структурное и объектно-ориентированное программирование. СПб.: Питер, 2011. С. 163

  41. Касторнов А., Касторнова В. ООП как перспективное направление развития школьного курса информатики // Вестник ЧГУ – 2017 - №5 – С. 180

  42. Кирютенко Ю.А. Объектно-ориентированное программирование. М.: Вузовская книга, 2006. С. 20

  43. Мейер Б. Почувствуй класс. М.: БИНОМ. Лаборатория знаний, 2011. С. 73

  44. Бадд Т. Объектно-ориентированное программирование в действии. СПб.: Питер, 1997. С. 14

  45. Медведев В. Особенности ООП на С++/CLI, C3 и Java. Казань: РИЦ «Школа», 2010. С. 32

  46. Кирютенко Ю.А. Объектно-ориентированное программирование. М.: Вузовская книга, 2006. С. 14

  47. Объект (программирование) // Википедия. [2006—2019] (дата обращения: 22.02.2019)

  48. Медведев В. Особенности ООП на С++/CLI, C3 и Java. Казань: РИЦ «Школа», 2010. С. 69

  49. Биллиг В., Мусикаев И. Книга для программистов. М.: Русская редакция, 1996. С. 206

  50. Медведев В. Особенности ООП на С++/CLI, C3 и Java. Казань: РИЦ «Школа», 2010. С. 58

  51. Бадд Т. Объектно-ориентированное программирование в действии. СПб.: Питер, 1997. С. 42

  52. Кирютенко Ю.А. Объектно-ориентированное программирование. М.: Вузовская книга, 2006. С. 15

  53. Вайсфельд М. Объектно-ориентированное мышление. СПб.: Питер, 2014. С. 33

  54. Класс (программирование) // Википедия. [2005—2019] (дата обращения: 22.02.2019)

  55. Биллиг В., Мусикаев И. Книга для программистов. М.: Русская редакция, 1996. С. 204

  56. Медведев В. Особенности ООП на С++/CLI, C3 и Java. Казань: РИЦ «Школа», 2010. С. 32

  57. Касторнов А., Касторнова В. ООП как перспективное направление развития школьного курса информатики // Вестник ЧГУ – 2017 - №5 – С. 178

  58. Медведев В. Особенности ООП на С++/CLI, C3 и Java. Казань: РИЦ «Школа», 2010. С. 10

  59. Лафоре Р. Объектно-ориентированное программирование в С++. СПб.: Питер, 2004. С. 26

  60. Лафоре Р. Объектно-ориентированное программирование в С++. СПб.: Питер, 2004. С. 26

  61. Кирютенко Ю.А. Объектно-ориентированное программирование. М.: Вузовская книга, 2006. С. 16

  62. Вайсфельд М. Объектно-ориентированное мышление. СПб.: Питер, 2014. С. 24

  63. Гербеков К., Башкаева О. ООП в школьном курсе информатики // Вестник РУДН – 2017 - №2 – С. 157

  64. Петросян Г. Анализ объектно-ориентированной парадигмы и поиск лучшей альтернативы // Научно-технические ведомости СПбГПУ – 2012 - №6 – С. 88

  65. Объектно-ориентированное программирование // Википедия. [2004—2019] (дата обращения: 23.01.2019)

  66. Савчук И. Почему ООП провалилось // CIT Forum. 2010 (дата обращения: 15.04.2019)

  67. Леонов Д. Объектная парадигма не провалилась // BugTraq.Ru. 2004. (дата обращения: 15.04.2019)

  68. Почему ООП провалилось? // IT Community/. 2012. (дата обращения: 15.04.2019)

  69. Майборода А. Объектная парадигма провалилась // BugTraq.Ru. 2004. (дата обращения: 15.04.2019)