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

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

Содержание:

ВВЕДЕНИЕ

Методология объектно-ориентированного программирования давно и широко вошла в общераспространенную практику разработки программных продуктов.

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

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

При написании курсовой работы я исследовала и опиралась на труды современных ученых Аузяк А.Г., Богомолов Ю.А., Маликов А.И., Старостин Б.А., Биллиг В.А., Кудрина Е.В., Огнева В.М., Портенко М.С., Кожемяченко В.И. Красноперов С.Ю , Кадырова Г. Р., Казакова А.Е., Макаров В.Л., Г.Буч, Д.Шарп . Наиболее доходчивым изложением материала для меня оказалась книги Биллига В.А и Джона Шарпа (в переводе).

Практическая ценность курсовой работы может быть в возможности получения из нее теоретических знаний ООП в сжатом виде, но простом изложении, а также пример практического применения в недавно открытой для бесплатного использования и интересной для многих среде Unreal Engine.

Глава 1. История и развитие

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

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

Объектно-ориентированное программирование разработано в середине 1970-х годах Б.Керниганом и Д.Риччи, в дальнейшем оно развивалось, став одной из ведущих технологий программирования. Цель ООП - повышение эффективности разработки.

Большинство идей, служащих основанием для языков программирования современности, появились в 1970-х годах. В то время программирование не было особо популярной профессией, им занимался довольно узкий круг людей, горячо увлеченных своим занятием. Первые машины, на которых работали программисты, такие как, например, PDP-1, PDP-6,Altair, Sol, Apple, PET, TRS-80, управлялись на уровне двоичных кодов и самыми низкоуровневыми языками программирования, а значит, требовали высококвалифицированных специалистов. Первые машины отличались несовершенной системой ввода-вывода и небольшим объемом оперативной памяти. Разнотипные данные языка не разделялись на соответствующие типы, и программа состояла и из данных и подпрограмм. Постепенно подпрограммы стали играть роль структур абстрагирования, а коллективная работа над большими проектами привела к возникновению модульности. Однако возникала проблема, когда на данные одного модуля влияла процедура другого.

Потомком Algol-60 стал строго типизированный язык Pascal как представитель структурного (процедурного) программирования. К 1980 –м годам Pascal стал основой многих учебных программ. Затем фирмой «Borland» был разработан Turbo Pascal, который вырос в объектный Pascal для DOS и Windows и потом в  Delphi.

Потомком языка Pascal стал язык Ada,, имеющий поддержку модульности и абстрактных типов данных. Также на основе языка Algol-60 был построен язык Simula-67. [9]

В первых языках программирования отсутствовало понятие класса, построение приложения рассматривалось с точки зрения типа данных. Однако, набор разрешенных операций неявно с типом всегда связывался и в типизированных языках естественно связывалось понятие переменной с типом данных. Например, переменная х, типа Т, принимает значения множества Т.[2]

Впервые классы и объекты появились в программировании в языке Simula-67. В нем определение классов содержало четкое определение методов, операций, применимых к данным. [2] Таким образом, первым объектно-ориентированным языком стал Simula-67(1967год) и его концепции стали основой последующих объектно-ориентированных языков. В Simula-67 объект имеет параметры. Но возникали трудности, например, при выполнении одинаковых операций, но с разными типами данных, увеличивалось количество функций, относящихся по-сути, к одному и тому же действию. Кроме того, трудностью было отсутствие средств отладки и необходимость перезапуска программы, что при увеличении сложности программы и объема кода неудобно в плане времени поиска ошибки. Также увеличивалось количество дублируемых данных при увеличении родительских классов при одиночном наследовании. В Smalltalk-80, Eiffel и С++, эти проблемы были решены.В Eiffel нет возможности сочетать в одной программе несколько стилей, он менее вариабелен, но в нем были исправлены некоторые недостатки С++. В Smalltalk-72,-74,-76,-80 концепции ООП были развиты Аланом Кэйем и Дэном Ингаллсом. Взаимодействие межу объектами (переменными) происходит путем обмена сообщениями. Классы связаны отношением наследования, имеют иерархию и находятся в дереве классов. Среда разработки программы имеет средства отладки и пользовательский интерфейс. Этот язык стал широко распространенным объектно-ориентированным языком.

Язык Self ввел в ООП понятие прототипа.

Наследником языков Algol-60 (1960год) и Pascal (1970 год) стал язык Oberon. Разработанный создателем Pascal и Modula, Никлаусом Виртом и его коллегами, собрал в себе исследования по методологии и языкам программирования и сочетал в себе возможности структурного и модульного программирования с объектно-ориентированными средствами. В 1992 году Н.Вирт с Х.Мёссенбёком добавили в него новые средства для разработки, создав Oberon-2.[6]

Язык С, не имеющий вложенных процедур и отличающийся минимализмом, легко компилируемый с помощью однопроходного компилятора, стал очень популярным языком программирования. Иногда его называют «ассемблером высокого уровня» и он доступен на самых разных платформах.

На основе языка С был создан С++ в 1980-1983 году Бьерном Страуструпом. В отличие от С он дает возможность объектно-ориентированного программирования, он является гибридным языком, дающим возможность программировать и стиле С, и в объектном, и в обоих стилях одновременно. [7, 6,8] В плане отладки в С++ к языку была добавлена возможность обработки исключительных ситуаций. Этот механизм описывает реакцию программы на ошибки во время её выполнения. Есть возможность описания шаблонов без привязки к конкретным параметрам для кодирования общих алгоритмов, используемых под разные данные (что было проблемой в Simula-67). Появилась возможность множественного наследования, что, впрочем, может вызывать противоречия.

В начале 90-х годов на основе С++ фирмой  «Sun Microsystems» был разработан объектно-ориентированный язык программирования Java. В нем была упрощена разработка приложений путем удаления из него низкоуровневых возможностей. [6] Это объектно-ориентированный язык. Приложения , разработанные на Java могут работать на любой виртуальной машине независимо от архитектуры компьютера.

В 1998-2001 годах под руководством Андерса Хейлсберга группой инженеров фирмы Microsoft был разработан объектно-ориентированный язык С# для платформы .NET Framework и впоследствии был стандартизирован как ECMA-334 и ISO/IEC 23270. Он обладает таким же понятным синтаксисом , как С и С++ и Java, но некоторые вещи в нем упрощены и удалены проблематичные при разработке модели. [6] В частности, в отличие от С++ не поддерживает множественное наследование классов. Он разрабатывался как язык программирования прикладного уровня для CLR и зависит от его развития.

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

Глава 2. Суть методологии объектно-ориентированного программирования

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

Процедурное программирование используется, когда нужно быстродействие и ресурсы, используемые программой, но это потребует времени на разработку. Объектное – когда проект должен быть управляем с возможностью модификации и скорость разработки имеет значение. Для этого используется правильное применение основных инструментов ООП – абстрагирования, инкапсуляции, полиморфизма и наследования. Итак, что представляет собой объектно-ориентированное программирование?

Объекты, классы, методы

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

Индивидуальность объекта- свойство, позволяющее отличить его от других объектов с такими же атрибутами. Например: у двух котов есть шерсть, но она разного цвета. [3]

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

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

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

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

Имя программного элемента ( переменной, константы, класса, объекта, метода и т.д.) называется идентификатором. Сами элементы класса могут быть не только данными, но и, например, функциями. Классы могут выступать в двух ролях, и как типы данных и как основные модули построения архитектуры программы. Таким образом, класс не только несет на себе смысловую нагрузку архитектурной единицы, но и задает определенный тип данных. Полями класса называют определённого типа данные, для описания атрибутов. [3] Синтаксически поля класса являются переменными (объектами) языка, а методы – процедурами (функциями). Объекты одного класса будут иметь и одинаковые методы [2]

Например:

string firstFriend = "Leila";

string secondFriend = "Angela";

string trirdFriend = "Andrew";

Console.WriteLine($"My Friends are {firstFriend} and {secondFriend} and {trirdFriend}.");

Здесь (My Friends)- класс, , (firstFriend), (secondFriend), (trirdFriend) – переменные этого класса объектов, (Leila), (Angela), (Andrew)- значения этих переменных.

Переменная является символом, значения которого могут быть разными при выполнении одного и того же кода.

При объявлении переменной её можно инициализировать и необходимо присвоить ей начальное значение, в нижеприведенном примере переменной х присваивается начальное значение равное нулю.

static void Main()

{

int х=0; //объявление и инициализация переменной х

Console.WriteLine(х); //просмотр значения переменной

х=100; //изменение значение переменной

Console.WriteLine(х);

}

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

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

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

В предыдущем примере есть метод  типа Console (Console.WriteLine) для вывода сообщений или, например, класс Math имеет методы для вычислений математических функций.

Например:

class Program

{

static double Func( double x) //дополнительный метод

{

return 1 / x; //Возвращаемое значение

}

static void Main() //точка входа в программу

{

Console.Write("a=");

double a=double.Parse(Console.ReadLine());

Console.Write("b=");

double b=double.Parse(Console.ReadLine());

for (double x = a; x <= b; x += 0.5)

{

double y = Func(x); //вызов метода Func

Console.WriteLine("y({0:f1})={1:f2}", x, y);

}

}

В этом примере метод Func содержит параметр х, чтобы он возвращал в метод Main значение выражения (типа double), пере именем метода указывается double, а в теле метода return завершает выполнение и передает управление в точку вызова метода. [3]

Методы объекта можно классифицировать по функциям управления, реализации, доступа и вспомогательным функциям или как:

  • селектор (доступ к переменным без их изменения),
  • конструктор (создание , инициализация),
  • деструктор (разрушение),
  • модификатор (изменение состояния),
  • итератор (доступ к содержанию в определенной последовательности).

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

События

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

Например:

private void button1_Click(object sender, EventArgs e)

{

// реакция на событие нажатия кнопки 1

};

(Кожемяченко2часть)

Или, например:

/ "Изменить"/ private void Change_ED(bool Value)

{

Change_B.Enabled = Value;

Change_TSB.Enabled = Value; Change_TSMI.Enabled = Value;

}

/ "Удалить"/1private void Del_ED(bool Value)

{

...;

}

/ "Сохранить"/ private void Save_ED(bool Value)

{

...;

}

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

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

Сегодня определение класса в объектных языках является аналогом определения типа в СТS, а именно,

  • данные, задающие свойства объектов класса;
  • методы, определяющие свойства объектов класса;
  • события, которые могут происходить с объектами класса [2]

Значит, создание программы предполагает осуществление следующих действий:

  • поместить необходимые компоненты на форме (которя сама тоже является компонентом)
  • задать им начальные значения свойств
  • описать их реакции на события [4]

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

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

Типы данных

Могут быть простыми (скалярными), если их значения неделимы, или сложными, если одно значение данных состоит из множества значений. Типы данных могут быть встроенные и определенные пользователем. Также типы данных могут быть статическими и динамическими . У статических размер отводимой под них памяти известен во время объявления, у динамических - нет, это происходит во время выполнения программы. Типы данных могут быть значимые и ссылочные. У значимых типов значением служит значение переменной по прямому адресу (отводимые под переменную ячейки памяти), а у ссылочных типов все очень интересно – значением является ссылка на объект, находящийся обычно в динамической памяти, называемой «кучей». Интересный момент в том, что такие переменные могут «пользоваться» значениями данных одного объекта. Например, ссылочные переменные x, y, z, соответственно обозначающие «время тренировки», «вес бегуна», «количество выпитой воды», могут обращаться к объекту «бегун№2» класса «спортсмены». [2]

Есть ли принципиальное различие между классом и типом? Можно считать их синонимичным понятиями, если рассматривать класс как хорошо определенный тип данных, а объект как хорошо определенную переменную. Например: integer (относится к числовому типу данных) и string (относится к строковому типу данных) до сих пор называют типами, а относящиеся к ним экземпляры переменными. [2]

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

Инкапсуляция – это свойство системы, позволяющее объединить данные и методы, работающие с ними, в классе и скрыть детали реализации от пользователя. То есть код, управляющий этими данными недоступен для внешнего воздействия и, будучи объединены вместе, код и данные образуют объект.[6]

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

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

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

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

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

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

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

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

Наследование может быть одиночным и множественным. При одиночном наследовании класс имеет только один предок (суперкласс), при множественном наследовании класс может иметь любое количество предков (в некоторых языках запрещено). В C# от двух и более классов дочерний класс создать нельзя, кроме исключений.[10]

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

Например, экземпляры класса «животное» имеют одинаковые методы : бегать, прыгать , питаться , но экземпляры этого класса могут иметь разные свойства: «пушистый», «гладкошерстный», «дикий», «домашний» и т.д. Чтобы добавить характерное поведение для данного объекта, можно создать наследующий класс, «обогащенный» характерными признаками. Например, наследником класса «животное» может быть класс «животное_травоядное» (приложение, рисунок 9).

Это значит что классы-потомки являются разновидностью родительского класса, и в свою очередь, класс-предок – их обобщением. Также это значит, что к объектам классов-потомков можно обращаться с помощью одного и того же имени, но действия могут выполняться другие, так проявляется полиморфизм. [3]

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

Полиморфизм

Полиморфизм – это свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта. Одно и то же имя может соответствовать различным действиям в зависимости от типа объекта. То есть один и тот же программный текст будет исполнен по-разному, в зависимости от того, с каким объектом связана его сущность. Например, для текстовых строк «+» будет выполнять соединение, а для числовых сложение. [6]

В основе полиморфизма семейства классов лежат три механизма:

-одностороннее присваивание внутри семейства классов

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

-динамическое связывание.

Интересно, что не только потомки могут вызывать методы родительского класса, но и, наоборот, благодаря полиморфизму, методы родительского класса могут вызывать методы потомков способом контрактов. В этом случае метод родителя объявляется виртуальным и, в контракте, не изменяя сигнатуру виртуального метода, потомку можно переопределить реализацию. [2]

В C# использование нескольких методов с одним и тем же именем для реализации одного алгоритма для разных типов данных называется перегрузкой методов. Перегрузка методов используется для того, чтобы компилятор выбрал лучший вариант или выполнил неявные преобразования типов. Это полезно тем, что программисту удобнее помнить имя одного метода, а не нескольких, и не принимать решения о том, какой из них более подходящий, что может сделать за него компилятор. Перегрузка методов как раз и является проявлением полиморфизма. [3]

Например:

class Program

{

static int max(int х) //вариант 1 метода max

{

int y = 0;

while (х > 0)

{

if (х % 10 > y) y = х % 10;

х /= 10;

}

return y;

}

static int max(int х, int y) //вариант 2 метода max

{

if (х > y) return х;

else return y;

}

static int max(int х, int y, int z) //вариант 3 метода max

{

if (х > y && х > z) return х;

else if (y > z) return b;

else return z;

}

static void Main()

{

int х = 1283, y = 45, c = 35740;

Console.WriteLine(max(х));

Console.WriteLine(max(х, y));

Console.WriteLine(max(х, y, z));

}

}

Таким образом, полиморфизм является интересным свойством, способствующим многообразию объектов.

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

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

Возможности ООП, по сравнению с традиционными методами, в значительной степени повышают производительность разработчиков, так как объектно-ориентированные программы не только легче понимать, но и модифицировать, и вносить коррективы. [8]

ООП реализовано в объектно-ориентированных версиях языков С и Pascal ,(Borland Pascal, Object Pascal). Примеры объектно-ориентированных языков: Python; Delphi; Perl 6; C#; Scala; PHP; Objective C; Ruby; C++; Java; [2,3] «Чисто объектными» считаются C#, Smalltalk, Java, Ruby , в них почти любые данные являются объектами, а код- объектом какого-либо класса. «Гибридными» часто называют С++, и Delphi , в них можно программировать и используя, и не используя объектные средства.

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

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

Объектно-ориентированный язык Delphi удобен при разработке приложений, взаимодействующих с базами данных и поддерживающих работы в корпоративных сетях и интернет. [6]

Объектно-ориентированный язык Java является платформенно- независимым и используется для создания интерактивных веб-страниц. [6]

Большой популярностью среди разработчиков пользуется объектно- ориентированный язык С#, он используется для создания Windows Web-приложений.

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

Например:

class Program //класс

{

static void Main () //метод класса

{

Console.WriteLine("Hello!!!");

}

}

Здесь есть класс Program с методом Main, что дает возможность обращаться к этому методу класса без создания его экземпляра. [3]

Подобным образом принципы объектно-ориентированного программирования применяются для расширения функционала уже созданных программных продуктов.

К примеру, Windows является объектно-ориентированной системой и в ней определены классы для производства объектов, в частности, интерфейсные и, когда программа, написанная под операционную систему Windows, обращается к ней, у нас возникают интерфейсные объекты, кажущиеся принадлежащими программе, но на самом деле являющиеся частью Windows. Так объектно-ориентированная программа встраивается в объектно-ориентированную систему, расширяя возможности ее использования. [3]

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

Глава 4. Практическое применение методологии объектно-ориентированного программирования в учебном проекте на Unreal Engine

В движке Unreal Engine можно писать игровую логику как на С++, так и с помощью Bluprints – визуальной системы программирования. Bluprints являются визуальным скриптовым языком, их можно писать на С++, а также на С#.

Поскольку в цель курсовой работы входит не только рассмотрение методологии объектно-ориентированного программирования, но и применение её на практике, в техническом задании, в учебном проекте «Планеты», в ходе выполнения проекта, на движке Unreal Engine4 были созданы несколько «миров» (Worlds). Каждый из «миров» является программным элементом и объектом и в то же время служит «местом размещения» других элементов. Слева внизу рисунка 1 можно видеть папку Worlds, а в нижней части рисунка количество этих элементов на данный момент.

Рисунок 1. Worlds

SharedScreenshotmoon.jpg

Свойства каждого «мира» могут быть редактируемы, следовательно, эти объекты могут иметь индивидуальность.

На рисунке 2 показано, что был образован родительский класс Planet. От родительского класса Planet были созданы дочерние элементы: Earth, Moon, Mars, а также другие элементы, имитирующие планеты Солнечной системы.

Рисунок 2. Класс Planet дочерние элементы

SharedScreenshot3.jpg

Ландшафт Earth, Mars , Moon сделан визуально примерно соответствующим каждому из этих элементов, с помощью изменения свойств элемента в правой части интерфейса движка Unreal Engine. Например, видно, что у некоторых «планет» существенно изменен «материал», таким образом, дочерние элементы от класса Planet были дополнены новыми свойствами, иначе их ландшафты выглядели бы одинаковыми.

Можно заметить, что в левой части интерфейса движка имеется возможность добавления в «мир» новых объектов, каждый из которых тоже может обладать собственными свойствами и поведением. Так, например, была «добавлена» вода в виде плоскости, обладающей собственными свойствами материала. Материалы (свойства объектов) водной и земной поверхности разные. Также, например, на рисунке 3, в небе «мира» Земли можно увидеть ещё два планетных объекта – Луну и Марс, в небе Марса - Луну и Землю, в небе Луны - Землю и Марс.

Рисунок 3. Объекты с событием

SharedScreenshotmars.jpg

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

При нажатии левой кнопки мыши на каждый такой объект происходит переход в «мир» и соответствующий ландшафт «планеты», которую он имитирует. Это происходит с помощью функции trace, вызывающей соответствующие функции, приводящие к действию (Action), это видно на рисунке 4. Длина trace проставлена в 500000, иначе его не хватало бы, чтобы «достать» до планеты.

Рисунок 4. Trase

SharedScreenshot.jpg

То есть, нажатием кнопки мы вызываем событие. При нажатии на виднеющийся в небе Марс пользователь переходит в «мир» Марса, при нажатии на виднеющуюся в небе «мира» Луны Землю, можно осуществить «переход» на неё, каким образом это происходит, видно на рисунках 5,6.

Рисунок 5. Событие переход нажатием кнопки

SharedScreenshot1.jpg

Рисунок 6

SharedScreenshot2.jpg

«Входы» и «выходы» в Bluprints Unreal Engine служат аналогом интерфейсов элементов, через которые они взаимодействуют друг с другом. На рисунке 6 мы видим «выход» в Event Action и «вход» в Open Level.

Для «передвижения» по «мирам» был создан объект human, рисунок 7.

Рисунок 7. Human

SharedScreenshotHuman.jpg

Для удобства навигации были назначены кнопки клавиатуры, рисунок 8.

Рисунок 8. НавигацияSharedScreenshotry.jpg

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

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

ЗАКЛЮЧЕНИЕ

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

Также я вижу, что среда Unreal Engine прекрасно подходит для легкого обучения основам ООП и, соответственно, введению в более углубленное изучение языков программирования, следовательно, её можно использовать в обучении как инструмент для практического знакомства с ООП и практическому обучению использования методологии в объектно-ориентированных языках.

БИБЛИОГРАФИЧЕСКИЕ ИСТОЧНИКИ

  1. Аузяк А.Г., Богомолов Ю.А., Маликов А.И., Старостин Б.А..Программирование и основы алгоритмизации: Для инженерных специальностей технических университетов и вузов. / А.Г. Аузяк, Ю.А.Богомолов, А.И. Маликов, Б.А. Старостин. Казань: Изд-во Казанского национального исследовательского технического ун-та - КАИ, 2013, 153 с.
  2. Биллиг В.А. Основы программирования на С# / А.В. Биллиг – М.: Национальный Открытый Университет «ИНТУИТ», 2016
  3. Кудрина Е.В., Огнева В.М., Портенко М.С. Программирование на языке С# : разработка консольных приложений / Е.В Кудрина , В.М.Огнева , М.С. Портенко – М.: Национальный Открытый Университет «ИНТУИТ» , 2016. – 367с.
  4. Кожемяченко В.И. , Красноперов С.Ю Программирование в среде Visual C#. Часть 1 : метод. указ. / Сиб. гос. индустр. ун-т.; сост. : В.И Кожемяченко, С.Ю. Красноперов.– Новокузнецк : Изд. центр СибГИУ, 2012. – 31 с.
  5. Кожемяченко В.И. , Красноперов С.Ю Программирование в среде Visual C#. Часть 2 : метод. указ. / Сиб. гос. индустр. ун-т.; сост. : В.И Кожемяченко, С.Ю. Красноперов. – Новокузнецк : Изд. центр СибГИУ, 2012. – 31 с.
  6. Кадырова Г. Р. Основы алгоритмизации и программирования : учебное пособие / Г. Р. Кадырова. – Ульяновск : УлГТУ, 2014. – 95
  7. Казакова А.Е. Методологические основания развития языков программирования: диссертация по ВАК 09.00.08. / А.Е. Казакова - М., 2008. - Режим доступа: dissertCat.com.
  8. Макаров В.Л. Программирование и основы алгоритмизации: Учеб. пособие. / В.Л.Макаров - СПб.: СЗТУ, 2003. – 110 с.
  9. Буч Г. Объектно-ориентированный анализ и проектирование с примерами приложений на C++ / Г. Буч; пер. с англ. И. Романовский, Ф. Андреев. - М.: Бином, 2012. - 560 с.
  10. Шарп Д. Microsoft Visual C#. Подробное руководство. 8-е изд. / Д.Шарп — СПб.: Питер, 2017. — 848 с.: ил. — (Серия «Библиотека программиста»)

ПРИЛОЖЕНИЕ

Рисунок 9

Пример наследования от родительского класса

autodraw 30.06.2019 (7).png