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

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

Содержание:

ВВЕДЕНИЕ

Актуальность данной темы обусловлена широким использованием объектно-ориентированной парадигмы для решения информационных задач.

Объектом исследования является методология программирования.

Предметом исследования является объектно-ориентированное программирование.

Целью данной курсовой работы является исследование основных понятий и принципов объектно-ориентированного программирования.

Задачи исследования:

1. Изучить причины возникновения объектного подхода в программировании и историю возникновения объектно-ориентированной парадигмы;

2. Исследовать основные понятия ООП, такие, как объект, класс, абстракция, наследование, инкапсуляция и полиморфизм;

3. Рассмотреть способы реализации ООП на популярных языках программирования.

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

ГОСТ 19781-90, устанавливающий термины и определения основных понятий в области программного обеспечения систем обработки информации [1];

ГОСТ 28397-89 устанавливает термины и определения в области некоторых традиционных языков программирования процедурного типа, которые, также, применяются и в объектно-ориентированных языках [2];

Книга «Программирование на Java» Алексея Николаевича Васильева, профессора кафедры физики КНУ имени Тараса Шевченко, доктора физико-математических наук, описывает примеры реализации ООП на языке Java [3];

В книге Льюиса Дирка и Петера Мюллера: Java7, также описываются примеры реализации ООП на языке Java [4];

В учебном пособии Сартасова Евгения Михайловича, доцента кафедры «Информационные технологии в экономике» и кандидата технических наук, подробно рассмотрены вопросы разработки программ с использованием ООП, на примере языка C#. [5];

Книга Брюса Эккеля «Философия Java» в 4м издании, ставшая классическим пособием для изучения Java, весьма популярного объектно-ориентированного языка. В книге подробно описывается история возникновения объектно-ориентированной парадигмы и ее принципы [6];

В книге Алекса Эллайна, знаменитого разработчика и создателя учебного портала «cprogramming.com» описаны примеры реализации ООП на языке C++ [7];

В руководстве по изучению языка программирования C# Джозефа Албахари, разработчика утилиты LINQPad, описаны некоторые особенности языка C# и примеры реализации ООП [8];

Четвертое издание книги «The C++ programming language» Бёрна Страуструпа, разработчика языка С++, содержит исчерпывающую информацию мультипарадигмального языка программирования С++ [9].

Официальный сайт Microsoft Corporation (электронный ресурс) содержит интерактивный учебник по объектно-ориентированному языку C# платформы .NET Framework. [10].

ОСНОВНЫЕ ПОНЯТИЯ ОБЪЕКТНО-ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ

1.1. История возникновения объектно-ориентированной парадигмы

Развитие информационных технологий всегда подразумевает повышение сложности задач, стоящих перед разработчиками. Чем сложнее система, тем выше должен быть уровень абстракции от аппаратной части платформы, в противном случае могут возникнуть непреодолимые трудности в создании подобных программ, отладке и дальнейшей их поддержке [6, с.41].

Первые системы не нуждались в высоком уровне абстракции, и даже в наши дни разработчики встраиваемых систем по-прежнему используют низкоуровневые языки программирования в связи с тем, что они вынуждены работать напрямую с аппаратной частью разрабатываемых устройств, имеющих значительные платформенные ограничения. До возникновения ООП, использовались различные подходы к написанию программ. Одним из таких подходов было процедурное программирование, осуществляемое посредством процедур, именованных программных блоков, конкретное выполнение которых определялось вызовом процедуры [2, c.3]. Для этих целей были разработаны процедурные языки программирования, в которых действия над данными выражаются в терминах последовательностей команд [1, c.4].

Впоследствии, процедурное программирование претерпело значительные изменения, а позже, вовсе эволюционировало самостоятельную методологию. В ООП легла идея объектов, взаимодействующих друг с другом. Каждый объект имеет свое состояние, поведение и индивидуальность, а программа может быть представлена отдельно от архитектуры информационной системы в виде определения объектов, и сообщений между ними [6, с.69]. Продукт «Smalltalk», разработанный Аланом Кейем и его коллегами в научно-исследовательском центре Xerox PARC стал первым удачным объектно-ориентированным языком программирования [6, с.42]. Объектно-ориентированный язык – это язык, соответствующий концепциям ООП [1, с.4]. На сегодняшний день, ООП реализована в большинстве промышленных языков программирования.

1.2. Объект

Базовым понятием объектно-ориентированного программирования является объект – набор данных и функций, принадлежащих друг к другу, объединенный в одну сущность в пространстве информационной системы. Свойства объекта описывается его переменными, а поведение – определяется его функциями [4, с.38]. Переменной называется языковой объект, способный принимать различные значения [2, c.2]

Объект – это реальная конструкция, экземпляр класса, на основе которого он создается [3, c.82]. Объект имеет три этапа жизненного цикла (рисунок 1).

Рисунок 1 – Жизненный цикл объекта

Первый этап – создание объекта – его объявление при помощи языковой конструкции [2, c.2] и объектной переменной для последующего осуществления доступа к нему, при этом, сама объектная переменная объектом не является [3, c.83-84].

Второй этап – использование объекта, в процессе которого выполняется обращение к данным объекта. Если объект имеет в своем составе функцию, то, после ее вызова, она может возвращать результат [3, c.85-87].

Третьим этапом жизненного цикла является уничтожение объекта. Так как объект и его переменные занимают адресное пространство в информационной системе, то после его использования, если он больше не нужен, целесообразно его уничтожить во избежание переполнения памяти. Уничтожение объектов реализуется при помощи команд-деструкторов, вызываемый вручную или автоматически, если работа с памятью ведется напрямую [7, c.334], либо при помощи сборщика мусора, если таковой реализован в используемой технологии (как например в Java) [2, c.102].

1.3. Класс

Класс – абстрактный тип данных, позволяющий одновременное объявление свойств (полей) и методов (функций), на основе которого строятся объекты (экземпляры класса) [4, с.38] (Рисунок 2). Свойства класса – это данные, реализуемые в виде двух методов, предназначенных для получения и записи данных [5, c.31]. Методом называется процедура или функция, реализуемая в виде программного блока, способная вырабатывать значение, связанное со своим именем. Выполнение метода определяется вызовом [2, c.3].

Рисунок 2 – Класс

Создание класса начинается с его объявления, после, объявляются переменные класса – его свойства. Так же, в классе могут быть добавлены функции, определяющие поведение класса [4, с.39-40].

Классы, которые не имеют экземпляров, называется абстрактным. Также, объект имеет свойства инкапсуляции, наследования и полиморфизма [8, с.1].

1.4. Инкапсуляция

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

Как правило, инкапсуляция реализуется при помощи модификаторов доступа, определяющих различные уровни доступа для элементов состояния объекта. Модификаторы доступа, чаще всего, бывают публичные (доступные вне класса), приватные (доступные только внутри класса) и защищенные (доступные внутри класса и из классов-наследников) [5, c.28] [7, c.331-333] [3, c.107] (рисунок 3).

Рисунок 3 – Модификаторы доступа

1.5. Наследование

Класс может происходить от другого класса, включая все его основные свойства и элементы. Такой принцип построения классов называется наследованием. Существующий класс, на основе которого создается другой класс, называется базовым классом или суперклассом, а класс, происходящий от него, называется производным классом или дочерним классом [5, с.38] [7 c.361]. Данный подход позволяет существенно сократить время разработки программного обеспечения и повышает совместимость программных продуктов [5, с.192].

Классическим примером наследования классов служит пример с геометрическими фигурами (рисунок 4).

Рисунок 4 – Наследование

Если класс «фигура» представляется как базовый класс, то наследуемые фигуры представляют собой уже конкретные разновидности фигур: треугольник, окружность, куб и т.д. Свойства базового класса – расположение, цвет, размер и размерность, наследуются дочерними классами, но к этим свойствам, также, могут быть добавлены индивидуальные свойства, например, переменные для определения значений углов треугольника. Аналогично свойствам, к производным классам также возможно добавление индивидуальных функций. К примеру, вращение треугольника может происходить только в двумерной системе координат, в отличие от куба, вращение которого реализуется в трехмерном пространстве [9, c.68] [6, c.49].

1.6. Полиморфизм

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

Рисунок 5 – Полиморфизм

Принцип полиморфизма позволяет единообразно вызывать один и тот же метод различных по типу классов, скрытых путем инкапсуляции, когда интерфейс[1] класса абстрагирован от способа исполнения функции [6, с.238]. В объектно-ориентированных языках программирования полиморфизм реализуется посредством переопределения унаследованных функций дочерних классов [4, c.89].

ОСНОВНЫЕ ПОНЯТИЯ ОБЪЕКТНО-ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ

Реализация ООП в языке Java

Java – кроссплатформенный мультипарадигмальный, объектно-ориентированный язык программирования, имеющий C-подобный синтаксис. Программы, написанные на данном языке, компилируются в байт-код, который, впоследствии, исполняется виртуальной машиной Java (JVM). В технологии, также реализован сборщик мусора (garbage collector), автоматически управляющий памятью. [4, c.1-3]. Java широко применяется для разработки серверных enterprise приложений.

Для объявления класса используется ключевое слово «class» с указанием имени, например – «example», для обращения к классу. Далее, описываются поля и методы класса при помощи конструкторов [3, c.82-83]. Поля класса объявляются при помощи указания типа данных и имени переменной (см. приложение 1). При объявлении переменных, как правило, происходит их инициализация с присвоением начального значения. Для объявления метода указывается его тип, имя и параметры, далее, в теле метода описываются инструкции (операторы), выполняемые при вызове метода (рисунок 6) [4, c.41].

Рисунок 6 – Объявление класса, его полей и методов

Для создания объектов (экземпляров класса) используется оператор «new», далее происходит вызов конструктора класса – метода для инициализации переменных, в который передаются параметры (подробное описание операторов см. приложение 2 [10]) (рисунок 7) [4, c.46].

Рисунок 7 – Создание экземпляров класса

В языке Java инкапсуляция реализуется при помощи четырех модификаторов доступа:

  1. Public – Публичный доступ. Данные, имеющие такой модификатор, доступны везде;
  2. Default – Доступ к данным по умолчанию. Данные, имеющие такой модификатор, доступны в пределах пакета;
  3. Protected – Защищенный доступ. Данные, имеющие такой модификатор, доступны из дочерних классов и в пределах пакета.
  4. Private – Приватный доступ. Данные, имеющие такой модификатор, доступны только внутри самого класса [3, c.106-110].

Наследование в языке Java осуществляется при помощи следующих аспектов [4, c.87-88]:

  1. Объявления переменных в базовом классе;
  2. Объявления и инициализации полей производного класса;
  3. Возможности переопределения методов, унаследованных от базового класса;
  4. Вызова исходных методов базового класса.

Чтобы подключить базовый класс, следует использовать ключевое слово «extends». Концепция полиморфизма в Java позволяет переопределять или перегружать наследуемые методы путем переписывания измененных операторов метода с сохранением исходной сигнатуры, идентичной базовому классу. Компилятор копирует в дочерних классах наследуемые поля, а также перестраивает вызовы наследуемых методов. При этом сохраняется возможность получения доступа к исходным методам базового класса при помощи ключевого слова «super» даже после их переопределения (рисунок 8) [4, c.86-90].

Рисунок 8 – Пример наследования в языке Java

Реализация ООП в языке C++

С++ – промышленный, мультипарадигмальный, компилируемый язык программирования с поддержкой объектно-ориентированной парадигмы, основанный на языке C [7, с.21]. Исходный код программы, написанный на данном языке, компилируются в исполняемый файл [7, c.22]. С++ используется повсеместно: в разработках операционных систем и их приложений, игр, сетевых приложений, драйверов периферийных устройств, встраиваемых систем и программного обеспечения микроконтроллеров [9, c.30].

Рисунок 9 – Пример инкапсуляции и работы с классами и в языке C++

Для объявления класса используется ключевое слово «class», после которого следует имя класса. Для объявления членов класса, также необходимо перед их именами указывать модификаторы доступа: public, private или protected, таким образом, в языке C++ осуществляется инкапсуляция. Член класса с модификатором «public» доступен везде, где этот объект используется. Модификатор «private» открывает доступ только внутри класса, а protected открывает доступ для производных классов. Для настройки закрытых переменных используются функции для инициализации (как правило, называемые get и set) [7, c.332]. Для объявления экземпляра класса указывается имя базового класса и имя объекта после него. Вызов функций класса осуществляется при помощи конструкции, состоящей из имени экземпляра класса и имени функции класса, записанные через точку [9, c.452] (рисунок 9).

Наследование в языке программирования C++ осуществляется при помощи следующей конструкции: объявляется имя новой дочерней переменной после ключевого слова «class», далее, после двоеточия, указывается модификатор доступа и имя базового класса (рисунок 10) [9, c.599].

Рисунок 10 – Пример наследования в языке C++

Для инициализации переменных класса, часто используют функции с открытым доступом, называемые конструкторами. Конструктор имеет то же имя, что и класс. Для уничтожения объектов используется обратная конструкторам процедура – деструктор, объявление которого происходит после знака «~» [9, c.63]. При объявлении конструктора происходит выделение памяти для переменных класса, а при объявлении деструктора, память, выделенная для переменной, освобождается.

Реализация ООП в языке C#

С# (C Sharp) – мультипарадигмальный, объектно-ориентированный язык программирования, продукт корпорацией Microsoft, предназначенный для разработки программного обеспечения, работающего на платформах .NET Framework (использующий среду Common Language Runtime), Mac OS, iOS и Android [8, c.3] [10].

Рисунок 10 – пример использования классов, инкапсуляции и наследования в языке C#

C# имеет C-подобный синтаксис [10]. Для объявления класса используется ключевое слово «class», после которого указывается имя класса, а в теле класса объявляются его поля и методы, имеющие свои модификаторы доступа [8, c.73] [10]. Элементы класса в языке C# могут иметь четыре разновидности модификаторов доступа: public, private, protected и internal. Элементы класса с модификатором public доступны вне класса, в отличие от private, когда элементы доступны только внутри методов класса. Модификатор protected открывает доступ к полям и методам внутри базового и его производных классов, а internal – в пределах всего файла. Доступ к инкапсулируемым значениям переменных осуществляется при помощи аксессеров[2] «set» и «get» [5, c.29].

Для объявления дочернего класса следует объявить класс, а затем, указать имя базового класса после двоеточия [8, c.88]. Также для удобства инициализации переменных, следует добавить конструктор с модификатором доступа. Имя конструктора должно совпадать с именем класса при объявлении, а переменные указываются в круглых скобках. [10] [8, c.96] (см. рисунок 11).

ЗАКЛЮЧЕНИЕ

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

Существует множество ситуаций, когда применение ООП нецелесообразно. С одной стороны, объектно-ориентированное программирование увеличивает абстракцию и позволяет повторно использовать уже написанный код в виде библиотек классов. В то же время, использование таких библиотек подразумевает излишние затраты времени на их изучение и документирование. Например, язык Java достаточно прост в освоении, особенно для разработчиков, знакомых с синтаксисом языка C. Библиотека Java Core, по своему объему, едва превышает стандартную библиотеку какого-либо иного промышленного языка программирования. Но для построения сетевых приложений, отвечающих современным стандартам Enterprise-систем, разработчик должен знать и уметь применять на практике множество дополнительных библиотек и фреймворков[3]. Данный факт является причиной весьма высокого порога вхождения для языка Java относительно других языков.

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

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

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ

  1. ГОСТ 19781-90 Обеспечение систем обработки информации программное. Термины и определения. Дата введения 01.01.1992. // Опубликован: М.: Стандартинформ, 2010 год. Официальное издание.
  2. ГОСТ 28397-89. Языки программирования. Термины и определения. Дата введения 01.01.1991. // Опубликован: М.: Стандартинформ, 2005 год. Официальное издание.
  3. Васильев, Алексей Николаевич. Программирование на Java для начинающих / Алексей Васильев. – Москва: Издательство «Э», 2017. – 704 с.
  4. Льюис, Д. Самоучитель Java 7: Пер. с. нем. / Д. Льюис, П. Мюллер. – СПБ.: БХВ-Петербург, 2016. – 464 с.
  5. Сартасов, Е. М. Объектно-ориентированное программирование: учебное пособие / Е.М. Сартасов. – Челябинск: Издательский центр ЮУрГУ, 2014. – 54с.
  6. Эккель Брюс. Философия Java. 4-е полное изд. – СПб.: Питер, 2015 – 1168 с.: ил. – (Серия «Классика computer science»)
  7. Эллайн А. C++ От ламера до программера. – СПб.: Питер, 2015. – 480 с.
  8. Albahari J., Albahari B., C# 6.0 in a Nutshell. Published by O’Reilly Media, Inc., 1005 Gravenstein Highway North, Sebastopol, CA 95472. 2016. 1115p.
  9. Stroustrup, Bjarne. The C++ programming language / Bjarne Stroustrup. — Fourth edition. 1360 pages. United States on recycled paper at Edwards Brothers Malloy in Ann Arbor, Michigan. QA76.73.C153 S77. 2013.

10. Официальный сайт «Microsoft Corporation» // Visual C# (Инструкции по С#). [Электронный ресурс]. URL: https://docs.microsoft.com/ru-ru/previous-versions/visualstudio/visual-studio-2008/zkxk2fwf(v%3dvs.90) (Дата обращения: 21.11.2018г.)

Приложение 1

Таблица базовых типов данных в языках программирования с

C-подобным синтаксисом.

Источник: «Сартасов, Е. М. Объектно-ориентированное программирование: учебное пособие / Е.М. Сартасов. – Челябинск: Издательский центр ЮУрГУ, 2014. – 54с.»

Приложение 2

Базовые операторы в языках программирования с

C-подобным синтаксисом.

Таблица составлена на основе данных электронного ресурса: Официальный сайт «Microsoft Corporation» // Visual C# (Инструкции по С#). [Электронный ресурс]. URL: https://docs.microsoft.com/ru-ru/previous-versions/visualstudio/visual-studio-2008/zkxk2fwf(v%3dvs.90) (Дата обращения: 21.11.2018г.)

  1. Примечание: в данном случае, термин «интерфейс» используется в контексте механизма взаимодействия классов, а не как абстрактный класс.

  2. Аксессор – неявный метод для получения инкапсулируемых данных, от англ. «access» – доступ.

  3. (англ.) Framework – база для построения архитектуры приложения

  4. UML – Unified Modeling Language – язык моделирования, состоящий из диаграмм для наглядной демонстрации структуры иерархии классов.