6. Правило 7±2
The magical Number Seven,
Plus or Minus Two
СЛЕДСТВИЕ: Чтобы удержать
в памяти большее количество
предметов, человек
разбивает их на логические
группы
Джордж Миллер
06 TIKTOKCOACH.RU
16. Определение ООП
Объектно-ориентированное
программирование - это
методология
программирования, основанная
на представлении программы в
виде совокупности объектов,
каждый из которых является
экземпляром определенного
класса, а классы образуют
иерархию наследования.
16 TIKTOKCOACH.RU
Гради Буч
17. Чем может помочь ООП?
Естественный язык
ООП
Слово
Правила
Жанры
Приемы
Класс
Синтаксис
Архитектура
Паттерны
Теорема Ферма
Война и Мир
Высокие нагрузки
Операционная система
17 TIKTOKCOACH.RU
18. ООП – это инструмент
Необходимое vs достаточное
18 TIKTOKCOACH.RU
23. Сюрпризы абстракций
Реальный объект
Абстракция
• Вещественное число
• Число с плавающей точкой
• Денежная единица
• Число с плавающей точкой
• Квадрат
• Класс квадрат
• Бизнес-операция
• Процедура
23 TIKTOKCOACH.RU
24. Группировка идей сверху вниз
Чтобы донести мысли до другого
человека, нужно убедиться, что
он группирует предметы так же
как и Вы
24 TIKTOKCOACH.RU
33. Открытые vs закрытые
• Полиморфная
операция
• Паттерны
• DI контейнеры
33 TIKTOKCOACH.RU
34. Открытые vs закрытые
• Полиморфная
операция
• Паттерны
• DI контейнеры
• Код, ген. по
метаописанию
34 TIKTOKCOACH.RU
35. Открытые vs закрытые
• Полиморфная
операция
• Паттерны
• DI контейнеры
• Код, ген. по
метаописанию
35 TIKTOKCOACH.RU
• switch
• If /else – if/else
36. Открытые vs закрытые
• Полиморфная
операция
• Паттерны
• DI контейнеры
• Код, ген. по
метаописанию
36 TIKTOKCOACH.RU
• switch
• If /else – if/else
• Неполиморфная
операция
•
37. Открытые vs закрытые
• Полиморфная
операция
• Паттерны
• DI контейнеры
• Код, ген. по
метаописанию
37 TIKTOKCOACH.RU
• switch
• If /else – if/else
• Неполиморфная
операция
• операторы
приведения типа
38. Открытые vs закрытые
• Полиморфная
операция
• Паттерны
• DI контейнеры
• Код, ген. по
метаописанию
38 TIKTOKCOACH.RU
• switch
• If /else – if/else
• Неполиморфная
операция
• операторы
приведения типа
39. Открытые vs закрытые
• Полиморфная
операция
• Паттерны
• DI контейнеры
• Код, ген. по
метаописанию
39 TIKTOKCOACH.RU
• switch
• If /else – if/else
• Неполиморфная
операция
• операторы
приведения типа
• enum
40. Открытые vs закрытые
• Полиморфная
операция
• Паттерны
• DI контейнеры
• Код, ген. по
метаописанию
40 TIKTOKCOACH.RU
• …
• Магические
константы
41. Открытые vs закрытые
• Полиморфная
операция
• Паттерны
• DI контейнеры
• Код, ген. по
метаописанию
41 TIKTOKCOACH.RU
• …
• Магические
константы
• Copy-paste
42. Открытые vs закрытые
• Полиморфная
операция
• Паттерны
• DI контейнеры
• Код, ген. по
метаописанию
42 TIKTOKCOACH.RU
• …
• Магические
константы
• Copy-paste
• Public поля
• …
43. Открытые vs закрытые
• Полиморфная
операция
• Паттерны
• DI контейнеры
• Код, ген. по
метаописанию
43 TIKTOKCOACH.RU
• …
• Магические
константы
• Copy-paste
• Public поля
• Глобальные
переменные
51. Открытость: где предел?
Ассемблер –> if, for, switch
Алгоритмы -> процедуры
Процедуры -> классы
Собственный код -> библиотеки
Компьютер -> облако
4
51 TIKTOKCOACH.RU
62. Аксиомы и правила логики Хоара
Аксиома пустого оператора
{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
63. Два подхода к параллельности
• CSP
• Модель акторов
63 TIKTOKCOACH.RU
64. Какой язык лучше?
На языке, который содержит
операцию ветвления и цикл,
можно реализовать любой
алгоритм
64 TIKTOKCOACH.RU
67. Следствия - 2
Конструктор используется для инвариантов
класса
При нарушении условия выбрасывается
исключение
67 TIKTOKCOACH.RU
68. Следствия - 3
Конструктор используется для инвариантов
класса
При нарушении условия выбрасывается
исключение
Техника RAII
68 TIKTOKCOACH.RU
69. Следствия - 4
Конструктор используется для инвариантов
класса
При нарушении условия выбрасывается
исключение
Техника RAII
Модульное тестирование
69 TIKTOKCOACH.RU
71. Контракт процедуры
• возможные типы входных данных и их значение;
• типы возвращаемых данных и их значение;
• условия возникновения исключений, их типы и
значения;
• присутствие побочного эффекта;
• (иногда) качественные характеристики, такие как
гарантии производительности, например,
временная сложность или сложность по памяти
71 TIKTOKCOACH.RU
75. Ключевые идеи
• Косвенный вызов процедуры
• Пред- и постусловия процедур
• Грубо: Абстракция ООП – это набор
процедур, предназначенных для
совместного использования
75 TIKTOKCOACH.RU
77. Контракт метода
• предусловия, которые могут быть
ослаблены (но не усилены) в подклассах;
• постусловия, которые могут быть усилены
(но не ослаблены) в подклассах;
77 TIKTOKCOACH.RU
78. Контракт метода
• предусловия, которые могут быть
ослаблены (но не усилены) в подклассах;
• постусловия, которые могут быть усилены
(но не ослаблены) в подклассах;
• инварианты, которые могут быть усилены
(но не ослаблены) в подклассах;
78 TIKTOKCOACH.RU
79. Принцип подстановки Лисков
Функции, которые используют
ссылки на базовые классы, должны
иметь возможность
использовать объекты
производных классов, не зная об
этом.
79 TIKTOKCOACH.RU
80. Нарушение принципа Лисков -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
81. Нарушение принципа Лисков -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);
}
}
87. Принцип обращения зависимостей
Высокоуровневые компоненты не
должны зависеть от низкоуровневых
компонент. И те, и те должны
зависеть от абстракций.
Абстракции не должны зависеть от
деталей. Детали должны зависеть
от абстракций.
87 TIKTOKCOACH.RU
89. Лампочка - 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();
}
}
90. Лампочка - 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. Следствия
• Сторонний код должен быть скрыт за
обертками, реализующими собственные
интерфейсы
• Обертки можно строить к старому
наследуемому коду
• Переписывание не всегда самый лучший
путь
91 TIKTOKCOACH.RU
92. 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);
}
}
94. Mock-объекты
Тестирование основанное на поведении –
• какие методы вызываются,
• в какой последовательности,
• какие результаты выдают
Mock-объект – прокси-объект, который
определяет прошел ли тестируемый
объект тест или нет
94 TIKTOKCOACH.RU
95. Дверь и таймер -1
abstract class Door
{
abstract void Lock();
abstract void Unlock();
abstract bool IsDoorOpen() ;
}
95 TIKTOKCOACH.RU
96. Дверь и таймер -2
abstract class Timer
{
abstract void Regsiter(int timeout, TimerClient
client);
}
abstract class TimerClient
{
abstract void TimeOut();
}
96 TIKTOKCOACH.RU
97. Дверь и таймер -3
Как правильно объединить две иерархи?
97 TIKTOKCOACH.RU
98. Дверь и таймер - 4
abstract class Door: TimerClient {}
abstract class TimedDoor: Door{}
98 TIKTOKCOACH.RU
99. Дверь и таймер - 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);
};
107. Модульность
1. Какой наилучший критерий для
разбиения на модули?
2. Какие отношения существуют
между модулями и каким
принципам они подчиняются?
3. Что первично класс или
модуль?
4. Физическое представление
модулей?
107 TIKTOKCOACH.RU
109. Повторное использование
Классы в пакете повторно
используются совместно. То есть,
если хотя бы один класс пакета
повторно используется, то повторно
используются и все остальные.
109 TIKTOKCOACH.RU
110. Обобщенная замкнутость
Классы в пакете должны быть
замкнуты от одних и тех же
изменений. Изменение, влияющее на
пакет, влияет на все классы этого
пакета.
110 TIKTOKCOACH.RU
115. Метрика нестабильности I
Ca – зависимые классы за пределами пакета
Ce – зависисмые классы внутри пакета
𝐶𝑒
𝐼=
𝐶𝑒 + 𝐶𝑎
115 TIKTOKCOACH.RU
116. Стабильные абстракции
Пакеты, которые максимально
стабильны, должны быть
абстрактными. Нестабильными
пакеты должны быть максимально
конкретными.
116 TIKTOKCOACH.RU