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

Содержание

Объектно-ориентированное программирование 7.1 Что такое ООП?

Слайд 1Объектно-ориентированное программирование
7.1 Что такое ООП?
7.2 Объекты и классы
7.3 Скрытие внутреннего устройства

объектов
7.4 Иерархия классов

Слайд 2Объектно-ориентированное программирование
7.1 Что такое ООП?


Слайд 3Направления развития ПО
переход от расчетов по формулам к сложным задачам моделирования

систем
увеличение объемов обрабатываемых данных
повышение сложности программ, увеличение их длины (до миллионов строк!)

В итоге:
коллективная разработка
каждый делает свою часть независимо от других
части программы легко «собрать» вместе


Слайд 4Борьба со сложностью
«Техника борьбы со сложностью известна с античных времен: “Divide

et impera” (разделяй и властвуй)».
Э. Дейкстра

подзадача 1

подзадача 3

подзадача 2.1

подзадача 2.2

подзадача 2.3

задача

подзадача 2

Декомпозиция – это разбиение системы на подсистемы, каждая из которых может изучаться отдельно.

Алгоритмическая декомпозиция

> 100 000 строк???


Слайд 5Объектный подход
Люди воспринимают мир, состоящий из объектов (Р. Декарт).


Слайд 6Абстракция
Абстракция – это выделение существенных характеристик объекта, отличающих его от других

объектов.


Иллюстрация из книги Г. Буч, Объектно-ориентированный анализ и проектирование с примерами приложений на С++.


Слайд 7Абстракция в программировании
программа – это множество взаимодействующих объектов (моделей)
объекты имеют свойства

и поведение
объекты не «знают» внутреннее устройство других объектов



А

Б

В

Г

Объектная
декомпозиция


Слайд 8Абстракция в программировании
Б
В
Верхний уровень:
определить, ЧТО делает каждый объект
определить ИНТЕРФЕЙС –

способ обмена данными между объектами

Б

В

интерфейс

Нижний уровень:
определить, КАК работают объекты

интерфейс


интерфейс


Слайд 9
Что такое ООП?
Программирование, основанное на моделировании задачи реального мира как множества

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

уточнение следует…



Слайд 10Объектно-ориентированное программирование
7.2 Объекты и классы


Слайд 11Объектно-ориентированный анализ (ООА)
Задачи:
выделить взаимодействующие объекты
определить их существенные свойства


описать команды, которые объекты

могут выполнить (поведение)

Слайд 12Что такое объект?
Объектом можно назвать то, что имеет четкие границы и

обладает состоянием и поведением.

Примеры:

«Подпрыгни!»

«Пли!»


Слайд 13Объектная модель: пример

Объекты:
дорога
машины
светофоры

Класс – это множество объектов, имеющих общую структуру и

общее поведение.

Классы объектов: Дорога, Машина


Слайд 14Объектная модель: класс Дорога



название класса

свойства
поведение
(команды, методы)


Слайд 15Объектная модель: класс Машина



Метод – это процедура или функция, принадлежащая классу

объектов.

метод



Слайд 16Класс Дорога в программе
type TRoad = class
Length:

real;
Width: integer;
end;


поля

Поле – это переменная, принадлежащая объекту.

Объявление (описание) класса:

Аналогия: чертёж детали.

от type


Слайд 17Класс Дорога в программе
var road: TRoad;
Переменная для работы с объектом:
адрес

12345

Ссылка – это переменная, в которую можно записать адрес объекта заданного типа.

road := TRoad.Create;

Конструктор – это метод класса, который вызывается для создания объектов этого класса.

?



Слайд 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;


end;

constructor Create(length0: real;
width0: integer);


Слайд 20Новый конструктор
Реализация (программа) конструктора:
constructor TRoad. Create(length0: real;

width0: integer);
begin
if length0 > 0 then
Length := length0
else Length := 1;
if width0 > 0 then
Width := width0
else Width := 1;
end;

Length := length0;
Width := width0;

TRoad.

метод класса TRoad


Слайд 21Класс Машина в программе
type TCar = class
X,

V: real; { координата, скорость }
Y: integer; { номер полосы }
road: TRoad; { ссылка на дорогу }
procedure move; { двигаться вперед }
end;

адрес объекта класса Дорога

road: TRoad;


Слайд 22Класс Машина в программе
procedure TCar.move;
begin
X := X + V; {

при Δt = 1 }
if X > road.Length then
X := 0; { «перескочить» в начало }
end;

Равномерное движение:

V – перемещение за 1 интервал.

длина дороги, по которой едет машина


Слайд 23Класс Машина в программе
type TCar = class
...


constructor Create(road: TRoad;
y0: integer; v0: real);
end;

Добавление конструктора:

адрес дороги

полоса

скорость


Слайд 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.

Слайд 25Плюсы и минусы ООП
основная программа простая и понятная
каждый класс может разрабатывать

отдельный программист независимо
можно использовать готовые классы в других программах

увеличение длины полной программы (с учетом описания классов)
замедление работы


Слайд 26Объектно-ориентированное программирование
7.3 Скрытие внутреннего устройства объектов


Слайд 27Зачем скрывать внутреннее устройство?
Иллюстрация из книги Г. Буч, Объектно-ориентированный анализ и

проектирование с примерами приложений на С++.

борьба со сложностью
безопасность внутренних данных
возможность изменять «внутренности», не меняя интерфейс


Слайд 28Инкапсуляция
Инкапсуляция («помещение в капсулу») – это скрытие внутреннего устройства объектов от

других объектов.

Класс Перо (цвет и стиль линий):

type TPen = class
color: string;
end;

'FF00FF'

var pen: TPen;
...
pen := TPen.Create;
pen.color := '#%';
writeln(pen.color);

доступно всем!


Слайд 29Инкапсуляция
Скрытие полей:
type TPen = class
private

FColor: string;
end;

от Field – «поле»

частный, закрытый

F

private

pen.color := 'FFFF00';
writeln(pen.color);



Слайд 30Методы доступа к полю
type TPen = class
private

FColor: string;
public
function getColor: string;
procedure setColor(newColor: string);
end;

общедоступный

public

метод чтения

function getColor: string;

procedure setColor(newColor: string);

метод записи

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


Слайд 31TPen
Методы доступа к полю
function TPen.getColor: string;
begin
Result := FСolor;
end;
procedure

TPen.setColor(newColor: integer);
begin
FColor := newColor;
end;

getColor

setColor

FColor

другой
объект


методы

поле


Слайд 32Проверка при изменении поля
procedure TPen.setColor(newColor: integer);
begin
if { ошибочное значение }

then
FColor := '000000' { чёрный цвет }
else FColor := newColor;
end;

В случае ошибочного значения установить черный цвет:

Length(newColor) <> 6

pen.setColor('FF00'); { ошибка: черный }
pen.setColor('FFFF00'); { запись }
writeln(pen.getColor); { чтение }

Использование:


Слайд 33Свойство
pen.сolor := 'FFFF00'; { запись }
writeln(pen.color); { чтение }
Свойство –

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

TPen

FColor

другой
объект

color





getColor

setColor

методы

поле

свойство


Слайд 34Свойство
type TPen = class
private

FColor: string;
function getColor: string ;
procedure setColor(newColor: string );
public
property сolor: string
read getColor write setColor;
end;

свойство

property

pen.сolor := 'FFFF00'; { запись }
writeln(pen.color); { чтение }

string

string

string

тип свойства

getColor

getColor

метод чтения

setColor

setColor

метод записи


Слайд 35Изменяем способ хранения данных
FColor: string;
FColor: integer;

'FF00FF'
FF00FF16 = 16711935

'001234'
123416 = 4460

'0000A5'
A516 =

165




реализация

интерфейс


Слайд 36Изменяем способ хранения данных
function TPen.getColor: string;
begin
Result := IntToHex (FColor,6);
end;
procedure TPen.setColor(newColor:

string);
begin
if Length(newColor) <> 6 then
FColor := 0 { чёрный цвет }
else
FColor := StrToInt ('$' + newColor);
end;

IntToHex

X10 → X16 (строка)

6 знаков: '0000FF'

StrToInt

строка → число

шестнадцатеричное


Слайд 37Свойства «только для чтения»
type TCar = class
private

Fv: real;
...
public
property v: real read Fv;
...
end;

property v: real read Fv;

свойство «только для чтения»


Слайд 38Скрытие внутреннего устройства: итог
защита данных объекта
изменение внутреннего устройства не требует изменения

других объектов, если сохранить интерфейс

длина программы ↑
замедление работы


Слайд 39Объектно-ориентированное программирование
7.4 Иерархия классов


Слайд 40Классификации
Фото: www.statesymbolsusa.org, xenianova.files.wordpress.com, spoon.com.ua, gerbl.ru
Фрукт
сочный съедобный плод дерева или кустарника
базовый класс

классы-наследники
Яблоко

– это разновидность фруктов.
Яблоко наследует все свойства фруктов.

Слайд 41Примеры наследования свойств
Человек
Работник школы
Ученик
Родитель
Администратор
Учитель
Технический работник
Директор
Завуч
Уборщик
Слесарь
Электрик
базовый класс


Слайд 42Что такое наследник?
Класс Б является наследником класса А, если можно сказать,

что Б – это разновидность А.


водоем

озеро

осёл

животное

цветок

ромашка

автомобиль

двигатель

автомобиль

грузовик

косточка

ягода



Слайд 43Иерархия логических элементов
Логический элемент
с одним входом
с двумя входами
НЕ
И
ИЛИ


Слайд 44Определение ООП
Объектно-ориентированное программирование – это такой подход к программированию, при котором


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

Слайд 45Класс «Логический элемент»
type
TLogElement = class
In1, In2: boolean;

Res: boolean;
procedure calc;
end;

Сравните (плюсы, минусы):

type
TLogElement = class
In1, In2: boolean;
function res: boolean;
end;

вычислить результат при изменении входов

вычислить результат по известным входам


Слайд 46Скрываем данные (инкапсуляция)
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Процедура изменения входа
procedure TLogElement.setIn1(newIn1: boolean);
begin
FIn1 := newIn1;
calc;
end;
Проблемы:
как написать

метод calc?
для элемента «НЕ» доступ ко второму входу не нужен!

Слайд 48Метод calc
невозможно написать для базового класса


разный у всех логических элементов
наследники должны

его переопределять!


недоступен для других объектов

Абстрактный метод – это метод, который объявляется, но не реализуется в классе.

Виртуальный метод – это метод, который могут переопределять классы-наследники.


Слайд 49Метод calc
type
TLogElement = class
private
...

protected
procedure calc; virtual; abstract;
public
...
end;

procedure calc; virtual; abstract;

protected

виртуальный

абстрактный

защищенный

Абстрактный класс – это класс, содержащий абстрактный метод («фрукт»).


Слайд 50Как «скрыть» свойство In2?
type
TLogElement = class
private
...
protected
property In2: boolean

read FIn2 write setIn2;
procedure calc; virtual; abstract;
public
...
end;

property In2: boolean read FIn2 write setIn2;


Слайд 51Классы-наследники: TNot
type
TNot = class(TLogElement)
procedure calc; override;
end;
override;
переопределить
наследник

от …

procedure TNot.calc;
begin
FRes := not FIn1;
end;


Слайд 52Классы-наследники: TLog2In
TLog2In = class(TLogElement)
public
property In2;
end;
свойство становится общедоступным
наследник от …


Слайд 53Классы-наследники: TAnd
type
TAnd = class(TLog2In)
procedure calc; override;
end;
override;
переопределить
наследник

от …

procedure TAnd.calc;
begin
FRes := FIn1 and FIn2;
end;


Слайд 54Вернемся к setIn1…
procedure
TLogElement.setIn1 (newIn1: boolean);
begin
FIn1 :=

newIn1;
calc;
end;

calc;

какой метод вызывается?

вызвать процедуру = перейти по заданному адресу памяти
в классе TLogElement метод calc не реализован (нет кода, нет адреса)
каждый наследник имеет свой метод calc


Слайд 55Обычный вызов процедуры
...
calc;
...
...
call AB12
...
Паскаль
Ассемблер

процедура
AB12 ...
AB14 ...
AB16 ...
...

Статическое связывание: адрес процедуры известен

и сразу записывается в машинный код!

Слайд 56Динамическое связывание (при выполнении)
...
calc;
...
Паскаль

TNot.calc
методы классов
TAnd.calc
TOr.calc



виртуальный метод
Виртуальный метод – это метод базового

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

Слайд 57Основная программа («И-НЕ»)
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;
end;
end.

| A | B | not(A&B)
------------------
| 0 | 0 | 1
| 0 | 1 | 1
| 1 | 0 | 1
| 1 | 1 | 0


Слайд 58Классы – в модуль!
unit log_elem;
{$mode objfpc}
interface { доступно

другим модулям }
type
TLogElement = class
...
end;
... { объявление всех классов }
implementation { скрыто от других модулей }
procedure TLogElement.setIn1(newIn1: boolean);
begin
FIn1 := newIn1; calc;
end;
...
end.

interface

implementation

режим работы с объектами


Слайд 59Основная программа
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.

log_elem

log_elem



Слайд 60Обмен данными между объектами



&
«И»
«НЕ»

1
2
объект 1 должен «знать» адрес объекта 2
у объекта

2 должен быть метод, доступный объекту 2, с помощью которого он может передать данные

Слайд 61Обмен данными между объектами
TLogElement = class
private
FNextEl: TLogElement; {

адрес объект 2 }
FNextIn: integer; { номер входа объекта 2 }
...
public
procedure Link(nextElement: TLogElement;
nextIn: integer);
...
end;

метод для установки связи выхода с входом другого элемента


Слайд 62Обмен данными между объектами
procedure TLogElement.Link

(nextElement: TLogElement;
nextIn: integer);
begin
FNextEl := nextElement;
FNextIn := nextIn;
end;

запомнить адрес и номер входа следующего элемента


Слайд 63Обмен данными между объектами
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…


Слайд 64Обмен данными между объектами
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;
end;

elAnd.Link(elNot, 1);

объект elAnd САМ сообщает объекту elNot, что его выход изменился

установить связь


Слайд 65Конец фильма
ПОЛЯКОВ Константин Юрьевич
д.т.н., учитель информатики высшей категории,
ГОУ СОШ № 163,

г. Санкт-Петербург
kpolyakov@mail.ru

Обратная связь

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

Email: Нажмите что бы посмотреть 

Что такое ThePresentation.ru?

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


Для правообладателей

Яндекс.Метрика