Основные принципы и этапы объектно-ориентированного программирования

Аннотация

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

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

Разработчики курса: к.т.н. доцент Волосатова Т.М., старший преподаватель Родионов С.В.


 


Глава 1. Введение в ООП

Основные принципы и этапы объектно-ориентированного программирования

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

Рис. 1. 

Такое представление программы было представлено в языке Simula. Принцип ООП был использован в языках Паскаль, C++.

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

Основной недостаток – некоторое снижение быстродействия за счет сложной организации программных систем.

В основу ООП заложены следующие принципы:

· абстрагирование

· ограничение доступа

· модульность

· иерархичность

· типизация

· параллелизм

· устойчивость

Абстрагирование четко определяет особенности данного объекта с точки зрения дальнейшего рассмотрения и анализа. Современный уровень абстракции предполагает объединение всех свойств объекта (состояние объекта, поведение) в единую программную единицу – некий абстрактный тип (в C++ – класс).

Необходимое ограничение доступа предполагает разграничение 2-х частей в описании абстракции: интерфейса и реализации.

В результате ограничения доступа в ООП позволяют разработчику:

· выполнять конструирование системы поэтапно, не отвлекаясь на особенности реализации используемых абстракций.

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

Принцип модульности унаследован от модульного программирования. Следование этому принципу упрощает проектирование и отладку программы.

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

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

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

· упрощение документации

· возможность генерации более эффективного кода программы. Тип может связываться с программным объектом

· статически (раннее связывание, тип объекта определен при компиляции)

· динамически (позднее связывание. Тип определяется во время выполнения программы.)

Реализация позднего связывания в языке программирования позволяет создавать переменные – указатели на объекты, принадлежащие разным классам (так называемые полиморфные объекты).


 


Языки ООП

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

Основные вопросы при обсуждении объектно-ориентированных языков:

· Исключительность объектов.

· Подклассы и подтипы.

· Реализация интерфейсного наследования.

· Проверка типов.

· Одиночное и множественное наследование.

· Полиморфизм (статическое и динамическое связывание).

· Удаление объектов из памяти.

Smalltalk – чисто объектно-ориентированный язык. Все сущности в этом языке являются объектами, все вычисления производятся через передачу сообщений. Методы конструируются из выражений, выражение описывает объект, который представляет собой значение выражения. Управляющие структуры конструируются с использованием объектов и сообщения. В этом языке все подклассы являются подтипам. Все проверки типов и связывание сообщений с методами выполняется динамически, и любое наследование является одиночным. Язык не имеет явного оператора удаления объектов из памяти.

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

C++ имеет две различных системы типов, также обеспечивается множественное наследование, явное удаление объектов из памяти, разнообразные средства управления доступа к сущностям в классе, некоторые из которых позволяют подклассам быть подтипами. Класс может содержать неявные методы конструктора и деструктора.

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

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

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

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

Golang (также известен как Go) – новый объектно-ориентированный язык программирования без поддержки наследования реализации (то есть, наследуется не сам объект, а только его интерфейсы). Создан в 2009 году. Интересен тем, что в нём реализована многопоточность, которая предусматривается ещё на этапе компиляции (то есть, программа разделяется на несколько потоков ещё в начале запуска, а не по ходу её выполнения). Позиционируется как замена C/C++ для разработки высоконагруженных решений, исполняющихся на современных многопроцессорных и распределённых системах.

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


 

1.3. О языке программирования C++

Разработчиком языка C++ является Бьёрн Страуструп (Bjarne Stroustrup). В своей работе он опирался на опыт создателей языков Simula, Modula-2, абстрактных типов данных. Основные работы велись в исследовательском центре компании Bell Labs. Непосредственный предшественник С++ – язык C с классами – появился в 1979 году. Если говорить коротко, то С++ является объектно-ориентированной версией языка С. С++ построен на основе версии С89, включающей все усовершенствования 1995 года, и теперь версию С89 называют С-подмножеством языка С++. В 1997 году был принят международный ANSI/ISO-стандарт С++, а затем в 2011 году был принят обновлённый стандарт C++ 2011, добавивший в язык частичную поддержку парадигмы функционального программирования. Актуальная на сегодняшний день версия – C++ 2017.

Принятие стандарта обеспечило единообразие всех реализаций языка С++. Не менее важным результатом стандартизации стало то, что в процессе выработки и утверждения стандарта язык был уточнен и дополнен рядом существенных возможностей. На сегодня стандарт утвержден Международной организацией по стандартизации ISO. Его номер ISO/IEC 14882 (актуальная версия имеет номер ISO/IEC 14882:2017). ISO бесплатно стандарты не распространяет. Его можно получить на сайте Международного комитета по стандартам информационных технологий (INCITS). В России следует обращаться в ВНИИ Сертификации. Проекты стандарта имеются в свободном доступе.

Несмотря на то, что язык С++ был задуман как набор объектно-ориентированных расширений языка С, вскоре он развился в самостоятельный язык программирования. В настоящее время его новые средства почти удвоили объем исходного языка. На данный момент С++ - один из самых мощных компьютерных языков. Язык С++ является универсальным языком программирования, в дополнение к которому разработан набор разнообразных библиотек. Поэтому, строго говоря, он позволяет решить практически любую задачу программирования. Тем не менее, в силу разных причин (не всегда технических) для каких-то типов задач он употребляется чаще, а для каких-то – реже. С++ как преемник языка С широко используется в системном программировании. На нем можно писать высокоэффективные программы, в том числе операционные системы, драйверы и т.п. Язык С++ – один из основных языков разработки трансляторов. Поскольку системное программное обеспечение часто бывает написано на языке С или С++, то и программные интерфейсы к подсистемам ОС тоже часто пишут на С++. Соответственно, те программы, даже и прикладные, которые взаимодействуют с операционными системами, написаны на языке С++. Распределенные системы, функционирующие на разных компьютерах, также разрабатываются на языке С++. Обработка сложных структур данных – текста, бизнес-информации, Internet-страниц и т.п. – одна из наиболее распространенных возможностей применения языка. В прикладном программировании, наверное, проще назвать те области, где язык С++ применяется мало. Разработка графического пользовательского интерфейса на языке С++ выполняется, в основном, тогда, когда необходимо разрабатывать сложные, нестандартные интерфейсы. Однако для разработки интерфейсов лучше пользоваться средствами графических библиотек операционной системы, таких как WPF, DirectX, OpenGL, X11, GTK+ 3 и другими). Простые программы чаще пишутся на таких языках, как Python. Веб-программирование в основном производится на языках Java (редко, но встречается), JavaScript, PHP.

В целом необходимо отметить, что язык С++ в настоящее время является одним из наиболее распространенных языков программирования в мире.


 

Глава 2. Средства ООП в C++



Прототипы функций

В C++ все функции должны иметь прототипы, а в языке C прототипы формально необязательны, но весьма желательны. Общая форма прототипа такова:

<тип_результата> <имя_функции>(<список_параметров>);

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

Пример 1

// Пример прототипа функции fn()


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: