Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
ОмГУ ФКН 2013

Проектирование программного
обеспечения
01 TIKTOKCOACH.RU
Преподаватель
Тюменцев Евгений

02 TIKTOKCOACH.RU
Объектная модель
•
•
•
•

абстракция
инкапсуляция
модульность
иерархия

03 TIKTOKCOACH.RU

• типизация
• параллелизм
• сохраняемость
Объектная модель
•
•
•
•

абстракция
инкапсуляция
модульность
иерархия

04 TIKTOKCOACH.RU

• типизация
• параллелизм
• сохраняемость
Заблуждение
Абстракция = класс

05 TIKTOKCOACH.RU
Правило 7±2
The magical Number Seven,
Plus or Minus Two
СЛЕДСТВИЕ: Чтобы удержать
в памяти большее количество
предметов, человек
разбивает их на логические
группы
Джордж Миллер
06 TIKTOKCOACH.RU
Абстракция
Абстракция выделяет существенные
характеристики некоторого
объекта, отличающие его от всех
других видов объектов.
(Гради Буч)

07 TIKTOKCOACH.COM
Что дает абстракция?

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

08 TIKTOKCOACH.RU
Примеры абстракций
Сфера применения

Абстракция

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

• Процедура

09 TIKTOKCOACH.RU
Примеры абстракций
Сфера применения

Абстракция

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

• Процедура

• ООП

• Класс

10 TIKTOKCOACH.COM
Примеры абстракций
Сфера применения

Абстракция

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

• Процедура

• ООП

• Класс

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

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

11 TIKTOKCOACH.RU
Примеры абстракций
Сфера применения

Абстракция

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

• Процедура

• ООП

• Класс

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

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

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

• Поток

12 TIKTOKCOACH.RU
Что такое объекты?

13 TIKTOKCOACH.RU
Принципы мышления

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

14 TIKTOKCOACH.RU
Обобщение через полиморфизм

Указатель на функцию: одно и
то же имя может означать
разные функции одной
сигнатуры
15 TIKTOKCOACH.RU
Определение ООП
Объектно-ориентированное
программирование - это
методология
программирования, основанная
на представлении программы в
виде совокупности объектов,
каждый из которых является
экземпляром определенного
класса, а классы образуют
иерархию наследования.
16 TIKTOKCOACH.RU

Гради Буч
Чем может помочь ООП?
Естественный язык

ООП

Слово
Правила
Жанры
Приемы

Класс
Синтаксис
Архитектура
Паттерны

Теорема Ферма
Война и Мир

Высокие нагрузки
Операционная система

17 TIKTOKCOACH.RU
ООП – это инструмент
Необходимое vs достаточное

18 TIKTOKCOACH.RU
Особенности абстракций

19 TIKTOKCOACH.RU
Сюрпризы абстракций
Реальный объект

Абстракция

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

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

20 TIKTOKCOACH.RU
Сюрпризы абстракций
Реальный объект

Абстракция

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

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

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

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

21 TIKTOKCOACH.RU
Сюрпризы абстракций
Реальный объект

Абстракция

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

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

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

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

• Квадрат

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

22 TIKTOKCOACH.RU
Сюрпризы абстракций
Реальный объект

Абстракция

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

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

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

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

• Квадрат

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

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

• Процедура

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

Чтобы донести мысли до другого
человека, нужно убедиться, что
он группирует предметы так же
как и Вы
24 TIKTOKCOACH.RU
Мышление «снизу вверх»

25 TIKTOKCOACH.RU
Пример: список покупок
Мука
Молоко
Батарейки
Морковь
Апельсины
Хлеб
Масло
Яблоки
Ручка
26 TIKTOKCOACH.RU

Сок
Детская игрушка
Картофель
Детские тетради
Сметана
Сахар
Виноград
Вода
Группировка
Батарейки

Масло

Детские тетради
Ручка

Хлеб

Вода
Сок
Сахар

Морковь
Апельсины
Яблоки
Виноград
Картофель

27 TIKTOKCOACH.RU

Молоко
Сметана
Мука

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

Martin Fauler
Рефакторинг
28 TIKTOKCOACH.RU
The Open-Closed Principle

Rob Martin (Uncle Bob)
29 TIKTOKCOACH.COM
Программные объекты должны
быть открыты для
расширения, но в тоже время
закрыты для модификации

30 TIKTOKCOACH.RU
Открытые vs закрытые
• Полиморфная
операция

31 TIKTOKCOACH.RU
Открытые vs закрытые
• Полиморфная
операция
• Паттерны

32 TIKTOKCOACH.RU
Открытые vs закрытые
• Полиморфная
операция
• Паттерны
• DI контейнеры

33 TIKTOKCOACH.RU
Открытые vs закрытые
• Полиморфная
операция
• Паттерны
• DI контейнеры
• Код, ген. по
метаописанию
34 TIKTOKCOACH.RU
Открытые vs закрытые
• Полиморфная
операция
• Паттерны
• DI контейнеры
• Код, ген. по
метаописанию
35 TIKTOKCOACH.RU

• switch
• If /else – if/else
Открытые vs закрытые
• Полиморфная
операция
• Паттерны
• DI контейнеры
• Код, ген. по
метаописанию
36 TIKTOKCOACH.RU

• switch
• If /else – if/else
• Неполиморфная
операция
•
Открытые vs закрытые
• Полиморфная
операция
• Паттерны
• DI контейнеры
• Код, ген. по
метаописанию
37 TIKTOKCOACH.RU

• switch
• If /else – if/else
• Неполиморфная
операция
• операторы
приведения типа
Открытые vs закрытые
• Полиморфная
операция
• Паттерны
• DI контейнеры
• Код, ген. по
метаописанию
38 TIKTOKCOACH.RU

• switch
• If /else – if/else
• Неполиморфная
операция
• операторы
приведения типа
Открытые vs закрытые
• Полиморфная
операция
• Паттерны
• DI контейнеры
• Код, ген. по
метаописанию
39 TIKTOKCOACH.RU

• switch
• If /else – if/else
• Неполиморфная
операция
• операторы
приведения типа
• enum
Открытые vs закрытые
• Полиморфная
операция
• Паттерны
• DI контейнеры
• Код, ген. по
метаописанию
40 TIKTOKCOACH.RU

• …
• Магические
константы
Открытые vs закрытые
• Полиморфная
операция
• Паттерны
• DI контейнеры
• Код, ген. по
метаописанию
41 TIKTOKCOACH.RU

• …
• Магические
константы
• Copy-paste
Открытые vs закрытые
• Полиморфная
операция
• Паттерны
• DI контейнеры
• Код, ген. по
метаописанию
42 TIKTOKCOACH.RU

• …
• Магические
константы
• Copy-paste
• Public поля
• …
Открытые vs закрытые
• Полиморфная
операция
• Паттерны
• DI контейнеры
• Код, ген. по
метаописанию
43 TIKTOKCOACH.RU

• …
• Магические
константы
• Copy-paste
• Public поля
• Глобальные
переменные
Код открыт на 100%: возможно?

44 TIKTOKCOACH.RU
Стратегическая замкнутость
Архитектура

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

45 TIKTOKCOACH.RU
Вопросы

46 TIKTOKCOACH.RU
Об истории - 1

47 TIKTOKCOACH.RU
Об истории - 2

48 TIKTOKCOACH.RU
Об истории - 3

49 TIKTOKCOACH.RU
Об истории - 4

50 TIKTOKCOACH.RU
Открытость: где предел?

Ассемблер –> if, for, switch
Алгоритмы -> процедуры
Процедуры -> классы
Собственный код -> библиотеки
Компьютер -> облако

4
51 TIKTOKCOACH.RU
Аргументы
Нижний

Скорость,
контроль,
доп. возможности

52 TIKTOKCOACH.RU

Верхний

гибкость,
продуктивность
Рефакторинг vs дублирование кода
//ушел он ночью, но уже на другой день
если час (ТекСтрокаРабочиеЧасы.МоментВыхода) < Константы.НачалоДневныхЧасов.Получить() и час
(ТекСтрокаРабочиеЧасы.МоментВхода) < Константы.НачалоДневныхЧасов.Получить()
тогда
//он пришел утром и ушел следующим утром
МоментПерехода = началоДня(ТекСтрокаРабочиеЧасы.МоментВхода);
МоментПерехода = МоментПерехода + (Константы.НачалоДневныхЧасов.Получить()) * 3600;
НочныеЧасы = НочныеЧасы + (МоментПерехода - ТекСтрокаРабочиеЧасы.МоментВхода) / 3600;
МоментПереходаВНочь = началоДня(ТекСтрокаРабочиеЧасы.МоментВхода);
МоментПереходаВНочь = МоментПереходаВНочь + (Константы.НачалоНочныхЧасов.Получить()) * 3600;
ДневныеЧасы = ДневныеЧасы + (МоментПереходаВНочь - МоментПерехода) / 3600;
НочныеЧасы = НочныеЧасы + (НачалоСледующегоДня - МоментПереходаВНочь) / 3600
иначе
//он пришел вечером
НочныеЧасы = НочныеЧасы + (НачалоСледующегоДня - 1 - ТекСтрокаРабочиеЧасы.МоментВхода) /
3600;
КонецЕсли;

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

53 TIKTOKCOACH.RU

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

54 TIKTOKCOACH.RU
Почему?
Дублирование выходит за рамки
применяемой платформы
Дублирование выходит за рамки понимания
программиста

55 TIKTOKCOACH.RU
Эффект Даннинга-Крюгера

55 TIKTOKCOACH.COM
Зачем рефакторинг?

 Группировка
 Обобщение
 общее понимание
57 TIKTOKCOACH.RU

1
Исчисление предикатов
∀𝑥∃𝑦 𝑃(𝑥, 𝑦)

58 TIKTOKCOACH.RU
Теорема дедукции

𝞒, 𝐴 ⊦ 𝐿 𝐵 ↔

59 TIKTOKCOACH.RU

𝞒 ⊦𝐿 𝐴 → 𝐵
Теория второго порядка
∀𝑓∃𝑦 𝑃(𝑓(𝑦))

60 TIKTOKCOACH.RU
Логика Хоара
Тройка Хоара
{pred} statement {post}

Пример:
Чарльз Хоар
{x+1 == 43} y=x+1; {y == 43 ^ x == 42}
61 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}

62 TIKTOKCOACH.RU
Два подхода к параллельности
• CSP
• Модель акторов

63 TIKTOKCOACH.RU
Какой язык лучше?

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

64 TIKTOKCOACH.RU
Контрактное программирование

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

65 TIKTOKCOACH.RU
Следствия
Конструктор используется для инвариантов
класса

66 TIKTOKCOACH.RU
Следствия - 2
Конструктор используется для инвариантов
класса
При нарушении условия выбрасывается
исключение

67 TIKTOKCOACH.RU
Следствия - 3
Конструктор используется для инвариантов
класса
При нарушении условия выбрасывается
исключение
Техника RAII

68 TIKTOKCOACH.RU
Следствия - 4
Конструктор используется для инвариантов
класса
При нарушении условия выбрасывается
исключение
Техника RAII
Модульное тестирование

69 TIKTOKCOACH.RU
Модульное тестирование
Правило композиции
{P} S {Q}, {Q} T {R} ╞ {P} S;T {R}

2
70 TIKTOKCOACH.RU
Контракт процедуры
• возможные типы входных данных и их значение;
• типы возвращаемых данных и их значение;
• условия возникновения исключений, их типы и
значения;
• присутствие побочного эффекта;
• (иногда) качественные характеристики, такие как
гарантии производительности, например,
временная сложность или сложность по памяти

71 TIKTOKCOACH.RU
Слабое, сильное условие

73 TIKTOKCOACH.RU
P^Q^S

73 TIKTOKCOACH.RU
«Реальные» объекты

74 TIKTOKCOACH.RU
Ключевые идеи
• Косвенный вызов процедуры

• Пред- и постусловия процедур
• Грубо: Абстракция ООП – это набор
процедур, предназначенных для
совместного использования
75 TIKTOKCOACH.RU
Контракт метода
• предусловия, которые могут быть
ослаблены (но не усилены) в подклассах;

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

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

78 TIKTOKCOACH.RU
Принцип подстановки Лисков

Функции, которые используют
ссылки на базовые классы, должны
иметь возможность
использовать объекты
производных классов, не зная об
этом.
79 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);
}

}

80 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);
}

81 TIKTOKCOACH.RU

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);
}
}
Следствие

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

82 TIKTOKCOACH.RU
Последствия
• Заранее построить очень гибкую модель
“про запас” нельзя!
• Лучше использовать прототипирование

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

84 TIKTOKCOACH.RU

enum OutputDevice
{
printer,
disk
};
void Copy(OutputDevice dev)
{
int c;
while ((c = ReadKeyboard()) != EOF)
{
if (dev == printer)
WritePrinter(c);
else
WriteDisk(c);
}
}
Программа Copy - 2
interface IReader
{
int Read();
}
interface IWriter
{
void Write(char) = 0;
}

85 TIKTOKCOACH.RU

void Copy(
IReader r,
IWriter w
)
{
int c;
while((c=r.Read()) != EOF)
w.Write(c);
}
Схема зависимостей

86 TIKTOKCOACH.RU
Принцип обращения зависимостей
Высокоуровневые компоненты не
должны зависеть от низкоуровневых
компонент. И те, и те должны
зависеть от абстракций.
Абстракции не должны зависеть от
деталей. Детали должны зависеть
от абстракций.

87 TIKTOKCOACH.RU
Слои

88 TIKTOKCOACH.RU
Лампочка - 1
class Lamp
{
public void TurnOn() {…}
public void TurnOff() {…}
}

89 TIKTOKCOACH.RU

class Button
{
private Lamp lamp;
public Button(Lamp lamp)
{this.lamp = lamp;}
public void Detect()
{
if(GetPhisicalState())
lamp.TurnOn();
else lamp.TurnOff();
}
}
Лампочка - 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();
}
}
90 TIKTOKCOACH.RU

class Button
{
private Lamp lamp;
public Button(Lamp lamp)
{this.lamp = lamp;}
public void Detect()
{
if(GetPhisicalState())
lamp.TurnOn();
else lamp.TurnOff();
}
}
Следствия
• Сторонний код должен быть скрыт за
обертками, реализующими собственные
интерфейсы
• Обертки можно строить к старому
наследуемому коду
• Переписывание не всегда самый лучший
путь
91 TIKTOKCOACH.RU
DI-контейнеры
В коде
new Circle(3,4, 10)
new Rectangle(0, 0, 10, 10)

92 TIKTOKCOACH.RU

Фабрика
Shape Create(ShapeType sType)
{
switch(sType)
{
case Circle: return new Circle(3,4, 10);
case Rec: new Rectangle(0, 0, 10, 10);
}
}
«Обычное» unit-тестирование
Тестирование основанное на состояниях
Недостатки:
• Требует знания о внутреннем состоянии
объекта –возможно нарушение
инкапсуляции
• Нарушает принципы ООП

93 TIKTOKCOACH.RU
Mock-объекты
Тестирование основанное на поведении –
• какие методы вызываются,
• в какой последовательности,
• какие результаты выдают
Mock-объект – прокси-объект, который
определяет прошел ли тестируемый
объект тест или нет
94 TIKTOKCOACH.RU
Дверь и таймер -1
abstract class Door
{
abstract void Lock();
abstract void Unlock();
abstract bool IsDoorOpen() ;
}

95 TIKTOKCOACH.RU
Дверь и таймер -2
abstract class Timer
{
abstract void Regsiter(int timeout, TimerClient
client);
}
abstract class TimerClient
{
abstract void TimeOut();
}
96 TIKTOKCOACH.RU
Дверь и таймер -3
Как правильно объединить две иерархи?

97 TIKTOKCOACH.RU
Дверь и таймер - 4
abstract class Door: TimerClient {}
abstract class TimedDoor: Door{}

98 TIKTOKCOACH.RU
Дверь и таймер - 5
class TimedDoorAdapter:
TimerClient
{
private TimedDoor
itsTimedDoor;
public void TimeOut(int
timeOutId)
{

itsTimedDoor.DoorTimeOut(ti
meOutId);
}
}
99 TIKTOKCOACH.RU

class TimedDoor : Door
{
public virtual void
DoorTimeOut(int timeOutId);
};
Дверь и таймер - 6
interface Door
{
void Lock();
void Unlock();
bool IsDoorOpen() ;
}

class TimedDoor: Door,
TImerClient
{}
100 TIKTOKCOACH.RU

interface Timer
{
void Regsiter(int timeout,
TimerClient client);
}
interface TimerClient
{
interface void TimeOut();
}
Может быть проблема надумана?

101KTOKCOACH.RU
94
Принцип соответствия интерфейсов

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

102 TIKTOKCOACH.RU
Жирный интерфейс

103 TIKTOKCOACH.RU
Жирный интерфейс

104 TIKTOKCOACH.RU
Ответственность

105 TIKTOKCOACH.RU
Принцип единой ответственности

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

106 TIKTOKCOACH.RU
Модульность
1. Какой наилучший критерий для
разбиения на модули?
2. Какие отношения существуют
между модулями и каким
принципам они подчиняются?
3. Что первично класс или
модуль?
4. Физическое представление
модулей?

107 TIKTOKCOACH.RU
Принцип эквивалентности

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

108 TIKTOKCOACH.RU
Повторное использование

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

109 TIKTOKCOACH.RU
Обобщенная замкнутость

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

110 TIKTOKCOACH.RU
Ациклические зависимости

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

111 TIKTOKCOACH.RU
Разрыв циклов

112 TIKTOKCOACH.RU
Patterns
vs
Antipatterns
113 TIKTOKCOACH.RU
Стабильные зависимости

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

114 TIKTOKCOACH.RU
Метрика нестабильности I

Ca – зависимые классы за пределами пакета
Ce – зависисмые классы внутри пакета
𝐶𝑒
𝐼=
𝐶𝑒 + 𝐶𝑎

115 TIKTOKCOACH.RU
Стабильные абстракции

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

116 TIKTOKCOACH.RU
Метрика абстрактности

Абстрактные классы
𝐴=
Общее число классов

117 TIKTOKCOACH.RU
Метрики

118 TIKTOKCOACH.RU

More Related Content

ооп