Upload
etyumentcev
View
599
Download
3
Embed Size (px)
Citation preview
01 TIKTOKCOACH.RU
Проектирование программного обеспечения
ОмГУ ФКН 2013
02 TIKTOKCOACH.RU
Преподаватель
Тюменцев Евгений
03 TIKTOKCOACH.RU
Объектная модель
• абстракция
• инкапсуляция
• модульность
• иерархия
• типизация
• параллелизм
• сохраняемость
04 TIKTOKCOACH.RU
Объектная модель
• абстракция
• инкапсуляция
• модульность
• иерархия
• типизация
• параллелизм
• сохраняемость
05 TIKTOKCOACH.RU
Заблуждение
Абстракция = класс
06 TIKTOKCOACH.RU
Правило 7±2
The magical Number Seven,
Plus or Minus Two
СЛЕДСТВИЕ: Чтобы удержать в памяти большее количество предметов, человек разбивает их на логические группы
Джордж Миллер
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
Чем может помочь ООП?
Естественный язык
Слово
Правила
Жанры
Приемы
Теорема Ферма
Война и Мир
ООП
Класс
Синтаксис
Архитектура
Паттерны
Высокие нагрузки
Операционная система
18 TIKTOKCOACH.RU
ООП – это инструмент
Необходимое vs достаточное
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
Группировка
Батарейки Детские тетради Ручка Вода Сок Сахар Морковь Апельсины Яблоки Виноград Картофель
Масло
Хлеб
Молоко
Сметана
Мука
Детская игрушка
28 TIKTOKCOACH.RU
Что такое хорошая абстракция?
Martin Fauler Рефакторинг
29 TIKTOKCOACH.COM
The Open-Closed Principle
Rob Martin (Uncle Bob)
30 TIKTOKCOACH.RU
Программные объекты должны быть открыты для расширения, но в тоже время закрыты для модификации
31 TIKTOKCOACH.RU
Открытые vs закрытые
• Полиморфная операция
32 TIKTOKCOACH.RU
Открытые vs закрытые
• Полиморфная операция
• Паттерны
33 TIKTOKCOACH.RU
Открытые vs закрытые
• Полиморфная операция
• Паттерны
• DI контейнеры
34 TIKTOKCOACH.RU
Открытые vs закрытые
• Полиморфная операция
• Паттерны
• DI контейнеры
• Код, ген. по метаописанию
35 TIKTOKCOACH.RU
Открытые vs закрытые
• Полиморфная операция
• Паттерны
• DI контейнеры
• Код, ген. по метаописанию
• switch
• If /else – if/else
36 TIKTOKCOACH.RU
Открытые vs закрытые
• Полиморфная операция
• Паттерны
• DI контейнеры
• Код, ген. по метаописанию
• switch
• If /else – if/else
• Неполиморфная операция
•
37 TIKTOKCOACH.RU
Открытые vs закрытые
• Полиморфная операция
• Паттерны
• DI контейнеры
• Код, ген. по метаописанию
• switch
• If /else – if/else
• Неполиморфная операция
• операторы приведения типа
38 TIKTOKCOACH.RU
Открытые vs закрытые
• Полиморфная операция
• Паттерны
• DI контейнеры
• Код, ген. по метаописанию
• switch
• If /else – if/else
• Неполиморфная операция
• операторы приведения типа
39 TIKTOKCOACH.RU
Открытые vs закрытые
• Полиморфная операция
• Паттерны
• DI контейнеры
• Код, ген. по метаописанию
• switch
• If /else – if/else
• Неполиморфная операция
• операторы приведения типа
• enum
40 TIKTOKCOACH.RU
Открытые vs закрытые
• Полиморфная операция
• Паттерны
• DI контейнеры
• Код, ген. по метаописанию
• …
• Магические константы
41 TIKTOKCOACH.RU
Открытые vs закрытые
• Полиморфная операция
• Паттерны
• DI контейнеры
• Код, ген. по метаописанию
• …
• Магические константы
• Copy-paste
42 TIKTOKCOACH.RU
Открытые vs закрытые
• Полиморфная операция
• Паттерны
• DI контейнеры
• Код, ген. по метаописанию
• …
• Магические константы
• Copy-paste
• Public поля
• …
43 TIKTOKCOACH.RU
Открытые vs закрытые
• Полиморфная операция
• Паттерны
• DI контейнеры
• Код, ген. по метаописанию
• …
• Магические константы
• Copy-paste
• Public поля
• Глобальные переменные
44 TIKTOKCOACH.RU
Код открыт на 100%: возможно?
45 TIKTOKCOACH.RU
Стратегическая замкнутость
Архитектура
Открытые конструкции
46 TIKTOKCOACH.RU
Вопросы
47 TIKTOKCOACH.RU
Об истории - 1
48 TIKTOKCOACH.RU
Об истории - 2
49 TIKTOKCOACH.RU
Об истории - 3
50 TIKTOKCOACH.RU
Об истории - 4
51 TIKTOKCOACH.RU
Открытость: где предел?
Ассемблер –> if, for, switch
Алгоритмы -> процедуры
Процедуры -> классы
Собственный код -> библиотеки
Компьютер -> облако
4
52 TIKTOKCOACH.RU
Аргументы
Нижний
Скорость,
контроль,
доп. возможности
Верхний
гибкость,
продуктивность
53 TIKTOKCOACH.RU
Рефакторинг vs дублирование кода //ушел он ночью, но уже на другой день
если час (ТекСтрокаРабочиеЧасы.МоментВыхода) < Константы.НачалоДневныхЧасов.Получить() и час (ТекСтрокаРабочиеЧасы.МоментВхода) < Константы.НачалоДневныхЧасов.Получить()
тогда
//он пришел утром и ушел следующим утром
МоментПерехода = началоДня(ТекСтрокаРабочиеЧасы.МоментВхода);
МоментПерехода = МоментПерехода + (Константы.НачалоДневныхЧасов.Получить()) * 3600;
НочныеЧасы = НочныеЧасы + (МоментПерехода - ТекСтрокаРабочиеЧасы.МоментВхода) / 3600;
МоментПереходаВНочь = началоДня(ТекСтрокаРабочиеЧасы.МоментВхода);
МоментПереходаВНочь = МоментПереходаВНочь + (Константы.НачалоНочныхЧасов.Получить()) * 3600;
ДневныеЧасы = ДневныеЧасы + (МоментПереходаВНочь - МоментПерехода) / 3600;
НочныеЧасы = НочныеЧасы + (НачалоСледующегоДня - МоментПереходаВНочь) / 3600
иначе
//он пришел вечером
НочныеЧасы = НочныеЧасы + (НачалоСледующегоДня - 1 - ТекСтрокаРабочиеЧасы.МоментВхода) / 3600;
КонецЕсли;
От дублирования кода полностью избавиться нельзя
3
54 TIKTOKCOACH.RU
Почему?
Дублирование выходит за рамки применяемой платформы
55 TIKTOKCOACH.RU
Почему?
Дублирование выходит за рамки применяемой платформы
Дублирование выходит за рамки понимания программиста
55 TIKTOKCOACH.COM
Эффект Даннинга-Крюгера
57 TIKTOKCOACH.RU
Зачем рефакторинг?
Группировка Обобщение
общее понимание
1
58 TIKTOKCOACH.RU
Исчисление предикатов
∀𝑥∃𝑦 𝑃(𝑥, 𝑦)
59 TIKTOKCOACH.RU
Теорема дедукции
𝞒, 𝐴 ⊦𝐿 𝐵 ↔ 𝞒 ⊦𝐿 𝐴 → 𝐵
60 TIKTOKCOACH.RU
Теория второго порядка
∀𝑓∃𝑦 𝑃(𝑓(𝑦))
61 TIKTOKCOACH.RU
Логика Хоара
Тройка Хоара {pred} statement {post}
Пример: Чарльз Хоар
{x+1 == 43} y=x+1; {y == 43 ^ x == 42}
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}
63 TIKTOKCOACH.RU
Два подхода к параллельности
• CSP
• Модель акторов
64 TIKTOKCOACH.RU
Какой язык лучше?
На языке, который содержит операцию ветвления и цикл, можно реализовать любой алгоритм
65 TIKTOKCOACH.RU
Контрактное программирование
Инвариант Предусловие Постусловие
66 TIKTOKCOACH.RU
Следствия
Конструктор используется для инвариантов класса
67 TIKTOKCOACH.RU
Следствия - 2
Конструктор используется для инвариантов класса
При нарушении условия выбрасывается исключение
68 TIKTOKCOACH.RU
Следствия - 3
Конструктор используется для инвариантов класса
При нарушении условия выбрасывается исключение
Техника RAII
69 TIKTOKCOACH.RU
Следствия - 4
Конструктор используется для инвариантов класса
При нарушении условия выбрасывается исключение
Техника RAII
Модульное тестирование
70 TIKTOKCOACH.RU
Модульное тестирование
Правило композиции
{P} S {Q}, {Q} T {R} ╞ {P} S;T {R}
2
71 TIKTOKCOACH.RU
Контракт процедуры
• возможные типы входных данных и их значение;
• типы возвращаемых данных и их значение;
• условия возникновения исключений, их типы и значения;
• присутствие побочного эффекта;
• (иногда) качественные характеристики, такие как гарантии производительности, например, временная сложность или сложность по памяти
73 TIKTOKCOACH.RU
Слабое, сильное условие
73 TIKTOKCOACH.RU
P ^ Q ^ S
74 TIKTOKCOACH.RU
«Реальные» объекты
75 TIKTOKCOACH.RU
Ключевые идеи
• Косвенный вызов процедуры
• Пред- и постусловия процедур
• Грубо: Абстракция ООП – это набор процедур, предназначенных для совместного использования
76 TIKTOKCOACH.RU
Контракт метода
• предусловия, которые могут быть ослаблены (но не усилены) в подклассах;
77 TIKTOKCOACH.RU
Контракт метода
• предусловия, которые могут быть ослаблены (но не усилены) в подклассах;
• постусловия, которые могут быть усилены (но не ослаблены) в подклассах;
78 TIKTOKCOACH.RU
Контракт метода
• предусловия, которые могут быть ослаблены (но не усилены) в подклассах;
• постусловия, которые могут быть усилены (но не ослаблены) в подклассах;
• инварианты, которые могут быть усилены (но не ослаблены) в подклассах;
79 TIKTOKCOACH.RU
Принцип подстановки Лисков
Функции, которые используют ссылки на базовые классы, должны иметь возможность использовать объекты производных классов, не зная об этом.
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); }
}
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); } }
82 TIKTOKCOACH.RU
Следствие
Построенные абстракции нельзя проверить на корректность сами по себе.
83 TIKTOKCOACH.RU
Последствия
• Заранее построить очень гибкую модель “про запас” нельзя!
• Лучше использовать прототипирование
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); } }
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);
}
86 TIKTOKCOACH.RU
Схема зависимостей
87 TIKTOKCOACH.RU
Принцип обращения зависимостей
Высокоуровневые компоненты не должны зависеть от низкоуровневых компонент. И те, и те должны зависеть от абстракций.
Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.
88 TIKTOKCOACH.RU
Слои
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();
}
}
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();
}
}
91 TIKTOKCOACH.RU
Следствия
• Сторонний код должен быть скрыт за обертками, реализующими собственные интерфейсы
• Обертки можно строить к старому наследуемому коду
• Переписывание не всегда самый лучший путь
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);
}
}
93 TIKTOKCOACH.RU
«Обычное» unit-тестирование
Тестирование основанное на состояниях
Недостатки:
• Требует знания о внутреннем состоянии объекта –возможно нарушение инкапсуляции
• Нарушает принципы ООП
94 TIKTOKCOACH.RU
Mock-объекты
Тестирование основанное на поведении –
• какие методы вызываются,
• в какой последовательности,
• какие результаты выдают
Mock-объект – прокси-объект, который определяет прошел ли тестируемый объект тест или нет
95 TIKTOKCOACH.RU
Дверь и таймер -1
abstract class Door
{
abstract void Lock();
abstract void Unlock();
abstract bool IsDoorOpen() ;
}
96 TIKTOKCOACH.RU
Дверь и таймер -2
abstract class Timer
{
abstract void Regsiter(int timeout, TimerClient client);
}
abstract class TimerClient
{
abstract void TimeOut();
}
97 TIKTOKCOACH.RU
Дверь и таймер -3
Как правильно объединить две иерархи?
98 TIKTOKCOACH.RU
Дверь и таймер - 4
abstract class Door: TimerClient {}
abstract class TimedDoor: Door{}
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); };
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();
}
94 101KTOKCOACH.RU
Может быть проблема надумана?
102 TIKTOKCOACH.RU
Принцип соответствия интерфейсов
Класс не должен зависеть от интерфейсов, которые он не использует
103 TIKTOKCOACH.RU
Жирный интерфейс
104 TIKTOKCOACH.RU
Жирный интерфейс
105 TIKTOKCOACH.RU
Ответственность
106 TIKTOKCOACH.RU
Принцип единой ответственности
Должна быть ровно одна причина для изменения класса
107 TIKTOKCOACH.RU
Модульность
1. Какой наилучший критерий для разбиения на модули?
2. Какие отношения существуют между модулями и каким принципам они подчиняются?
3. Что первично класс или модуль?
4. Физическое представление модулей?
108 TIKTOKCOACH.RU
Принцип эквивалентности
Единица повторного использования = единице релиза. Это единица называется пакетом.
109 TIKTOKCOACH.RU
Повторное использование
Классы в пакете повторно используются совместно. То есть, если хотя бы один класс пакета повторно используется, то повторно используются и все остальные.
110 TIKTOKCOACH.RU
Обобщенная замкнутость
Классы в пакете должны быть замкнуты от одних и тех же изменений. Изменение, влияющее на пакет, влияет на все классы этого пакета.
111 TIKTOKCOACH.RU
Ациклические зависимости
Структура зависимостей между модулями должна представлять собой ациклический направленный граф.
112 TIKTOKCOACH.RU
Разрыв циклов
113 TIKTOKCOACH.RU
Patterns
vs
Antipatterns
114 TIKTOKCOACH.RU
Стабильные зависимости
Зависимости между пакетами должны быть направлены в сторону более стабильных пакетов
115 TIKTOKCOACH.RU
Метрика нестабильности I
Ca – зависимые классы за пределами пакета Ce – зависисмые классы внутри пакета
𝐼 = 𝐶𝑒
𝐶𝑒 + 𝐶𝑎
116 TIKTOKCOACH.RU
Стабильные абстракции
Пакеты, которые максимально стабильны, должны быть абстрактными. Нестабильными пакеты должны быть максимально конкретными.
117 TIKTOKCOACH.RU
Метрика абстрактности
𝐴 = Абстрактные классы
Общее число классов
118 TIKTOKCOACH.RU
Метрики