Похожие презентации:
1 (дополн)_ООП-базовые принципы
1. Объектно-ориентированное программирование
Объектноориентированноепрограммирование
Что такое ООП?
Объекты и классы
Скрытие внутреннего
устройства объектов
Иерархия классов
К. Поляков, 2011
http://kpolyakov.narod.ru
1
2. Объектно-ориентированное программирование
2Объектноориентированное
программирование
Что такое ООП?
К. Поляков, 2011
http://kpolyakov.narod.ru
3. Направления развития ПО
Объектно-ориентированное программированиеНаправления развития ПО
• переход от расчетов по формулам к сложным
задачам моделирования систем
• увеличение объемов обрабатываемых данных
• повышение сложности программ, увеличение их
длины (до миллионов строк!)
! Сложность программ превышает возможности
одного человека.
В итоге:
• коллективная разработка
• каждый делает свою часть независимо от других
• части программы легко «собрать» вместе
? Как?
3
4. Борьба со сложностью
Объектно-ориентированное программирование4
Борьба со сложностью
«Техника борьбы со сложностью известна с античных
времен: “Divide et impera” (разделяй и властвуй)».
Э. Дейкстра
Алгоритмическая
декомпозиция
задача
> 100 000 строк???
подзадача 1
подзадача 2
подзадача 3
подзадача 2.1
подзадача 2.2
подзадача 2.3
Декомпозиция – это разбиение системы на
подсистемы, каждая из которых может изучаться
отдельно.
5. Объектный подход
Объектно-ориентированное программированиеОбъектный подход
Люди воспринимают мир, состоящий из объектов
(Р. Декарт).
5
6. Абстракция
Объектно-ориентированное программированиеАбстракция
Абстракция – это выделение существенных
характеристик объекта, отличающих его от
других объектов.
Иллюстрация из книги Г. Буч, Объектно-ориентированный анализ и проектирование с примерами приложений на С++.
6
7. Абстракция в программировании
Объектно-ориентированное программирование7
Абстракция в программировании
• программа – это множество
взаимодействующих объектов (моделей)
• объекты имеют свойства и поведение
• объекты не «знают» внутреннее устройство
других объектов
А
Б
Б1
Б2
В1
В
В2
В3
Б3
Г
Г2
Г1
Объектная
декомпозиция
8. Абстракция в программировании
Объектно-ориентированное программирование8
Абстракция в программировании
Верхний уровень:
• определить, ЧТО делает каждый объект
• определить ИНТЕРФЕЙС – способ обмена
данными между объектами
Б
интерфейс
В
Нижний уровень:
• определить, КАК работают объекты
Б
Б1
Б2
Б3
интерфейс
интерфейс
В1
В
В3
В2
9. Что такое ООП?
Объектно-ориентированное программированиеЧто такое ООП?
Программирование, основанное на моделировании задачи
реального мира как множества взаимодействующих
объектов, принято называть объектно-ориентированным
программированием (ООП).
уточнение следует…
9
10. Объектно-ориентированное программирование
10Объектноориентированное
программирование
Объекты и классы
К. Поляков, 2011
http://kpolyakov.narod.ru
11. Объектно-ориентированный анализ (ООА)
Объектно-ориентированное программированиеОбъектно-ориентированный анализ (ООА)
Задачи:
• выделить взаимодействующие объекты
• определить их существенные свойства
? Какие свойства существенные?
• описать команды, которые объекты могут
выполнить (поведение)
11
12. Что такое объект?
Объектно-ориентированное программирование12
Что такое объект?
Объектом можно назвать то, что имеет четкие
границы и обладает состоянием и
поведением.
! Состояние объекта определяет его поведение!
Примеры:
«Подпрыгни!»
«Пли!»
13. Объектная модель: пример
Объектно-ориентированное программированиеОбъектная модель: пример
Объекты:
• дорога
• машины
• светофоры
• …
? Описывать каждую машину отдельно?
Класс – это множество объектов, имеющих
общую структуру и общее поведение.
Классы объектов: Дорога, Машина
13
14. Объектная модель: класс Дорога
Объектно-ориентированное программирование14
Объектная модель: класс Дорога
ширина
длина
название класса
свойства
Дорога
длина
ширина
поведение
(команды, методы)
? Какое «поведение» могло
бы быть у дороги?
15. Объектная модель: класс Машина
Объектно-ориентированное программирование15
Объектная модель: класс Машина
Y
V
X
метод
Машина
X (координата)
Y (полоса)
V (скорость)
двигаться
узнать длину
Дорога
длина
ширина
Метод – это процедура или функция,
принадлежащая классу объектов.
16. Класс Дорога в программе
Объектно-ориентированное программирование16
Класс Дорога в программе
Объявление (описание) класса:
от type
type TRoad = class
Length: real;
Width: integer;
end;
поля
Поле – это переменная, принадлежащая объекту.
! Объект в памяти не создается!
Аналогия: чертёж детали.
17. Класс Дорога в программе
Объектно-ориентированное программирование17
Класс Дорога в программе
Переменная для работы с объектом:
var road: TRoad;
road
12345
?
! Объект в памяти не создается!
Ссылка – это переменная, в которую можно
записать адрес объекта заданного типа.
адрес 12345
road := TRoad.Create;
Length
0
Width
0
Конструктор – это метод класса, который
вызывается для создания объектов этого класса.
! Конструктор не нужно объявлять!
18. Создание объекта
Объектно-ориентированное программирование18
Создание объекта
type TRoad = class
Length: real;
Width: integer;
end;
var road: TRoad;
begin
road := TRoad.Create;
road.Length := 60;
road.Width := 3;
end.
описание класса
переменная-ссылка
вызов конструктора
значения полей
19. Новый конструктор
Объектно-ориентированное программированиеНовый конструктор
Цель – определить начальные значения при
создании объекта. длина ширина
road := TRoad.Create (60, 3);
Описание класса:
type TRoad = class
Length: real;
Width: integer;
constructor Create(length0: real;
width0: integer);
end;
19
20. Новый конструктор
Объектно-ориентированное программированиеНовый конструктор
Реализация (программа) конструктора:
метод класса TRoad
constructor TRoad. Create(length0: real;
width0: integer);
begin
if
length0
> 0 then
Length
:= length0;
:= length0
WidthLength
:= width0;
else Length := 1;
if width0 > 0 then
Width := width0
else Width := 1;
end;
? Что плохо?
! Можно обрабатывать ошибки!
20
21. Класс Машина в программе
Объектно-ориентированное программирование21
Класс Машина в программе
Машина
X (координата)
Y (полоса)
V (скорость)
двигаться
узнать длину
Дорога
длина
ширина
type TCar = class
X, V: real; { координата, скорость }
Y: integer; { номер полосы }
road: TRoad; { ссылка на дорогу }
procedure move; { двигаться вперед }
end;
адрес объекта
класса
Дорога
Как машина
сможет
узнать длину дороги?
?
22. Класс Машина в программе
Объектно-ориентированное программированиеКласс Машина в программе
Равномерное движение: X X 0 V t
V – перемещение за 1 интервал.
procedure TCar.move;
begin
X := X + V; { при Δt = 1 }
if X > road.Length then
X := 0;
{ «перескочить» в начало }
end;
длина дороги, по
которой едет машина
22
23. Класс Машина в программе
Объектно-ориентированное программирование23
Класс Машина в программе
Добавление конструктора:
адрес дороги
type TCar = class
...
constructor Create(road: TRoad;
y0: integer; v0: real);
end;
полоса
скорость
? Чему будет равна координата X?
24. Основная программа моделирования
Объектно-ориентированное программированиеОсновная программа моделирования
const N = 3;
var road: TRoad;
cars: array [1..N] of TCar;
i: integer;
begin
road := TRoad.Create(60, N);
for i:=1 to N do
cars[i] := TCar.Create(road, i, 2.0*i);
repeat
for i:=1 to N do cars[i].move;
{ вывод расположения машин }
until keypressed;
end.
? Важен ли порядок создания объектов?
24
25. Плюсы и минусы ООП
Объектно-ориентированное программированиеПлюсы и минусы ООП
основная программа простая и понятная
каждый класс может разрабатывать
отдельный программист независимо
можно использовать готовые классы в
других программах
увеличение длины полной программы (с
учетом описания классов)
замедление работы
25
26. Объектно-ориентированное программирование
26Объектноориентированное
программирование
Скрытие внутреннего
устройства объектов
К. Поляков, 2011
http://kpolyakov.narod.ru
27. Зачем скрывать внутреннее устройство?
Объектно-ориентированное программированиеЗачем скрывать внутреннее устройство?
борьба со сложностью
безопасность внутренних данных
возможность изменять «внутренности», не
меняя интерфейс
Иллюстрация из книги Г. Буч, Объектно-ориентированный анализ и проектирование с примерами приложений на С++.
27
28. Инкапсуляция
Объектно-ориентированное программирование28
Инкапсуляция
Инкапсуляция («помещение в капсулу») – это
скрытие внутреннего устройства объектов от
других объектов.
Класс Перо (цвет и стиль линий):
type TPen = class
color: string;
end;
'FF00FF'
! По умолчанию все поля
var pen: TPen;
...
pen := TPen.Create;
pen.color := '#%';
writeln(pen.color);
общедоступные!
доступно всем!
29. Инкапсуляция
Объектно-ориентированное программированиеИнкапсуляция
Скрытие полей:
type TPen = class
private
частный,
FFColor: string;
закрытый
end;
от Field – «поле»
Проблема – нет доступа к полю!
!
pen.color := 'FFFF00';
writeln(pen.color);
! Для доступа к закрытому полю нужны
методы чтения и записи!
29
30. Методы доступа к полю
Объектно-ориентированное программированиеМетоды доступа к полю
type TPen = class
общедоступный
private
метод чтения
FColor: string;
public
function getColor: string;
procedure setColor(newColor: string);
end;
метод записи
Метод чтения:
• функция без параметров
• возвращает значение того же типа, что и поле
Метод записи:
• процедура
• принимает значение того же типа, что и поле
30
31. Методы доступа к полю
Объектно-ориентированное программирование31
Методы доступа к полю
function TPen.getColor: string;
begin
Result := FСolor;
end;
procedure TPen.setColor(newColor: integer);
begin
FColor := newColor;
end;
поле
методы
getColor
FColor
setColor
TPen
другой
объект
? Стало ли лучше?
32. Проверка при изменении поля
Объектно-ориентированное программированиеПроверка при изменении поля
В случае ошибочного значения установить черный цвет:
procedure TPen.setColor(newColor: integer);
begin
if Length(newColor)
{ ошибочное значение
<> 6} then
FColor := '000000' { чёрный цвет }
else FColor := newColor;
end;
Использование:
pen.setColor('FF00');
{ ошибка: черный }
pen.setColor('FFFF00'); { запись }
writeln(pen.getColor); { чтение }
? Какие ошибки не обработаны?
32
33. Свойство
Объектно-ориентированное программирование33
Свойство
pen.сolor := 'FFFF00'; { запись }
writeln(pen.color);
{ чтение }
Свойство – это способ доступа к внутреннему
состоянию объекта, имитирующий обращение к
его внутренней переменной.
поле
методы
свойство
getColor
FColor
TPen
color
setColor
другой
объект
34. Свойство
Объектно-ориентированное программирование34
Свойство
type TPen = class
private
FColor: string;
function getColor
getColor: string ;
procedure setColor
setColor(newColor: string );
public
property сolor: string
read getColor write setColor
setColor;
end;
свойство
тип свойства
метод чтения
метод записи
pen.сolor := 'FFFF00'; { запись }
writeln(pen.color);
{ чтение }
35. Изменяем способ хранения данных
Объектно-ориентированное программирование35
Изменяем способ хранения данных
FColor: string;
'FF00FF'
'001234'
'0000A5'
методы
поле
FColor: integer;
FF00FF16 = 16711935
123416 = 4460
A516 = 165
свойство
getColor
FColor
TPen
color
setColor
реализация
другой
объект
интерфейс
! Можно менять реализацию, не меняя интерфейс!
36. Изменяем способ хранения данных
Объектно-ориентированное программирование36
Изменяем способ хранения данных
function TPen.getColor: string;
begin
Result := IntToHex (FColor,6);
end;
6 знаков: '0000FF'
X10 X16 (строка)
procedure TPen.setColor(newColor: string);
begin
if Length(newColor) <> 6 then
FColor := 0 { чёрный цвет }
else
FColor := StrToInt ('$' + newColor);
end;
строка число
шестнадцатеричное
37. Свойства «только для чтения»
Объектно-ориентированное программированиеСвойства «только для чтения»
Машина
…
V (скорость)
двигаться
? Могут ли другие объекты менять
скорость автомобиля?
type TCar = class
private
Fv: real;
свойство «только для чтения»
...
public
property v: real read Fv;
...
end;
37
38. Скрытие внутреннего устройства: итог
Объектно-ориентированное программированиеСкрытие внутреннего устройства: итог
свойства
методы
защита данных объекта
изменение внутреннего
устройства не требует
изменения других
объектов, если сохранить
интерфейс
длина программы
замедление работы
! Выгодно для больших программ, где
требуется надежность!
38
39. Контрольные вопросы
39Контрольные вопросы
1. Что такое “интерфейс объекта”?
2. Что такое инкапсуляция? Каковы ее цели?
3. Чем отличаются секции public и private в описании классов? Как
определить, в какую из них поместить свойство или метод?
4. Почему рекомендуют делать доступ к полям объекта только с помощью
методов?
5. Что такое свойство? Зачем во многие языки программирования введено
это понятие?
6. Можно ли с помощью свойства обращаться напрямую к полю объекта,
не используя метод?
7. Почему методы доступа, которые использует свойство, делают
закрытыми?
8. Зачем нужны свойства “только для чтения”? Приведите примеры.
9. Подумайте, в каких ситуациях может быть нужно свойство “только для
записи” (которое нельзя прочитать). Как ввести такое свойство в описание
класса?
40. Объектно-ориентированное программирование
40Объектноориентированное
программирование
Иерархия классов
К. Поляков, 2011
http://kpolyakov.narod.ru
41. Классификации
Объектно-ориентированное программирование41
Классификации
базовый
класс
Фрукт
сочный съедобный плод
дерева или кустарника
? Как выглядит фрукт?
классы-наследники
Яблоко – это разновидность фруктов.
Яблоко наследует все свойства фруктов.
Фото: www.statesymbolsusa.org, xenianova.files.wordpress.com, spoon.com.ua, gerbl.ru
42. Примеры наследования свойств
Объектно-ориентированное программирование42
Примеры наследования свойств
базовый
класс
Человек
Работник школы
Администратор
Директор
Завуч
Ученик
Учитель
Уборщик
Родитель
Технический работник
Слесарь
Электрик
43. Что такое наследник?
Объектно-ориентированное программирование43
Что такое наследник?
Класс Б является наследником класса А, если можно
сказать, что Б – это разновидность А.
водоем
осёл
озеро
цветок
животное
ромашка
автомобиль
двигатель
! Двигатель – это часть автомобиля, а
не разновидность!
автомобиль
косточка
грузовик
ягода
44. Иерархия логических элементов
Объектно-ориентированное программирование44
Иерархия логических элементов
Логический элемент
с одним входом
НЕ
с двумя входами
И
ИЛИ
45. Определение ООП
Объектно-ориентированное программированиеОпределение ООП
Объектно-ориентированное
программирование – это такой подход к
программированию, при котором
1) программа представляет собой множество
взаимодействующих объектов,
2) … каждый из которых является экземпляром
определенного класса, и …
3) классы образуют иерархию наследования.
45
46. Класс «Логический элемент»
Объектно-ориентированное программирование46
Класс «Логический элемент»
ЛогЭлемент
In1 (вход 1)
In2 (вход 2)
Res (результат)
сalc (вычислить)
type
TLogElement = class
In1, In2: boolean;
Res: boolean;
procedure calc;
end;
Сравните (плюсы, минусы):
вычислить результат
при изменении входов
type
TLogElement = class
In1, In2: boolean;
function res: boolean;
end;
вычислить результат по
известным входам
47. Скрываем данные (инкапсуляция)
Объектно-ориентированное программированиеСкрываем данные (инкапсуляция)
type
TLogElement = class
private
FIn1, FIn2: boolean;
FRes: boolean;
procedure calc;
procedure setIn1(newIn1: boolean);
procedure setIn2(newIn2: boolean);
public
property In1: boolean read FIn1 write setIn1;
property In2: boolean read FIn2 write setIn2;
property Res: boolean read FRes;
читать прямо из поля
end;
свойство «только для чтения»
47
48. Процедура изменения входа
Объектно-ориентированное программированиеПроцедура изменения входа
procedure TLogElement.setIn1(newIn1: boolean);
begin
FIn1 := newIn1;
calc;
end;
! Сразу после изменения входа нужно
пересчитать значение выхода!
Проблемы:
как написать метод calc?
для элемента «НЕ» доступ ко второму
входу не нужен!
48
49. Метод calc
Объектно-ориентированное программированиеМетод calc
• невозможно написать для базового класса
Абстрактный метод – это метод, который
объявляется, но не реализуется в классе.
• разный у всех логических элементов
• наследники должны его переопределять!
Виртуальный метод – это метод, который
могут переопределять классы-наследники.
• недоступен для других объектов
! Calc – это виртуальный (virtual) и
абстрактный (abstract) метод!
49
50. Метод calc
Объектно-ориентированное программированиеМетод calc
type
TLogElement = class
private
защищенный
виртуальный
абстрактный
...
protected
procedure calc; virtual; abstract;
public
...
end;
! protected – доступно только наследникам!
Абстрактный класс – это класс, содержащий
абстрактный метод. Создать объект этого
класса НЕЛЬЗЯ!!!
50
51. Как «скрыть» свойство In2?
Объектно-ориентированное программированиеКак «скрыть» свойство In2?
type
TLogElement = class
private
...
protected
property In2: boolean read FIn2 write setIn2;
procedure calc; virtual; abstract;
public
...
end;
! Наследники могут «открыть» защищенное
свойство (перевести в public)!
51
52. Классы-наследники: TNot
Объектно-ориентированное программирование52
Классы-наследники: TNot
наследник от …
type
переопределить
TNot = class(TLogElement)
procedure calc; override;
end;
procedure TNot.calc;
begin
FRes := not FIn1;
end;
! TNot – не абстрактный класс!
ПОЛИМОРФИЗМ
53. Классы-наследники: TLog2In
Объектно-ориентированное программированиеКлассы-наследники: TLog2In
наследник от …
TLog2In = class(TLogElement)
public
свойство становится
property In2;
общедоступным
end;
? TLog2In – абстрактный класс?
53
54. Классы-наследники: TAnd
Объектно-ориентированное программированиеКлассы-наследники: TAnd
наследник от …
type
переопределить
TAnd = class(TLog2In)
procedure calc; override;
end;
procedure TAnd.calc;
begin
FRes := FIn1 and FIn2;
end;
? TAnd – абстрактный класс?
54
55. Вернемся к setIn1…
Объектно-ориентированное программированиеВернемся к setIn1…
procedure
TLogElement.setIn1 (newIn1: boolean);
begin
FIn1 := newIn1;
calc;
какой метод
end;
вызывается?
• вызвать процедуру = перейти по заданному
адресу памяти
• в классе TLogElement метод calc не
реализован (нет кода, нет адреса)
• каждый наследник имеет свой метод calc
55
56. Обычный вызов процедуры
Объектно-ориентированное программирование56
Обычный вызов процедуры
Паскаль
Ассемблер
процедура
...
calc;
...
...
call AB12
...
AB12 ...
AB14 ...
AB16 ...
...
Статическое связывание: адрес процедуры
известен и сразу записывается в машинный
код!
57. Динамическое связывание (при выполнении)
Объектно-ориентированное программирование57
Динамическое связывание (при выполнении)
методы классов
Паскаль
...
calc;
...
виртуальный
метод
? Каков класс
объекта?
TNot.calc
TAnd.calc
TOr.calc
Виртуальный метод – это метод базового
класса, который могут переопределить классынаследники так, что конкретный адрес
вызываемого метода определяется только при
выполнении программы.
58. Основная программа («И-НЕ»)
Объектно-ориентированное программирование58
Основная программа («И-НЕ») | A | B | not(A&B)
-----------------| 0 | 0 | 1
| 0 | 1 | 1
| 1 | 0 | 1
| 1 | 1 | 0
var elNot: TNot;
{ ссылки }
elAnd: TAnd;
A, B: boolean;
begin
elNot := TNot.Create; { создание объектов }
elAnd := TAnd.Create;
writeln('| A | B | not(A&B) ');
writeln('-------------------');
for A:=False to True do begin { перебор вариантов }
elAnd.In1 := A;
for B:=false to True do begin
elAnd.In2 := B;
elNot.In1 := elAnd.res;
{ связь элементов }
writeln('| ', integer(A), ' | ', integer(B),
' | ', integer(elNot.res));
end;
integer(False) = 0
end;
end.
integer(True) = 1
!
59. Классы – в модуль!
Объектно-ориентированное программированиеКлассы – в модуль!
unit log_elem;
режим работы с объектами
{$mode objfpc}
interface
{ доступно другим модулям }
type
TLogElement = class
...
end;
... { объявление всех классов }
implementation
{ скрыто от других модулей }
procedure TLogElement.setIn1(newIn1: boolean);
begin
FIn1 := newIn1; calc;
end;
...
end.
59
60. Основная программа
Объектно-ориентированное программированиеОсновная программа
program logic;
{$mode objfpc}
uses log_elem ;
var elNot: TNot;
elAnd: TAnd;
...
begin
elNot := TNot.Create;
elAnd := TAnd.Create;
...
end.
unit log_elem ;
{$mode objfpc}
interface
{ доступно другим модулям }
...
implementation
{ скрыто от других модулей }
...
end.
60
61. Обмен данными между объектами
Объектно-ориентированное программирование61
Обмен данными между объектами
«И»
«НЕ»
&
1
? Как может один объект
передать данные другому?
2
• объект 1 должен «знать» адрес объекта 2
• у объекта 1 должен быть метод, доступный
объекту 2, с помощью которого он может
передать данные
62. Обмен данными между объектами
Объектно-ориентированное программированиеОбмен данными между объектами
TLogElement = class
private
FNextEl: TLogElement; { адрес объект 2 }
FNextIn: integer;
{ номер входа объекта 2 }
...
public
procedure Link(nextElement: TLogElement;
nextIn: integer);
...
end;
метод для установки связи выхода
с входом другого элемента
62
63. Обмен данными между объектами
Объектно-ориентированное программированиеОбмен данными между объектами
procedure TLogElement.Link
(nextElement: TLogElement;
nextIn: integer);
begin
запомнить адрес и
FNextEl := nextElement;
номер входа
FNextIn := nextIn;
следующего элемента
end;
? Когда нужно передать данные «следующему»?
63
64. Обмен данными между объектами
Объектно-ориентированное программированиеОбмен данными между объектами
procedure TLogElement.setIn1(newIn1: boolean);
begin
FIn1 := newIn1;
если связь
calc;
установлена…
if FNextEl <> nil then
case FNextIn of
1: FNextEl.In1 := res;
передать новые
2: FNextEl.In2 := res;
данные
end;
end;
аналогично для setIn2…
? Почему не включить передачу в метод calc?
64
65. Обмен данными между объектами
Объектно-ориентированное программированиеОбмен данными между объектами
elNot := TNot.Create;
установить
elAnd := TAnd.Create;
связь
elAnd.Link(elNot, 1);
...
for A:=False to True do begin
elAnd.In1 := A;
for B:=False to True do begin
elAnd.In2 := B;
...
end;
объект elAnd САМ сообщает объекту
end;
elNot, что его выход изменился
65
Программирование