SlideShare a Scribd company logo
1 of 53
Глава 3. Модель 
акторов. 
30
Литература 65 
Actors: A Model of 
Concurrent Computations 
in Distributed Systems 
PhD thesis, 1985 
Gul A. Agha
Task 66 
1. Tag (уникальный идентификатор) 
2. Target (mail address) 
3. Communication (данные)
Абстракция актора 67 
1.Mail address 
2.Large mail queue 
3.Behavior
Шаг вычислений 68 
1.Отправить сообщения 
2.Создать новые акторы 
3.Изменить свое 
поведение для приема 
следующего сообщения 
(become method)
Литература 69
Обмен сообщениями 70 
1. Каналы 
2. Сообщения 
3. Фильтры 
4. Маршрутизация 
5. Преобразование 
6. Конечные точки
Каналы 71 
http://www.eaipatterns.com/MessageChannel.html
Сообщения 72 
http://www.eaipatterns.com/Message.html
Маршрутизация 73 
http://www.eaipatterns.com/MessageRouter.html
Конечные точки 74 
http://www.eaipatterns.com/MessageEndpoint.html
Глава 4. Важно знать. 75
Репозиторий GitHub 76 
Библиотека акторов, котрая будет написана в 
рамках спецкурса выложена по адресу 
https://github.com/hwdtech/HWdTech.DS
S.O.L.I.D 77 
• The Open-Closed Principle 
• The Liskov Substitution 
Principle 
• The Interface Segregation 
Principle 
• The Dependency Inversion 
Principle 
• The Single Responsibility 
Principle 
objectmentor.com 
Rob Martin (Uncle Bob)
The Open-Closed Principle 78 
Программные объекты 
должны быть открыты для 
расширения, но в тоже 
время закрыты для 
модификации
Открытые vs закрытые 79 
• Полиморфная 
операция 
• Паттерны 
• DI контейнеры 
• Код, ген. по 
метаописанию 
• switch 
• If /else – if/else 
• Неполиморфная 
операция 
• операторы 
приведения типа 
• enum
Открытые vs закрытые 80 
• Полиморфная 
операция 
• Паттерны 
• DI контейнеры 
• Код, ген. по 
метаописанию 
• … 
• Магические 
константы 
• Copy-paste 
• Public поля 
• Глобальные 
переменные
Открытые vs закрытые 81 
• Полиморфная 
операция 
• Паттерны 
• DI контейнеры 
• Код, ген. по 
метаописанию 
• … 
• Магические 
константы 
• Copy-paste 
• Public поля 
• Глобальные 
переменные
Программа Copy вер. 1 82 
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); 
} 
}
Программа Copy вер. 2 83 
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); 
}
Все дело в зависимостях 84
The Dependency Inversion Principle85 
Высокоуровневые компоненты не 
должны зависеть от 
низкоуровневых компонент. И те, и 
те должны зависеть от 
абстракций. 
Абстракции не должны зависеть от 
деталей. Детали должны зависеть 
от абстракций.
Слои 86
Литература 87
Фасад 88
Абстрактная фабрика 89 
void Copy( 
IReader r, 
IWriter w 
) 
{ 
int c; 
while((c=r.Read()) != 
EOF) 
w.Write(c); 
}
DI Container Autofac 90 
var builder = new ContainerBuilder(); 
builder.RegisterType<LibraryBook>().As<IBook>(); 
builder.RegisterType<MainViewModel>().AsSelf(); 
var container = builder.Build(); 
var model = container.Resolve<MainViewModel>(); 
var view = new MainWindow (DataContext = 
model); 
view.Show();
Логика Хоара 91 
Тройка Хоара 
{pred} statement {post} 
Пример: Чарльз Хоар 
{x+1 == 43} y=x+1; {y == 43 ^ x == 42}
Аксиомы и правила логики Хоара 92 
Аксиома пустого оператора 
{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}
Аксиомы и правила логики Хоара 93 
Аксиома пустого оператора 
{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}
Пример: pow(x,y) 94 
http://freehabr.ru/blog/programming/1933.html 
int power(int a, int n) { 
assert(n > 0 || (a != 0 || n != 0)); 
if (n == 0) return 1; 
else { 
int a2 = power(a, n/2); 
if (n & 1) return a*a2*a2; 
else return a2*a2; 
} 
}
Пример: pow(x,y) 95 
http://freehabr.ru/blog/programming/1933.html 
int power(int a, int n) { 
assert(n > 0 || (a != 0 || n != 0)); 
if (n == 0) return 1; 
else { 
int a2 = power(a, n/2); 
if (n & 1) return a*a2*a2; 
else return a2*a2; 
} 
}
pow(x,y) - итерация 96 
int power(int a, int n) { 
assert(n > 0 || (a != 0 || n != 0)); 
int r = 1, a0 = a, n0 = n; 
/* r == 1 and a0 == a and n0 == n and n >= 0 
инвариант_цикла: a0**n0 == r*a**n 
ограничивающая_функция(n): n */
pow(x,y) - итерация 97 
while(n > 0) { 
/* n > 0 and ограничивающая_функция(n) > 0 
and инвариант_цикла */ 
if (n & 1) r *= a; 
/* (n - нечетно and a0**n0*a == r*a**n) or 
инвариант_цикла */ 
n >>= 1;
pow(x,y) - итерация 98 
/* n == 0 
and инвариант_цикла 
and ограничивающая_функция(n) == 0 */ 
// a0**n0 == r 
return r; 
}
Очень трудно! 99 
Правило композиции 
{P} S {Q}, {Q} T {R} ╞ {P} S;T {R} 
Проверку каждого оператора 
заменить на проверку группы 
операторов
Контрактное программирование 100 
 Инвариант 
 Предусловие 
 Постусловие
Следствия 101 
Конструктор используется для 
инвариантов класса
Следствия 102 
Конструктор используется для 
инвариантов класса 
При нарушении условия выбрасывается 
исключение
Следствия 103 
Конструктор используется для 
инвариантов класса 
При нарушении условия выбрасывается 
исключение 
Техника RAII
Следствия 104 
Конструктор используется для 
инвариантов класса 
При нарушении условия выбрасывается 
исключение 
Техника RAII 
Модульное тестирование
Модульное тестирование 105 
Это всего лишь 
автоматизация 
проверки контракта
Модульное тестирование 106 
1. Arrange 
2. Act 
3. Assert
Пример теста 107 
Библиотека Nunit 
using NUnit.Framework; 
[TestFixture] 
public class Tests { 
[Test] 
public void testStringReverse() { 
String input = "abc"; 
String result = Util.reverse(input); 
Assert.AreEquals("cba", result); 
}
Схема теста состояния 108
Недостатки 109 
Тестирование основанное на состояниях: 
• Требует знания о внутреннем состоянии 
объекта –возможно нарушение 
инкапсуляции 
• Нарушает принципы ООП 
• Некоторые вещи трудно тестировать: 
закрытые свойства и методы, 
алгоритмическую сложность
Но! А как же инкапсуляция? 110 
Надо тестировать 
не состояние, а 
поведение!
Как тестировать поведение? 111 
Полиморфизм: подменяя 
поведение серверного кода 
тестируем поведение 
клиентского
Что тестировать? 112 
Был ли вызван метод? 
Сколько раз был вызван? 
Порядок вызова методов 
С какими параметрами? 
Что вернул на выходе? 
Выбросил ли исключение?
Пример Mock-теста 113 
Библиотеки NUnit, Moq 
[TestFixture] 
public class ActorTests 
{ 
MockRepository repository = new MockRepository(MockBehavior.Strict); 
IMessage message; 
[Test] 
public void AnActorShouldHandleAMessage() 
{ 
Mock<Actor> actor = repository.Create<Actor>(); 
actor.Setup(a => a.Handle(message)).Verifiable(); 
actor.Object.Receive(message); 
actor.VerifyAll(); 
} 
}
Mock-тесты схема 114
Необходимое условие 1 115 
Принцип подстановки Лисков 
Функции, которые используют 
ссылки на базовые классы, должны 
иметь возможность 
использовать объекты 
производных классов, не зная об 
этом.
Необходимое условие 2 116 
Принцип обращения зависимостей 
Высокоуровневые компоненты не 
должны зависеть от низкоуровневых 
компонент. И те, и те должны 
зависеть от абстракций. 
Абстракции не должны зависеть от 
деталей. Детали должны зависеть от 
абстракций.

More Related Content

What's hot

Использование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиИспользование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработки
victor-yastrebov
 

What's hot (20)

ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
 
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
 
ПВТ - весна 2015 - Лекция 6. Разработка параллельных структур данных на основ...
ПВТ - весна 2015 - Лекция 6. Разработка параллельных структур данных на основ...ПВТ - весна 2015 - Лекция 6. Разработка параллельных структур данных на основ...
ПВТ - весна 2015 - Лекция 6. Разработка параллельных структур данных на основ...
 
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMДмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
 
Parallel STL
Parallel STLParallel STL
Parallel STL
 
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловПолухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
 
Zagursky
ZagurskyZagursky
Zagursky
 
Григорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизацияГригорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизация
 
Использование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиИспользование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработки
 
Догнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_castДогнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_cast
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
 
Антон Полухин, Немного о Boost
Антон Полухин, Немного о BoostАнтон Полухин, Немного о Boost
Антон Полухин, Немного о Boost
 
Григорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптерГригорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптер
 
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...
 
Concepts lite
Concepts liteConcepts lite
Concepts lite
 
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.
 
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
 
ПВТ - весна 2015 - Лекция 7. Модель памяти С++. Внеочередное выполнение инстр...
ПВТ - весна 2015 - Лекция 7. Модель памяти С++. Внеочередное выполнение инстр...ПВТ - весна 2015 - Лекция 7. Модель памяти С++. Внеочередное выполнение инстр...
ПВТ - весна 2015 - Лекция 7. Модель памяти С++. Внеочередное выполнение инстр...
 
course js day 2
course js day 2course js day 2
course js day 2
 
Максим Хижинский Lock-free maps
Максим Хижинский Lock-free mapsМаксим Хижинский Lock-free maps
Максим Хижинский Lock-free maps
 

Similar to разработка серверов и серверных приложений лекция №3

Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кода
Andrey Karpov
 
чернякова г.в.
чернякова г.в.чернякова г.в.
чернякова г.в.
sharikdp
 

Similar to разработка серверов и серверных приложений лекция №3 (20)

Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVM
 
Как приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMКак приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVM
 
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
 
Java 8 puzzlers
Java 8 puzzlersJava 8 puzzlers
Java 8 puzzlers
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кода
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMP
 
основы Java переменные, циклы
основы Java   переменные, циклыосновы Java   переменные, циклы
основы Java переменные, циклы
 
Сверхоптимизация кода на Python
Сверхоптимизация кода на PythonСверхоптимизация кода на Python
Сверхоптимизация кода на Python
 
Сверхоптимизация кода на Python
Сверхоптимизация кода на PythonСверхоптимизация кода на Python
Сверхоптимизация кода на Python
 
чернякова г.в.
чернякова г.в.чернякова г.в.
чернякова г.в.
 
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
 
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон ПолухинC++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-Studio
 
JavaDay'14
JavaDay'14JavaDay'14
JavaDay'14
 
Lambdas in java 8
Lambdas in java 8Lambdas in java 8
Lambdas in java 8
 
8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)
 
Charming python sc2-8
Charming python sc2-8Charming python sc2-8
Charming python sc2-8
 
Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3
 
ПВТ - осень 2014 - Лекция 3 - Стандарт POSIX Threads
ПВТ - осень 2014 - Лекция 3 - Стандарт POSIX ThreadsПВТ - осень 2014 - Лекция 3 - Стандарт POSIX Threads
ПВТ - осень 2014 - Лекция 3 - Стандарт POSIX Threads
 

разработка серверов и серверных приложений лекция №3

  • 1. Глава 3. Модель акторов. 30
  • 2. Литература 65 Actors: A Model of Concurrent Computations in Distributed Systems PhD thesis, 1985 Gul A. Agha
  • 3. Task 66 1. Tag (уникальный идентификатор) 2. Target (mail address) 3. Communication (данные)
  • 4. Абстракция актора 67 1.Mail address 2.Large mail queue 3.Behavior
  • 5. Шаг вычислений 68 1.Отправить сообщения 2.Создать новые акторы 3.Изменить свое поведение для приема следующего сообщения (become method)
  • 7. Обмен сообщениями 70 1. Каналы 2. Сообщения 3. Фильтры 4. Маршрутизация 5. Преобразование 6. Конечные точки
  • 11. Конечные точки 74 http://www.eaipatterns.com/MessageEndpoint.html
  • 12. Глава 4. Важно знать. 75
  • 13. Репозиторий GitHub 76 Библиотека акторов, котрая будет написана в рамках спецкурса выложена по адресу https://github.com/hwdtech/HWdTech.DS
  • 14. S.O.L.I.D 77 • The Open-Closed Principle • The Liskov Substitution Principle • The Interface Segregation Principle • The Dependency Inversion Principle • The Single Responsibility Principle objectmentor.com Rob Martin (Uncle Bob)
  • 15. The Open-Closed Principle 78 Программные объекты должны быть открыты для расширения, но в тоже время закрыты для модификации
  • 16. Открытые vs закрытые 79 • Полиморфная операция • Паттерны • DI контейнеры • Код, ген. по метаописанию • switch • If /else – if/else • Неполиморфная операция • операторы приведения типа • enum
  • 17. Открытые vs закрытые 80 • Полиморфная операция • Паттерны • DI контейнеры • Код, ген. по метаописанию • … • Магические константы • Copy-paste • Public поля • Глобальные переменные
  • 18. Открытые vs закрытые 81 • Полиморфная операция • Паттерны • DI контейнеры • Код, ген. по метаописанию • … • Магические константы • Copy-paste • Public поля • Глобальные переменные
  • 19. Программа Copy вер. 1 82 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); } }
  • 20. Программа Copy вер. 2 83 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); }
  • 21. Все дело в зависимостях 84
  • 22. The Dependency Inversion Principle85 Высокоуровневые компоненты не должны зависеть от низкоуровневых компонент. И те, и те должны зависеть от абстракций. Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.
  • 26. Абстрактная фабрика 89 void Copy( IReader r, IWriter w ) { int c; while((c=r.Read()) != EOF) w.Write(c); }
  • 27. DI Container Autofac 90 var builder = new ContainerBuilder(); builder.RegisterType<LibraryBook>().As<IBook>(); builder.RegisterType<MainViewModel>().AsSelf(); var container = builder.Build(); var model = container.Resolve<MainViewModel>(); var view = new MainWindow (DataContext = model); view.Show();
  • 28. Логика Хоара 91 Тройка Хоара {pred} statement {post} Пример: Чарльз Хоар {x+1 == 43} y=x+1; {y == 43 ^ x == 42}
  • 29. Аксиомы и правила логики Хоара 92 Аксиома пустого оператора {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}
  • 30. Аксиомы и правила логики Хоара 93 Аксиома пустого оператора {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}
  • 31. Пример: pow(x,y) 94 http://freehabr.ru/blog/programming/1933.html int power(int a, int n) { assert(n > 0 || (a != 0 || n != 0)); if (n == 0) return 1; else { int a2 = power(a, n/2); if (n & 1) return a*a2*a2; else return a2*a2; } }
  • 32. Пример: pow(x,y) 95 http://freehabr.ru/blog/programming/1933.html int power(int a, int n) { assert(n > 0 || (a != 0 || n != 0)); if (n == 0) return 1; else { int a2 = power(a, n/2); if (n & 1) return a*a2*a2; else return a2*a2; } }
  • 33. pow(x,y) - итерация 96 int power(int a, int n) { assert(n > 0 || (a != 0 || n != 0)); int r = 1, a0 = a, n0 = n; /* r == 1 and a0 == a and n0 == n and n >= 0 инвариант_цикла: a0**n0 == r*a**n ограничивающая_функция(n): n */
  • 34. pow(x,y) - итерация 97 while(n > 0) { /* n > 0 and ограничивающая_функция(n) > 0 and инвариант_цикла */ if (n & 1) r *= a; /* (n - нечетно and a0**n0*a == r*a**n) or инвариант_цикла */ n >>= 1;
  • 35. pow(x,y) - итерация 98 /* n == 0 and инвариант_цикла and ограничивающая_функция(n) == 0 */ // a0**n0 == r return r; }
  • 36. Очень трудно! 99 Правило композиции {P} S {Q}, {Q} T {R} ╞ {P} S;T {R} Проверку каждого оператора заменить на проверку группы операторов
  • 37. Контрактное программирование 100  Инвариант  Предусловие  Постусловие
  • 38. Следствия 101 Конструктор используется для инвариантов класса
  • 39. Следствия 102 Конструктор используется для инвариантов класса При нарушении условия выбрасывается исключение
  • 40. Следствия 103 Конструктор используется для инвариантов класса При нарушении условия выбрасывается исключение Техника RAII
  • 41. Следствия 104 Конструктор используется для инвариантов класса При нарушении условия выбрасывается исключение Техника RAII Модульное тестирование
  • 42. Модульное тестирование 105 Это всего лишь автоматизация проверки контракта
  • 43. Модульное тестирование 106 1. Arrange 2. Act 3. Assert
  • 44. Пример теста 107 Библиотека Nunit using NUnit.Framework; [TestFixture] public class Tests { [Test] public void testStringReverse() { String input = "abc"; String result = Util.reverse(input); Assert.AreEquals("cba", result); }
  • 46. Недостатки 109 Тестирование основанное на состояниях: • Требует знания о внутреннем состоянии объекта –возможно нарушение инкапсуляции • Нарушает принципы ООП • Некоторые вещи трудно тестировать: закрытые свойства и методы, алгоритмическую сложность
  • 47. Но! А как же инкапсуляция? 110 Надо тестировать не состояние, а поведение!
  • 48. Как тестировать поведение? 111 Полиморфизм: подменяя поведение серверного кода тестируем поведение клиентского
  • 49. Что тестировать? 112 Был ли вызван метод? Сколько раз был вызван? Порядок вызова методов С какими параметрами? Что вернул на выходе? Выбросил ли исключение?
  • 50. Пример Mock-теста 113 Библиотеки NUnit, Moq [TestFixture] public class ActorTests { MockRepository repository = new MockRepository(MockBehavior.Strict); IMessage message; [Test] public void AnActorShouldHandleAMessage() { Mock<Actor> actor = repository.Create<Actor>(); actor.Setup(a => a.Handle(message)).Verifiable(); actor.Object.Receive(message); actor.VerifyAll(); } }
  • 52. Необходимое условие 1 115 Принцип подстановки Лисков Функции, которые используют ссылки на базовые классы, должны иметь возможность использовать объекты производных классов, не зная об этом.
  • 53. Необходимое условие 2 116 Принцип обращения зависимостей Высокоуровневые компоненты не должны зависеть от низкоуровневых компонент. И те, и те должны зависеть от абстракций. Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.