Похожие презентации:
Классы в C++
1.
Классы в C++1
2.
Объектно-ориентированное программированиеПрограммирование можно интерпретировать как искусство разложения и классификации целого на части —
декомпозиции решаемой задачи.
В этом плане структуризацию в программировании можно трактовать как правила такой декомпозиции.
Исторически структуризация в программировании начиналась с введения в языки программирования
управляющих структур — операторов условного перехода, выбора, циклов с различными правилами повторения
и выхода и т. п. Цель такой структуризации заключалась в повышении читаемости и понимаемости
разрабатываемых программ. Программирование с использованием оператора безусловного перехода в этом плане
считалось нежелательным, не вписывающимся в систему правил структуризации.
Языки программирования, в которые были введены управляющие структуры, оказались первым шагом на пути от
ассемблера до современных языков. Следующим этапом в развитии концепций структуризации явилось осознание
необходимости структуризации данных. Появление таких структур, как записи, положило начало использованию
в языках программирования механизмов абстрагирования типов. Возникла идея оформить программу в виде
нескольких, по возможности простых, процедур или функций (модулей), каждая из которых решает свою
определённую задачу. Написать, откомпилировать и отладить небольшую процедуру можно легко и быстро.
Остается только собрать все процедуры в нужном порядке в одну программу. Кроме того, один раз написанные
процедуры можно затем использовать в других программах как строительные блоки.
2
3.
Объектно-ориентированное программированиеПроцедурное программирование стало парадигмой (рис. 1).
Усложнение задач привело к тому, что программы стали содержать сотни процедур и опять стали необозримыми.
«Строительные блоки» стали слишком маленькими. Потребовался новый стиль программирования. В это же время
обнаружилось, что удачная или неудачная структура данных может сильно облегчить или усложнить их обработку. Одни
данные удобнее объединять в массив, для других больше подходит список, стек или дерево. Возникла идея объединить
исходные данные и все процедуры их обработки в один модуль. Эта идея модульного программирования на некоторое
время стала парадигмой (рис. 2).
Первоначально такой модуль представлял собой просто более или менее случайный набор данных и подпрограмм. В
такие модули собирали подпрограммы, которые, как казалось, скорее всего, будут изменяться совместно. Программы
составлялись из отдельных модулей. Эффективность таких программ тем выше, чем меньше модули зависят друг от
друга. Для того чтобы обеспечить максимальную независимость модулей, надо четко отделить процедуры, которые будут
вызываться другими модулями (открытые процедуры), от вспомогательных, которые обрабатывают данные, заключенные
в этот модуль (закрытые процедуры).
3
4.
Объектно-ориентированное программированиеДанные, занесенные в модуль, также делятся на открытые и закрытые.
Оказалось удобным разбить программу на модули так, чтобы она превратилась в совокупность взаимодействующих
объектов. Так возникло объектно-ориентированное программирование (ООП) — современная парадигма
программирования. Как известно, все программы состоят из двух элементов: кода и данных. Любая программа может
быть концептуально организована либо вокруг ее кода («кодовое воздействие на данные»), либо вокруг данных
(«управляемый данными доступ к коду»). При первом (процедурном) подходе программу определяет последовательность
операторов ее кода. Второй подход организует программу вокруг данных (т. е. вокруг объектов) и набора хорошо
организованных интерфейсов (взаимодействий) с этими данными.
4
5.
Объектно-ориентированное программированиеЧто же такое объектно-ориентированное программирование. Его можно охарактеризовать следующим образом:
Объектно-ориентированное программирование — это методология программирования, основанная на представлении
программы в виде совокупности объектов, каждый из которых является экземпляром определенного класса, а классы
образуют иерархию наследования.
В данном определении можно выделить три части:
• ООП использует в качестве базовых элементов объекты, а не алгоритмы;
• каждый объект является экземпляром какого-либо определенного класса ;
• классы организованы иерархически (рис. 3).
5
6.
Объектно-ориентированное программированиеОбъектно-ориентированный язык программирования должен обладать следующими свойствами:
1) абстракции — формального представления о качествах или свойствах предмета путем мысленного удаления
некоторых частностей или материальных объектов;
2) инкапсуляции — механизма, связывающего вместе код и данные, которыми он манипулирует, и защищающего
их от внешних помех и некорректного использования;
3) наследования — процесса, с помощью которого один объект приобретает свойства другого, т. е. поддерживается
иерархическая классификация;
4) полиморфизма — свойства, позволяющего использовать один и тот же интерфейс для общего класса действий.
6
7.
Объектно-ориентированное программированиеВ теории программирования ООП определяется как технология создания сложного программного обеспечения,
которая основана на представлении программы в виде совокупности объектов, каждый из которых является
экземпляром определенного типа (класса), а классы образуют иерархию с наследованием свойств.
Взаимодействие программных объектов в такой системе осуществляется путем передачи сообщений.
В основу объектно-ориентированного программирования положены следующие принципы:
1)
абстрагирование;
2)
ограничение доступа;
3)
модульность;
4)
иерархичность;
5)
типизация;
6)
параллелизм;
7)
устойчивость.
7
8.
Объектно-ориентированное программированиеАбстракция — это совокупность существенных характеристик некоторого объекта, которые отличают его от
всех других видов объектов и, таким образом, четко определяют особенности данного объекта с точки зрения
дальнейшего рассмотрения и анализа. Процесс абстракции может быть выражен как некоторое обобщение. Оно
позволяет рассматривать различные предметы так, как если бы они были эквивалентны за счет выделения существенных атрибутов от несущественных. Одним из первых шагов на пути понятия процесса абстракции
являются задачи из начальной школы.
Например, когда от конкретной задачи «3 яблока + 2 груши = ? фруктов» можно перейти к осознанию более
абстрактного выражения «3 + 2 = ?», а затем и вовсе «Х+ Y= 2».
Ограничение доступа — это сокрытие отдельных элементов реализации абстракции, не затрагивающих
существенных характеристик ее как целого.
Необходимость ограничения доступа предполагает разграничение двух частей в описании абстракции:
1)
интерфейс — совокупность доступных извне элементов реализации абстракции (основные характеристики
состояния и поведения);
2)
реализация — совокупность недоступных извне элементов реализации абстракции (внутренняя организация
абстракции и механизмы реализации ее поведения).
Модульность — это принцип разработки программной системы, предполагающий реализацию ее в виде
отдельных частей (модулей). При выполнении декомпозиции системы на модули желательно объединять
логически связанные части, по возможности обеспечивая сокращение количества внешних связей между
модулями.
Иерархия — это ранжированная или упорядоченная система абстракций. Принцип иерархичности
предполагает использование иерархий при разработке программных систем.
8
9.
Объектно-ориентированное программированиеТипизация — это ограничение, накладываемое на свойства объектов и препятствующее взаимозаменяемости
абстракций различных типов.
Параллелизм — свойство нескольких абстракций одновременно находиться в активном состоянии, т. е.
выполнять некоторые операции.
Устойчивость — свойство абстракции существовать во времени независимо от процесса, породившего данный
программный объект, и/или в пространстве, перемещаясь из адресного пространства, в котором он был создан.
Все указанные выше принципы в той или иной степени реализованы в различных версиях объектноориентированных языков.
Язык считается объектно-ориентированным, если в нем реализованы первые четыре из рассмотренных семи
принципов.
9
10.
2. Этапы разработки программных продуктов с использованием ООППроцесс разработки программного обеспечения с использованием объектно-ориентированного подхода
включает четыре этапа:
1)
анализ;
2)
проектирование;
3)
эволюцию;
4)
модификацию.
Цель анализа — максимально полное описание задачи. На этом этапе выполняется анализ предметной области
задачи, объектная декомпозиция разрабатываемой системы и определяются важнейшие особенности поведения
объектов (описание абстракций).
По результатам анализа разрабатывается структурная схема программного продукта, на которой показываются
основные объекты и сообщения, передаваемые между ними, а также выполняется описание абстракций.
Проектирование подразделяется на логическое и физическое.
Логическое проектирование заключается в разработке структуры классов: определяются поля для хранения
составляющих состояния объектов и алгоритмы методов, реализующих аспекты поведения объектов. Результатом
является иерархия или диаграмма классов, отражающая взаимосвязь классов и описание классов.
Физическое проектирование включает объединение описаний классов в модули, выбор схемы их подключения
(статическая или динамическая компоновка), определение способов взаимодействия с оборудованием, с
операционной системой и/или другим программным обеспечением (например, базами данных, сетевыми
программами), обеспечение синхронизации процессов для систем параллельной обработки и т. д.
Эволюция системы — это процесс поэтапной реализации и подключения классов к проекту.
10
11.
2. Этапы разработки программных продуктов с использованием ООПМодификация — это процесс добавления новых функциональных возможностей или изменение существующих
свойств системы. Таким образом, объектно-ориентированный подход к программированию некоторой задачи
прежде всего состоит в том, чтобы создать некоторый инструментарий, присущий решаемой задаче, а затем уже
программировать в терминах этой задачи. Все языки ООП основаны на трех основополагающих концепциях,
называемых инкапсуляцией, полиморфизмом и наследованием.
ООП = ИНКАПСУЛЯЦИЯ + НАСЛЕДОВАНИЕ + ПОЛИМОРФИЗМ
C++ соответствует определению языка объектно-ориентированного программирования по всем трем
критериям. Рассмотрим простую программу (табл.), осуществляющую ввод и вывод целого числа и символьной
строки.
11
12.
2. Этапы разработки программных продуктов с использованием ООПЭта программа представляет собой иллюстрацию объектно-ориентированной природы C++. В приведенном
фрагменте:
cin — объект, воспринимающий ввод пользователя;
cout — объект, обеспечивающий форматный вывод.
При обмене сообщениями с объектами cin и cout форма и тип передаваемых данных определяют действия,
которые требуется выполнить (полиморфизм), содержание выполняемых операций в вызывающей программе
никак не отражается (инкапсуляция), и оба используемых объекта представляют собой конкретные реализации
одного и того же порождающего класса iostream (наследование).
12
13.
3. ИнкапсуляцияИнкапсуляция является важнейшим свойством объектов, на котором строится объектно-ориентированное
программирование. Инкапсуляция заключается в том, что объект скрывает в себе детали, которые
несущественны для использования объекта. В традиционном подходе к программированию с использованием
глобальных переменных программист не был застрахован от ошибок, связанных с использованием процедур, не
предназначенных для обработки данных, связанных с этими переменными.
Предположим, например, что имеется «не-ООП» программа, предназначенная для начисления заработной
платы сотрудникам некой организации, а в программе имеются два массива.
Один массив хранит величину заработной платы, а другой — телефонные номера сотрудников (для
составления отчёта для налоговой инспекции).
Что произойдет, если программист случайно перепутает эти массивы? Очевидно, для бухгалтерии начнутся
тяжелые времена. «Жесткое» связывание данных и процедур их обработки в одном объекте позволит избежать
неприятностей такого рода.
Инкапсуляция и является средством организации доступа к данным только через соответствующие методы.
Внутри объекта данные и методы могут обладать различной степенью открытости (или доступности).
13
14.
4. НаследованиеНаследование — это процесс, посредством которого один объект может приобретать свойства другого.
Точнее, объект может наследовать свойства другого объекта и добавлять к ним черты, характерные только для
него.
Наследник сохраняет свойства совместимости с другими объектами своего родителя. При программной
реализации в правой части оператора присваивания вместо типов родителя можно использовать типы
наследника, но не наоборот.
Наследование позволяет определять новые объекты, используя свойства прежних, дополняя или изменяя их.
Объект-наследник получает все поля и методы «родителя», к которым он может добавить свои собственные поля
и методы или заменить («перекрыть») их своими методами.
Из методов наследника можно вызывать методы родителя. Для создания наследника не требуется иметь
исходный текст объекта родителя. Объект-родитель может быть уже в составе оттранслированного модуля.
Если некий объект был уже определен и отлажен, он может быть использован и в других программах. При
этом может оказаться, что новая задача отличается от предыдущей, и возникает необходимость некоторой
модификации как данных, так и методов их обработки. Программисту приходится решать дилемму — создавать
объекты заново или использовать результаты предыдущей работы, применяя механизм наследования. Первый
путь менее эффективен, так как требует дополнительных затрат времени на отладку и тестирование. Во втором
случае часть этой работы оказывается выполненной, что сокращает время на разработку новой программы.
Программист при этом может и не знать деталей реализации объекта-родителя.
ООП позволяет процедуре обрабатывать параметры различных типов с помощью наследования: если
определен порожденный тип, то методы порождающего типа наследуются, однако при желании они могут
переопределяться. Для переопределения наследуемого метода описывается новый метод с тем же именем, что и
14
наследуемый, но с другим телом и с другим множеством параметров.
15.
5. ПолиморфизмСлово полиморфизм греческого происхождения и означает «имеющий много форм». Полиморфизм — это
свойство, которое позволяет одно и то же имя использовать для решения нескольких технически разных задач.
Применительно к ООП целью полиморфизма является использование одного имени для задания общих для
класса действий. На практике это означает способность объектов выбирать внутреннюю процедуру (метод)
исходя из типа данных, принятых в сообщении. Например, объект «Print» (печать) может получить сообщение,
содержащее двоичное целое число, двоичное число с плавающей точкой или символьную строку. В более общем
смысле, концепцией полиморфизма является идея «один интерфейс — множество методов». Это означает, что
можно создать общий интерфейс для группы близких по смыслу действий. Преимуществом полиморфизма
является то, что он помогает снижать сложность программ, разрешая использование одного интерфейса для
единого класса действий. Выбор конкретного действия в зависимости от ситуации возлагается на компилятор.
Таким образом, полиморфизм означает присваивание действию одного имени или обозначения, которое
совместно используется объектами различных типов, при этом каждый объект реализует действие способом,
соответствующим его типу.
Полиморфизм напрямую связан с механизмом позднего связывания. Решение о том, какая операция должна
быть выполнена в конкретной ситуации, принимается во время выполнения программы.
15
16.
Объектно-ориентированное программированиеВ объектно-ориентированном программировании базовыми единицами программ и данных являются объекты.
Объект состоит из следующих трех частей:
имя объекта;
состояние (переменные состояния);
методы (операции).
Интерфейс объекта с его окружением определен полностью его методами, так как к его состоянию нет другого
доступа извне, как через методы.
Объект может посылать сообщения другим объектам и принимать сообщения от них, сохраняя свое состояние от
обращения к обращению. Изменение состояний производится только через вызов методов этого объекта. Этим
существенно ограничивается возможность введения объекта в недопустимое состояние и/или несанкционированное
разрушение объекта. Возможность управлять состояниями объекта через вызов методов в конечном итоге будет
определять поведение объекта. Реализация методов, т. е. операций, выполняемых объектом, может быть задана различными способами.
16
17.
Что такое классЭто абстрактный тип данных. Он сочетает в себе два функционала:
•Первая — это структура, в которой можно хранить различные типы данных: массивы, переменные, функции.
•Вторая — возможность пользоваться объектно-ориентированным программированием (ООП — об этом ниже).
Создав класс можно создать его экземпляр — объект.
Объект — это функционирующий прототип класса, которому можно задавать свойства и вызывать методы.
17
18.
1819.
Объектно-ориентированное программированиеООП возникло для простой работы с кодом. Эволюция программирования шла по пути упрощения для человека
процесса написания программ. Программы в ООП представляют собой совокупность объектов и структур.
Рассмотрим ООП на основе объектов реального мира.
Пример 1.
Класс Кофемолка
описывает группу объектов, имеющих похожие свойства:
Скорость вращения
….
Функции:
МолотьКофе()
19
20.
Объектно-ориентированное программированиеЭкземпляры класса Кофемолка
20
21.
Объектно-ориентированное программирование. Инкапсуляция1. Инкапсуляция на примере кофемолки
Программист, разрабатывающий класс, может скрыть некоторый функционал от другого пользователя
Например, в кофемолку мы можем насыпать зерна, нажать перемолоть и достать зерна. Не можем влиять на
скорость вращения, угол наклона лезвий и т.д.
2. Инкапсуляция на примере машины
Мы едем, но часть функционала машины от нас скрыта
21
22.
Объектно-ориентированное программирование. Инкапсуляция1. Наследование на примере кофемолки
Мы хотим описать класс кофемашины и создать объект кофемашины. Мы можем этот класс наследовать от
кофемолки.
Кофемашина при наследования получает возможность иметь метод МолотьКофе
1. Наследование на примере автомобиля
Мы хотим описать класс легковой автомобиль. Мы можем этот класс наследовать от автомобиля.
Легковой автомобиль при наследования получает возможность иметь методы Автомобиля, например Ехать()
22
23.
Объектно-ориентированное программирование. Инкапсуляция1. Полиморфизм на примере кофемолки
Кофемолки бывают электрические и ручные, но метод МолотьКофе() у них один
2. Полиморфизм на примере автомобиля
Автомобили бывают грузовые и легковые, но метод Ехать() у них один
23
24.
Объектно-ориентированное программирование на С++1. Класс – это пользовательский тип данных, который мы можем написать сами, на основании примитивных
типов данных.
24
25.
2526.
2627.
Создание экземпляра классаПока что сделаем поля класса доступными нам с помощью модификатора доступа public, хотя это и неправильно
с точки зрения ООП.
27
28.
Доступ к полям классаНажатие на точку после имени класса позволяет обращаться к его полям.
28
29.
Заполнение полей классаЗдесь создано два экземпляра класса. Поля name в них заполнены и можно их вывести на печать.
29
30.
Методы классаЗдесь создан метод класса. В функции main мы обращаемся к нему.
30
31.
3132.
Спецификаторы доступаЕсли убрать в нашем примере public, то мы потеряем доступ к полям класса, так как по умолчанию там
используется спецификатор private.
32
33.
Спецификаторы доступаСогласно принципам ООП поля класса должны быть private, а доступ к ним мы можем получать через методы,
которые public
33
34.
Спецификаторы доступаМетоды, которые private не видны вне класса, но они могут быть вызваны внутри public класса
34
35.
3536.
Пример get/set36
37.
Отделение данных от логики37
Программирование