Файл: Основы объекно-ориентированного программирования.pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 14.06.2023

Просмотров: 184

Скачиваний: 5

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Введение

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

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

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

Задачи данной работы заключаются в том, чтобы:

  • исследовать основные понятия ООП;
  • выполнить анализ объектно-ориентированных языков программирования.

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

Теоретической базой работы являются труды зарубежных и отечественных авторов, таких как: Бертран М., Буч Г., Максимчук Р. А., Энгл М. У., Янг Б. Дж., Коналлен Д., Хьюстон К. А, Лаптев В. В.

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

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

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

1.1 История развития

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

Объектно-ориентированное программирование (далее - ООП) (Object Oriented Programming, OOP) берёт начало в революции структурного программирования, которая происходила в шестидесятых-семидесятых годах прошлого века [3].


Первый известный объект был использован Айвеном Сазерлендом в его разработанном приложении Sketchpad в 1963 году. Объекты представляли собой графические знаки, выводимые на экране осциллографа и поддерживающие наследование через динамических делегатов, которые Айвен Сазерленд назвал в своей работе «мастер-объектами» (masters). Более того, это первый в истории случай использования графического компьютерного монитора. Любой объект мог стать мастер-объектом, дополнительные экземпляры объекта были названы «реализациями» (occurrences) [2]. Это сделало систему Sketchpad обладателем первых из известных языков программирования, который реализовал наследование.

Первым языком программирования, широко известным как именно «объектно-ориентированный», был язык Simula, спецификации которого были разработаны в 1965 году сотрудниками Норвежского вычислительного центра Оле Йохан Даль и Кристен Нюгорд. Как и Sketchpad, Silmula предусматривал работу с объектами, но также включал в себя классы, наследование, основанное на классах, подклассы, и виртуальные методы.

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

Понятие «объектно-ориентированное программирование» придумал Алан Кэй, имея в виду язык программирования Smalltalk в 1972 году [1]. Он разрабатывал данный язык совместно с Дэн Инглз и другими сотрудниками научно-исследовательского центра Xerox PARC в рамках проекта по созданию устройства Dynabook [2]. Язык Smalltalk был более объектно-ориентированным, чем Simula, так как в нем всё является объектом, включая классы, целые числа и блоки (замыкания). Необходимо отметить, что первоначальная реализация языка, Smalltalk-72, не имела возможностей создания подклассов. Эта возможность появилась в Smalltalk-76.

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

Другими словами, в соответствии с идеями Алана Кэя, самыми важными аспектами ООП являются [1]:

  • передача сообщений;
  • инкапсуляция;
  • позднее связывание (функции и методы можно заменять во время выполнения программы).

Вклад Smalltalk в индустрию программного обеспечения огромен. Smalltalk по-прежнему очень актуален. Он представил миру виртуальную машину VM (Virtual Machine), которая позволяет программному обеспечению быть независимым от платформы. В настоящее время эта технология используется в Java (JVM) и .NET, а также Android (Dalvik)[4].


Smalltalk был первым языком, поддерживающим «живое» программирование и усовершенствованные методы отладки, такие как проверка и изменение кода во время выполнения.

В нем появилась первая современная среда разработки, которая включала текстовый редактор, браузер системы и классов, инспектор объектов и свойств и отладчик. Это привело к созданию многих аналогичных систем, которые сегодня используют разработчики, такие как Visual Studio, Xcode и IntelliJ IDEA[3].

И в данный момент, наиболее популярными языками программирования на основании Silmula являются - С++, Delphi, C#, Java и другие, которые обеспечивают абстракцию данных и создание классов. К объектно-ориентированным же языкам относятся объектные языки, поддерживающие наследование и полиморфизм. Примерами языков, базирующихся на модели Smalltalk, являются Python и Ruby.

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

1.2 Ключевые понятия ООП

Центральными понятиями в ООП являются класс и объект.

Класс — это тип, определяемый программистом, в котором объединяются структуры данных и функции их обработки. Конкретные переменные типа данных «класс» называются экземплярами класса, или объектами[7].

Класс содержит константы и переменные, называемые полями, а также выполняемые над ними операции и функции. Функции класса называются методами (другое название — функции-члены). Предполагается, что доступ к полям класса возможен только через вызов соответствующих методов. Поля и методы являются элементами (членами) класса[1].

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

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

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


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

Можно выделить пять типов операций:

- конструктор, создание и инициализация объекта;

- деструктор, разрушающий объект;

- модификатор, изменяющий состояние объекта;

- селектор для доступа к переменным объекта без их изменения;

- итератор для доступа к содержанию объекта по частям в определенной последовательности[4].

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

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

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

При этом объект A может выступать в роли:

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

Отношение включения имеет место, когда составной объект содержит другие объекты[1].

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

Немаловажно, что каждый класс должен включать в себя два обязательных метода: создать объект (конструктор), уничтожить объект (деструктор), а процесс создания объекта именуется инициализацией. Эти методы выделяют под свойства объекта память и освобождают ее, а также заполняют свойства значениями по умолчанию.


Существует так называемые права доступа, в зависимости от которых методы и классы видны другим классам [5]. В С++, например, это public, private, protected. Открытыми для доступа должны быть лишь некоторые возможности класса.

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

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

Примеры. Предположим, что на языке C++ нам нужно создать регистрационные записи о сотрудниках[4]. Можно сделать это следующим образом:

struct PersonnelRecord

{

char name[100];
int socialSecurityNumber;
char department[10];
float salary;

};

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

PersonnelRecord deb, dave, karen, jim, torn, denise, kaitlyn, krista, elyse;

В данном случае объявлено девять различных объектов, каждый из которых занимает определенный участок в памяти. Хотя свойства этих объектов являются общими (их состояние представляется единообразно), в памяти объекты не пересекаются и занимают каждый свое место. На практике принято ограничивать доступ к состоянию объекта, а не делать его общедоступным, как в предыдущем определении класса [1]. С учетом сказанного, изменим данное определение следующим образом:

class PersonnelRecord

{
public:

char* employeeName() const;
int employeeSocialSecurityNumber() const;
char* employeeDepartment() const;

protected:

char name[100];
int socialSecurityNumber;
char department[10];
float salary;

};

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