'

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

Понравилась презентация – покажи это...





Слайд 0

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


Слайд 1

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


Слайд 2

Направления развития ПО 3 переход от расчетов по формулам к сложным задачам моделирования систем увеличение объемов обрабатываемых данных повышение сложности программ, увеличение их длины (до миллионов строк!) В итоге: коллективная разработка каждый делает свою часть независимо от других части программы легко «собрать» вместе


Слайд 3

Борьба со сложностью 4 «Техника борьбы со сложностью известна с античных времен: “Divide et impera” (разделяй и властвуй)». Э. Дейкстра подзадача 1 подзадача 3 подзадача 2.1 подзадача 2.2 подзадача 2.3 задача подзадача 2 Декомпозиция – это разбиение системы на подсистемы, каждая из которых может изучаться отдельно. Алгоритмическая декомпозиция > 100 000 строк???


Слайд 4

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


Слайд 5

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


Слайд 6

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


Слайд 7

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


Слайд 8

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


Слайд 9

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


Слайд 10

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


Слайд 11

Что такое объект? 12 Объектом можно назвать то, что имеет четкие границы и обладает состоянием и поведением. Примеры: «Подпрыгни!» «Пли!»


Слайд 12

Объектная модель: пример 13 Объекты: дорога машины светофоры … Класс – это множество объектов, имеющих общую структуру и общее поведение. Классы объектов: Дорога, Машина


Слайд 13

Объектная модель: класс Дорога 14 название класса свойства поведение (команды, методы)


Слайд 14

Объектная модель: класс Машина 15 Метод – это процедура или функция, принадлежащая классу объектов. метод


Слайд 15

Класс Дорога в программе 16 type TRoad = class Length: real; Width: integer; end; поля Поле – это переменная, принадлежащая объекту. Объявление (описание) класса: Аналогия: чертёж детали. от type


Слайд 16

Класс Дорога в программе 17 var road: TRoad; Переменная для работы с объектом: адрес 12345 Ссылка – это переменная, в которую можно записать адрес объекта заданного типа. road := TRoad.Create; Конструктор – это метод класса, который вызывается для создания объектов этого класса. ?


Слайд 17

Создание объекта 18 type TRoad = class Length: real; Width: integer; end; var road: TRoad; begin road := TRoad.Create; road.Length := 60; road.Width := 3; end. описание класса переменная-ссылка вызов конструктора значения полей


Слайд 18

Новый конструктор 19 Цель – определить начальные значения при создании объекта. road := TRoad.Create (60, 3); длина ширина Описание класса: type TRoad = class Length: real; Width: integer; end; constructor Create(length0: real; width0: integer);


Слайд 19

Новый конструктор 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


Слайд 20

Класс Машина в программе 21 type TCar = class X, V: real; { координата, скорость } Y: integer; { номер полосы } road: TRoad; { ссылка на дорогу } procedure move; { двигаться вперед } end; адрес объекта класса Дорога road: TRoad;


Слайд 21

Класс Машина в программе 22 procedure TCar.move; begin X := X + V; { при ?t = 1 } if X > road.Length then X := 0; { «перескочить» в начало } end; Равномерное движение: V – перемещение за 1 интервал. длина дороги, по которой едет машина


Слайд 22

Класс Машина в программе 23 type TCar = class ... constructor Create(road: TRoad; y0: integer; v0: real); end; Добавление конструктора: адрес дороги полоса скорость


Слайд 23

Основная программа моделирования 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 Объектно-ориентированное программирование 7.3 Скрытие внутреннего устройства объектов


Слайд 26

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


Слайд 27

Инкапсуляция 28 Инкапсуляция («помещение в капсулу») – это скрытие внутреннего устройства объектов от других объектов. Класс Перо (цвет и стиль линий): type TPen = class color: string; end; 'FF00FF' var pen: TPen; ... pen := TPen.Create; pen.color := '#%'; writeln(pen.color); доступно всем!


Слайд 28

Инкапсуляция 29 Скрытие полей: type TPen = class private FColor: string; end; от Field – «поле» частный, закрытый F private pen.color := 'FFFF00'; writeln(pen.color);


Слайд 29

Методы доступа к полю 30 type TPen = class private FColor: string; public function getColor: string; procedure setColor(newColor: string); end; общедоступный public метод чтения function getColor: string; procedure setColor(newColor: string); метод записи Метод чтения: функция без параметров возвращает значение того же типа, что и поле Метод записи: процедура принммает значение того же типа, что и поле


Слайд 30

TPen Методы доступа к полю 31 function TPen.getColor: string; begin Result := FСolor; end; procedure TPen.setColor(newColor: integer); begin FColor := newColor; end; getColor setColor FColor другой объект методы поле


Слайд 31

Проверка при изменении поля 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); { чтение } Использование:


Слайд 32

Свойство 33 pen.сolor := 'FFFF00'; { запись } writeln(pen.color); { чтение } Свойство – это способ доступа к внутреннему состоянию объекта, имитирующий обращение к его внутренней переменной. TPen FColor другой объект color getColor setColor методы поле свойство


Слайд 33

Свойство 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 метод записи


Слайд 34

Изменяем способ хранения данных 35 FColor: string; FColor: integer; 'FF00FF' FF00FF16 = 16711935 '001234' 123416 = 4460 '0000A5' A516 = 165 реализация интерфейс


Слайд 35

Изменяем способ хранения данных 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 строка ? число шестнадцатеричное


Слайд 36

Свойства «только для чтения» 37 type TCar = class private Fv: real; ... public property v: real read Fv; ... end; property v: real read Fv; свойство «только для чтения»


Слайд 37

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


Слайд 38

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


Слайд 39

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


Слайд 40

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


Слайд 41

Что такое наследник? 42 Класс Б является наследником класса А, если можно сказать, что Б – это разновидность А. водоем озеро осёл животное цветок ромашка автомобиль двигатель автомобиль грузовик косточка ягода


Слайд 42

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


Слайд 43

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


Слайд 44

Класс «Логический элемент» 45 type TLogElement = class In1, In2: boolean; Res: boolean; procedure calc; end; Сравните (плюсы, минусы): type TLogElement = class In1, In2: boolean; function res: boolean; end; вычислить результат при изменении входов вычислить результат по известным входам


Слайд 45

Скрываем данные (инкапсуляция) 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; читать прямо из поля свойство «только для чтения»


Слайд 46

Процедура изменения входа 47 procedure TLogElement.setIn1(newIn1: boolean); begin FIn1 := newIn1; calc; end; Проблемы: как написать метод calc? для элемента «НЕ» доступ ко второму входу не нужен!


Слайд 47

Метод calc 48 невозможно написать для базового класса разный у всех логических элементов наследники должны его переопределять! недоступен для других объектов Абстрактный метод – это метод, который объявляется, но не реализуется в классе. Виртуальный метод – это метод, который могут переопределять классы-наследники.


Слайд 48

Метод calc 49 type TLogElement = class private ... protected procedure calc; virtual; abstract; public ... end; procedure calc; virtual; abstract; protected виртуальный абстрактный защищенный Абстрактный класс – это класс, содержащий абстрактный метод («фрукт»).


Слайд 49

Как «скрыть» свойство In2? 50 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;


Слайд 50

Классы-наследники: TNot 51 type TNot = class(TLogElement) procedure calc; override; end; override; переопределить наследник от … procedure TNot.calc; begin FRes := not FIn1; end;


Слайд 51

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


Слайд 52

Классы-наследники: TAnd 53 type TAnd = class(TLog2In) procedure calc; override; end; override; переопределить наследник от … procedure TAnd.calc; begin FRes := FIn1 and FIn2; end;


Слайд 53

Вернемся к setIn1… 54 procedure TLogElement.setIn1 (newIn1: boolean); begin FIn1 := newIn1; calc; end; calc; какой метод вызывается? вызвать процедуру = перейти по заданному адресу памяти в классе TLogElement метод calc не реализован (нет кода, нет адреса) каждый наследник имеет свой метод calc


Слайд 54

Обычный вызов процедуры 55 ... calc; ... ... call AB12 ... Паскаль Ассемблер процедура AB12 ... AB14 ... AB16 ... ... Статическое связывание: адрес процедуры известен и сразу записывается в машинный код!


Слайд 55

Динамическое связывание (при выполнении) 56 ... calc; ... Паскаль TNot.calc методы классов TAnd.calc TOr.calc виртуальный метод Виртуальный метод – это метод базового класса, который могут переопределить классы-наследники так, что конкретный адрес вызываемого метода определяется только при выполнении программы.


Слайд 56

Основная программа («И-НЕ») 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


Слайд 57

Классы – в модуль! 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 режим работы с объектами


Слайд 58

Основная программа 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


Слайд 59

Обмен данными между объектами 60 & «И» «НЕ» 1 2 объект 1 должен «знать» адрес объекта 2 у объекта 2 должен быть метод, доступный объекту 2, с помощью которого он может передать данные


Слайд 60

Обмен данными между объектами 61 TLogElement = class private FNextEl: TLogElement; { адрес объект 2 } FNextIn: integer; { номер входа объекта 2 } ... public procedure Link(nextElement: TLogElement; nextIn: integer); ... end; метод для установки связи выхода с входом другого элемента


Слайд 61

Обмен данными между объектами 62 procedure TLogElement.Link (nextElement: TLogElement; nextIn: integer); begin FNextEl := nextElement; FNextIn := nextIn; end; запомнить адрес и номер входа следующего элемента


Слайд 62

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


Слайд 63

Обмен данными между объектами 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, что его выход изменился установить связь


Слайд 64

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


×

HTML:





Ссылка: