118
01 TIKTOKCOACH.RU Проектирование программного обеспечения ОмГУ ФКН 2013

ооп

Embed Size (px)

Citation preview

Page 1: ооп

01 TIKTOKCOACH.RU

Проектирование программного обеспечения

ОмГУ ФКН 2013

Page 2: ооп

02 TIKTOKCOACH.RU

Преподаватель

Тюменцев Евгений

Page 3: ооп

03 TIKTOKCOACH.RU

Объектная модель

• абстракция

• инкапсуляция

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

• иерархия

• типизация

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

• сохраняемость

Page 4: ооп

04 TIKTOKCOACH.RU

Объектная модель

• абстракция

• инкапсуляция

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

• иерархия

• типизация

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

• сохраняемость

Page 5: ооп

05 TIKTOKCOACH.RU

Заблуждение

Абстракция = класс

Page 6: ооп

06 TIKTOKCOACH.RU

Правило 7±2

The magical Number Seven,

Plus or Minus Two

СЛЕДСТВИЕ: Чтобы удержать в памяти большее количество предметов, человек разбивает их на логические группы

Джордж Миллер

Page 7: ооп

07 TIKTOKCOACH.COM

Абстракция

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

(Гради Буч)

Page 8: ооп

08 TIKTOKCOACH.RU

Что дает абстракция?

Система понятий, с помощью которых можно описать некоторую область

Page 9: ооп

09 TIKTOKCOACH.RU

Примеры абстракций

Сфера применения

• Процедурное программирование

Абстракция

• Процедура

Page 10: ооп

10 TIKTOKCOACH.COM

Примеры абстракций

Сфера применения

• Процедурное программирование

• ООП

Абстракция

• Процедура

• Класс

Page 11: ооп

11 TIKTOKCOACH.RU

Примеры абстракций

Сфера применения

• Процедурное программирование

• ООП

• Предметная область

Абстракция

• Процедура

• Класс

• Абстракция сущности

Page 12: ооп

12 TIKTOKCOACH.RU

Примеры абстракций

Сфера применения

• Процедурное программирование

• ООП

• Предметная область

• Многопоточное программирование

Абстракция

• Процедура

• Класс

• Абстракция сущности

• Поток

Page 13: ооп

13 TIKTOKCOACH.RU

Что такое объекты?

Page 14: ооп

14 TIKTOKCOACH.RU

Принципы мышления

Группировка Обобщение

Page 15: ооп

15 TIKTOKCOACH.RU

Обобщение через полиморфизм

Указатель на функцию: одно и то же имя может означать разные функции одной сигнатуры

Page 16: ооп

16 TIKTOKCOACH.RU

Определение ООП

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

Гради Буч

Page 17: ооп

17 TIKTOKCOACH.RU

Чем может помочь ООП?

Естественный язык

Слово

Правила

Жанры

Приемы

Теорема Ферма

Война и Мир

ООП

Класс

Синтаксис

Архитектура

Паттерны

Высокие нагрузки

Операционная система

Page 18: ооп

18 TIKTOKCOACH.RU

ООП – это инструмент

Необходимое vs достаточное

Page 19: ооп

19 TIKTOKCOACH.RU

Особенности абстракций

Page 20: ооп

20 TIKTOKCOACH.RU

Сюрпризы абстракций

Реальный объект

• Вещественное число

Абстракция

• Число с плавающей точкой

Page 21: ооп

21 TIKTOKCOACH.RU

Сюрпризы абстракций

Реальный объект

• Вещественное число

• Денежная единица

Абстракция

• Число с плавающей точкой

• Число с плавающей точкой

Page 22: ооп

22 TIKTOKCOACH.RU

Сюрпризы абстракций

Реальный объект

• Вещественное число

• Денежная единица

• Квадрат

Абстракция

• Число с плавающей точкой

• Число с плавающей точкой

• Класс квадрат

Page 23: ооп

23 TIKTOKCOACH.RU

Сюрпризы абстракций

Реальный объект

• Вещественное число

• Денежная единица

• Квадрат

• Бизнес-операция

Абстракция

• Число с плавающей точкой

• Число с плавающей точкой

• Класс квадрат

• Процедура

Page 24: ооп

24 TIKTOKCOACH.RU

Группировка идей сверху вниз

Чтобы донести мысли до другого человека, нужно убедиться, что он группирует предметы так же как и Вы

Page 25: ооп

25 TIKTOKCOACH.RU

Мышление «снизу вверх»

Page 26: ооп

26 TIKTOKCOACH.RU

Пример: список покупок

Мука

Молоко

Батарейки

Морковь

Апельсины

Хлеб

Масло

Яблоки

Ручка

Сок

Детская игрушка

Картофель

Детские тетради

Сметана

Сахар

Виноград

Вода

Page 27: ооп

27 TIKTOKCOACH.RU

Группировка

Батарейки Детские тетради Ручка Вода Сок Сахар Морковь Апельсины Яблоки Виноград Картофель

Масло

Хлеб

Молоко

Сметана

Мука

Детская игрушка

Page 28: ооп

28 TIKTOKCOACH.RU

Что такое хорошая абстракция?

Martin Fauler Рефакторинг

Page 29: ооп

29 TIKTOKCOACH.COM

The Open-Closed Principle

Rob Martin (Uncle Bob)

Page 30: ооп

30 TIKTOKCOACH.RU

Программные объекты должны быть открыты для расширения, но в тоже время закрыты для модификации

Page 31: ооп

31 TIKTOKCOACH.RU

Открытые vs закрытые

• Полиморфная операция

Page 32: ооп

32 TIKTOKCOACH.RU

Открытые vs закрытые

• Полиморфная операция

• Паттерны

Page 33: ооп

33 TIKTOKCOACH.RU

Открытые vs закрытые

• Полиморфная операция

• Паттерны

• DI контейнеры

Page 34: ооп

34 TIKTOKCOACH.RU

Открытые vs закрытые

• Полиморфная операция

• Паттерны

• DI контейнеры

• Код, ген. по метаописанию

Page 35: ооп

35 TIKTOKCOACH.RU

Открытые vs закрытые

• Полиморфная операция

• Паттерны

• DI контейнеры

• Код, ген. по метаописанию

• switch

• If /else – if/else

Page 36: ооп

36 TIKTOKCOACH.RU

Открытые vs закрытые

• Полиморфная операция

• Паттерны

• DI контейнеры

• Код, ген. по метаописанию

• switch

• If /else – if/else

• Неполиморфная операция

Page 37: ооп

37 TIKTOKCOACH.RU

Открытые vs закрытые

• Полиморфная операция

• Паттерны

• DI контейнеры

• Код, ген. по метаописанию

• switch

• If /else – if/else

• Неполиморфная операция

• операторы приведения типа

Page 38: ооп

38 TIKTOKCOACH.RU

Открытые vs закрытые

• Полиморфная операция

• Паттерны

• DI контейнеры

• Код, ген. по метаописанию

• switch

• If /else – if/else

• Неполиморфная операция

• операторы приведения типа

Page 39: ооп

39 TIKTOKCOACH.RU

Открытые vs закрытые

• Полиморфная операция

• Паттерны

• DI контейнеры

• Код, ген. по метаописанию

• switch

• If /else – if/else

• Неполиморфная операция

• операторы приведения типа

• enum

Page 40: ооп

40 TIKTOKCOACH.RU

Открытые vs закрытые

• Полиморфная операция

• Паттерны

• DI контейнеры

• Код, ген. по метаописанию

• …

• Магические константы

Page 41: ооп

41 TIKTOKCOACH.RU

Открытые vs закрытые

• Полиморфная операция

• Паттерны

• DI контейнеры

• Код, ген. по метаописанию

• …

• Магические константы

• Copy-paste

Page 42: ооп

42 TIKTOKCOACH.RU

Открытые vs закрытые

• Полиморфная операция

• Паттерны

• DI контейнеры

• Код, ген. по метаописанию

• …

• Магические константы

• Copy-paste

• Public поля

• …

Page 43: ооп

43 TIKTOKCOACH.RU

Открытые vs закрытые

• Полиморфная операция

• Паттерны

• DI контейнеры

• Код, ген. по метаописанию

• …

• Магические константы

• Copy-paste

• Public поля

• Глобальные переменные

Page 44: ооп

44 TIKTOKCOACH.RU

Код открыт на 100%: возможно?

Page 45: ооп

45 TIKTOKCOACH.RU

Стратегическая замкнутость

Архитектура

Открытые конструкции

Page 46: ооп

46 TIKTOKCOACH.RU

Вопросы

Page 47: ооп

47 TIKTOKCOACH.RU

Об истории - 1

Page 48: ооп

48 TIKTOKCOACH.RU

Об истории - 2

Page 49: ооп

49 TIKTOKCOACH.RU

Об истории - 3

Page 50: ооп

50 TIKTOKCOACH.RU

Об истории - 4

Page 51: ооп

51 TIKTOKCOACH.RU

Открытость: где предел?

Ассемблер –> if, for, switch

Алгоритмы -> процедуры

Процедуры -> классы

Собственный код -> библиотеки

Компьютер -> облако

4

Page 52: ооп

52 TIKTOKCOACH.RU

Аргументы

Нижний

Скорость,

контроль,

доп. возможности

Верхний

гибкость,

продуктивность

Page 53: ооп

53 TIKTOKCOACH.RU

Рефакторинг vs дублирование кода //ушел он ночью, но уже на другой день

если час (ТекСтрокаРабочиеЧасы.МоментВыхода) < Константы.НачалоДневныхЧасов.Получить() и час (ТекСтрокаРабочиеЧасы.МоментВхода) < Константы.НачалоДневныхЧасов.Получить()

тогда

//он пришел утром и ушел следующим утром

МоментПерехода = началоДня(ТекСтрокаРабочиеЧасы.МоментВхода);

МоментПерехода = МоментПерехода + (Константы.НачалоДневныхЧасов.Получить()) * 3600;

НочныеЧасы = НочныеЧасы + (МоментПерехода - ТекСтрокаРабочиеЧасы.МоментВхода) / 3600;

МоментПереходаВНочь = началоДня(ТекСтрокаРабочиеЧасы.МоментВхода);

МоментПереходаВНочь = МоментПереходаВНочь + (Константы.НачалоНочныхЧасов.Получить()) * 3600;

ДневныеЧасы = ДневныеЧасы + (МоментПереходаВНочь - МоментПерехода) / 3600;

НочныеЧасы = НочныеЧасы + (НачалоСледующегоДня - МоментПереходаВНочь) / 3600

иначе

//он пришел вечером

НочныеЧасы = НочныеЧасы + (НачалоСледующегоДня - 1 - ТекСтрокаРабочиеЧасы.МоментВхода) / 3600;

КонецЕсли;

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

3

Page 54: ооп

54 TIKTOKCOACH.RU

Почему?

Дублирование выходит за рамки применяемой платформы

Page 55: ооп

55 TIKTOKCOACH.RU

Почему?

Дублирование выходит за рамки применяемой платформы

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

Page 56: ооп

55 TIKTOKCOACH.COM

Эффект Даннинга-Крюгера

Page 57: ооп

57 TIKTOKCOACH.RU

Зачем рефакторинг?

Группировка Обобщение

общее понимание

1

Page 58: ооп

58 TIKTOKCOACH.RU

Исчисление предикатов

∀𝑥∃𝑦 𝑃(𝑥, 𝑦)

Page 59: ооп

59 TIKTOKCOACH.RU

Теорема дедукции

𝞒, 𝐴 ⊦𝐿 𝐵 ↔ 𝞒 ⊦𝐿 𝐴 → 𝐵

Page 60: ооп

60 TIKTOKCOACH.RU

Теория второго порядка

∀𝑓∃𝑦 𝑃(𝑓(𝑦))

Page 61: ооп

61 TIKTOKCOACH.RU

Логика Хоара

Тройка Хоара {pred} statement {post}

Пример: Чарльз Хоар

{x+1 == 43} y=x+1; {y == 43 ^ x == 42}

Page 62: ооп

62 TIKTOKCOACH.RU

Аксиомы и правила логики Хоара

Аксиома пустого оператора {P} skip {P} Аксиома присваивания {P[E/x]} x := E {P} Правило композиции {P} S {Q}, {Q} T {R} ╞ {P} S;T {R} Правило условного оператора {B ^ P} S {Q}, {B’ ^P} T {Q} ╞ {P} if B then S else T endif {Q} Правило вывода P1 → P, {P} S {Q}, Q → Q1 ╞ {P1} S {Q1} Правило оператора цикла {P ^ B} S {P} ╞ {P} while B do S done {B’ ^ P}

Page 63: ооп

63 TIKTOKCOACH.RU

Два подхода к параллельности

• CSP

• Модель акторов

Page 64: ооп

64 TIKTOKCOACH.RU

Какой язык лучше?

На языке, который содержит операцию ветвления и цикл, можно реализовать любой алгоритм

Page 65: ооп

65 TIKTOKCOACH.RU

Контрактное программирование

Инвариант Предусловие Постусловие

Page 66: ооп

66 TIKTOKCOACH.RU

Следствия

Конструктор используется для инвариантов класса

Page 67: ооп

67 TIKTOKCOACH.RU

Следствия - 2

Конструктор используется для инвариантов класса

При нарушении условия выбрасывается исключение

Page 68: ооп

68 TIKTOKCOACH.RU

Следствия - 3

Конструктор используется для инвариантов класса

При нарушении условия выбрасывается исключение

Техника RAII

Page 69: ооп

69 TIKTOKCOACH.RU

Следствия - 4

Конструктор используется для инвариантов класса

При нарушении условия выбрасывается исключение

Техника RAII

Модульное тестирование

Page 70: ооп

70 TIKTOKCOACH.RU

Модульное тестирование

Правило композиции

{P} S {Q}, {Q} T {R} ╞ {P} S;T {R}

2

Page 71: ооп

71 TIKTOKCOACH.RU

Контракт процедуры

• возможные типы входных данных и их значение;

• типы возвращаемых данных и их значение;

• условия возникновения исключений, их типы и значения;

• присутствие побочного эффекта;

• (иногда) качественные характеристики, такие как гарантии производительности, например, временная сложность или сложность по памяти

Page 72: ооп

73 TIKTOKCOACH.RU

Слабое, сильное условие

Page 73: ооп

73 TIKTOKCOACH.RU

P ^ Q ^ S

Page 74: ооп

74 TIKTOKCOACH.RU

«Реальные» объекты

Page 75: ооп

75 TIKTOKCOACH.RU

Ключевые идеи

• Косвенный вызов процедуры

• Пред- и постусловия процедур

• Грубо: Абстракция ООП – это набор процедур, предназначенных для совместного использования

Page 76: ооп

76 TIKTOKCOACH.RU

Контракт метода

• предусловия, которые могут быть ослаблены (но не усилены) в подклассах;

Page 77: ооп

77 TIKTOKCOACH.RU

Контракт метода

• предусловия, которые могут быть ослаблены (но не усилены) в подклассах;

• постусловия, которые могут быть усилены (но не ослаблены) в подклассах;

Page 78: ооп

78 TIKTOKCOACH.RU

Контракт метода

• предусловия, которые могут быть ослаблены (но не усилены) в подклассах;

• постусловия, которые могут быть усилены (но не ослаблены) в подклассах;

• инварианты, которые могут быть усилены (но не ослаблены) в подклассах;

Page 79: ооп

79 TIKTOKCOACH.RU

Принцип подстановки Лисков

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

Page 80: ооп

80 TIKTOKCOACH.RU

Нарушение принципа Лисков -1 void Draw(Shape s) {

if (s is Point) { DrawPoint(s as Point); } else if (s is Circle) { DrawCircle(s as Circle); } else if(s is Square) { DrawSquare(s as Square); }

}

Page 81: ооп

81 TIKTOKCOACH.RU

Нарушение принципа Лисков -2 class Rectangle { private double height; private double width; public double getHeight() { return height; } public void setHeight(int value) { height = value;} public double getWidth() { return width; } public void setWidth(int value) { width = value; } } …. void f(Rectangle r) { r.setHeight (5); r.setWidth (4); Debug.Assert(r.getHeight() * r.getWidth() == 20); }

class Square extends Rectangle { public void setHeight(int value) { super.setHeight(value); super.setWidth(value); } public void setWidth(int value) { super.setHeight(value); super.setWidth(value); } }

Page 82: ооп

82 TIKTOKCOACH.RU

Следствие

Построенные абстракции нельзя проверить на корректность сами по себе.

Page 83: ооп

83 TIKTOKCOACH.RU

Последствия

• Заранее построить очень гибкую модель “про запас” нельзя!

• Лучше использовать прототипирование

Page 84: ооп

84 TIKTOKCOACH.RU

Программа Copy - 1 void Copy() { int ch; while ((ch = Keyboard()) != EOF) { WritePrinter(c); } }

enum OutputDevice { printer, disk }; void Copy(OutputDevice dev) { int c; while ((c = ReadKeyboard()) != EOF) { if (dev == printer) WritePrinter(c); else WriteDisk(c); } }

Page 85: ооп

85 TIKTOKCOACH.RU

Программа Copy - 2

interface IReader

{

int Read();

}

interface IWriter

{

void Write(char) = 0;

}

void Copy(

IReader r,

IWriter w

)

{

int c;

while((c=r.Read()) != EOF)

w.Write(c);

}

Page 86: ооп

86 TIKTOKCOACH.RU

Схема зависимостей

Page 87: ооп

87 TIKTOKCOACH.RU

Принцип обращения зависимостей

Высокоуровневые компоненты не должны зависеть от низкоуровневых компонент. И те, и те должны зависеть от абстракций.

Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.

Page 88: ооп

88 TIKTOKCOACH.RU

Слои

Page 89: ооп

89 TIKTOKCOACH.RU

Лампочка - 1

class Lamp

{

public void TurnOn() {…}

public void TurnOff() {…}

}

class Button

{

private Lamp lamp;

public Button(Lamp lamp) {this.lamp = lamp;}

public void Detect()

{

if(GetPhisicalState()) lamp.TurnOn();

else lamp.TurnOff();

}

}

Page 90: ооп

90 TIKTOKCOACH.RU

Лампочка - 2 interface IButtonClient

{

void TurnOn();

void TurnOff();

}

class Button

{

private IButtonClient client;

public Button(IButtonClient client)

{ this.client = client; }

public void Detect()

{

if (GetPhisicalState()) client.TurnOn();

else client.TurnOff();

}

}

class Button

{

private Lamp lamp;

public Button(Lamp lamp) {this.lamp = lamp;}

public void Detect()

{

if(GetPhisicalState()) lamp.TurnOn();

else lamp.TurnOff();

}

}

Page 91: ооп

91 TIKTOKCOACH.RU

Следствия

• Сторонний код должен быть скрыт за обертками, реализующими собственные интерфейсы

• Обертки можно строить к старому наследуемому коду

• Переписывание не всегда самый лучший путь

Page 92: ооп

92 TIKTOKCOACH.RU

DI-контейнеры

В коде

new Circle(3,4, 10)

new Rectangle(0, 0, 10, 10)

Фабрика

Shape Create(ShapeType sType)

{

switch(sType)

{

case Circle: return new Circle(3,4, 10);

case Rec: new Rectangle(0, 0, 10, 10);

}

}

Page 93: ооп

93 TIKTOKCOACH.RU

«Обычное» unit-тестирование

Тестирование основанное на состояниях

Недостатки:

• Требует знания о внутреннем состоянии объекта –возможно нарушение инкапсуляции

• Нарушает принципы ООП

Page 94: ооп

94 TIKTOKCOACH.RU

Mock-объекты

Тестирование основанное на поведении –

• какие методы вызываются,

• в какой последовательности,

• какие результаты выдают

Mock-объект – прокси-объект, который определяет прошел ли тестируемый объект тест или нет

Page 95: ооп

95 TIKTOKCOACH.RU

Дверь и таймер -1

abstract class Door

{

abstract void Lock();

abstract void Unlock();

abstract bool IsDoorOpen() ;

}

Page 96: ооп

96 TIKTOKCOACH.RU

Дверь и таймер -2

abstract class Timer

{

abstract void Regsiter(int timeout, TimerClient client);

}

abstract class TimerClient

{

abstract void TimeOut();

}

Page 97: ооп

97 TIKTOKCOACH.RU

Дверь и таймер -3

Как правильно объединить две иерархи?

Page 98: ооп

98 TIKTOKCOACH.RU

Дверь и таймер - 4

abstract class Door: TimerClient {}

abstract class TimedDoor: Door{}

Page 99: ооп

99 TIKTOKCOACH.RU

Дверь и таймер - 5

class TimedDoorAdapter: TimerClient { private TimedDoor itsTimedDoor; public void TimeOut(int timeOutId) { itsTimedDoor.DoorTimeOut(timeOutId); } }

class TimedDoor : Door { public virtual void DoorTimeOut(int timeOutId); };

Page 100: ооп

100 TIKTOKCOACH.RU

Дверь и таймер - 6

interface Door

{

void Lock();

void Unlock();

bool IsDoorOpen() ;

}

class TimedDoor: Door, TImerClient

{}

interface Timer

{

void Regsiter(int timeout, TimerClient client);

}

interface TimerClient

{

interface void TimeOut();

}

Page 101: ооп

94 101KTOKCOACH.RU

Может быть проблема надумана?

Page 102: ооп

102 TIKTOKCOACH.RU

Принцип соответствия интерфейсов

Класс не должен зависеть от интерфейсов, которые он не использует

Page 103: ооп

103 TIKTOKCOACH.RU

Жирный интерфейс

Page 104: ооп

104 TIKTOKCOACH.RU

Жирный интерфейс

Page 105: ооп

105 TIKTOKCOACH.RU

Ответственность

Page 106: ооп

106 TIKTOKCOACH.RU

Принцип единой ответственности

Должна быть ровно одна причина для изменения класса

Page 107: ооп

107 TIKTOKCOACH.RU

Модульность

1. Какой наилучший критерий для разбиения на модули?

2. Какие отношения существуют между модулями и каким принципам они подчиняются?

3. Что первично класс или модуль?

4. Физическое представление модулей?

Page 108: ооп

108 TIKTOKCOACH.RU

Принцип эквивалентности

Единица повторного использования = единице релиза. Это единица называется пакетом.

Page 109: ооп

109 TIKTOKCOACH.RU

Повторное использование

Классы в пакете повторно используются совместно. То есть, если хотя бы один класс пакета повторно используется, то повторно используются и все остальные.

Page 110: ооп

110 TIKTOKCOACH.RU

Обобщенная замкнутость

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

Page 111: ооп

111 TIKTOKCOACH.RU

Ациклические зависимости

Структура зависимостей между модулями должна представлять собой ациклический направленный граф.

Page 112: ооп

112 TIKTOKCOACH.RU

Разрыв циклов

Page 113: ооп

113 TIKTOKCOACH.RU

Patterns

vs

Antipatterns

Page 114: ооп

114 TIKTOKCOACH.RU

Стабильные зависимости

Зависимости между пакетами должны быть направлены в сторону более стабильных пакетов

Page 115: ооп

115 TIKTOKCOACH.RU

Метрика нестабильности I

Ca – зависимые классы за пределами пакета Ce – зависисмые классы внутри пакета

𝐼 = 𝐶𝑒

𝐶𝑒 + 𝐶𝑎

Page 116: ооп

116 TIKTOKCOACH.RU

Стабильные абстракции

Пакеты, которые максимально стабильны, должны быть абстрактными. Нестабильными пакеты должны быть максимально конкретными.

Page 117: ооп

117 TIKTOKCOACH.RU

Метрика абстрактности

𝐴 = Абстрактные классы

Общее число классов

Page 118: ооп

118 TIKTOKCOACH.RU

Метрики