SlideShare a Scribd company logo
1 of 62
Еще раз про S.O.L.I.D 
Математическое обоснование или 
почему Вы не можете их 
игнорировать
Докладчик 
Тюменцев Евгений 
14 лет преподаю 
ИМИТ, ФКН ОмГУ 
ИТ-компании 
Школа программиста 
10 лет разрабатываю ПО 
разработчик, архитектор 
PM, насяльника
1. Факты из логики
Импликация → 
y y x→y 
0 0 1 
0 1 1 
1 0 0 
1 1 1
Интерпретация для множеств 
A 
B
Общезначимая формула 
╞ P 
Примеры: ╞ x V x’, ╞ P → P
Отношение следования 
P╞ Q 
x y P Q 
0 0 1 0 
0 1 0 0 
1 0 1 1 
1 1 1 1
Выводимость 
Пусть L – множество формул, B – формула. 
Тогда L ⊦ B, если ∃ B1, B2, …, Bn , что 
1.Bn – это B, 
2.Bi – это 
либо формула из L, 
либо аксиома, 
либо общезначимая 
формула, 
либо формула полученная 
при
Аксиомы исчисления 
высказываний
Modus Ponens (правило вывода)
2. Логика Хоара
Об авторе 
1969 г. An Axiomatic Basis for Computer 
Programming 
1971 г. Procedures and Parameters: An 
Axiomatic Approach 
1980 г. премия Тьюринга 
1990 г. Медаль “Пионер компьютерной 
техники” 
2000 г. рыцарский титул за заслуги в 
области образования и компьютерной 
техники, премия Киото 
Чарльз Хоар
Тройка Хоара 
{pred} statement {post} 
Пример: {x == 42} y=x+1; {y == 43 ^ x == 42}
Аксиома пустого оператора 
{P} skip {P}
Аксиома присваивания 
{P[E/x]} x := E {P} 
Пример: {(y+1)*3+w*(y+1+3) ==z} 
x=y+1; 
{ x*3+ w*(x+3)==z}
Аксиомы оператора цикла 
{P ^ B} S {P} {P} while ╞ B do S done {B’ ^ P}
Аксиомы условного оператора 
{B ^ P} S {Q}, {B’ ^P} T {Q} {P} ╞ if B then S else T endif {Q} 
{B ^ P} S {Q}╞ {P} if B then S endif {Q}
Аксиомы вывода 
P1 → P, {P} S {Q}, Q → Q1 ╞ {P1} S {Q1} 
P1 → P, {P} S {Q} ╞ {P1} S {Q} 
{P} S {Q}, Q → Q1 ╞ {P} S {Q1}
Аксиома вывода согласуется с 
условным оператором 
Пусть L = {{P} f {Q}}, B – предикат. 
P^B→P (A3 исчисления 
высказываний) 
{P^B}f{Q} (аксиома вывода) 
{P}if (B) then f endif {Q} (аксиома условного 
оператора)
Неявные предположения 
{P ^ B} с {Q} 
{P} assert(B); c {Q}
Упрощение кода и аксиома вывода 
node* insert(node& c, int v) { 
node *n = new node; 
n -> val = v; 
if(c.next) { 
n -> next = c.next; 
} 
else { 
n -> next = 0; 
} 
c.next = n; 
return n; 
} 
null
Как упростить операцию insert?
Закольц. список с буф. элементом 
node* insert(node& c, int v) { 
node *n = new node; 
n -> val = v; 
if(c.next) { 
n -> next = c.next; 
} 
else { 
n -> next = 0; 
} 
c.next = n; 
return n; 
}
Закольц. список с буф. элементом 
node* insert_before(node& c, int v) { 
node *n = new node; 
n -> val = v; 
n -> next = c.next; 
c.next = n; 
return n; 
}
Распараллеливание алгоритмов 
Lock-free алгоритмы 
Ослабленные 
утверждения
Аксиома композиции 
{P} S {Q}, {Q} T {R} ╞ {P} S;T {R}
Контрактное программирование 
• Предусловия 
• Постусловия 
• Инварианты
Модульные тесты 
Arrange 
Act 
Assert
3. S.O.L.I.D
Повторное использование 
Повторное использование кода — методология 
проектирования компьютерных и других систем, 
заключающаяся в том, что система (компьютерная 
программа, программный модуль) частично либо 
полностью должна составляться из частей, написанных 
ранее компонентов и/или частей другой системы, и 
эти компоненты должны применяться более одного 
раза (если не в рамках одного проекта, то хотя бы 
разных). 
https://ru.wikipedia.org/wiki/Повторное_использование_кода
А можно ли по-другому? 
Выводимость прямо предписывает строить 
новые тройки из предыдущих!
Когда происходит повторное 
использование? 
Если нужно внести изменение в 
существующее приложение, то мы пытаемся 
повторно использовать свой же собственный 
код, чтобы получить тоже приложение, но с 
новой функциональностью.
Чем грозят правки кода? 
B1, B2, …, A1 
B3, A1, …, A2 
B5, A2, …, A3 
A2, B6, …, A4 
A2, A4, …, A5
Чем грозят правки кода? 
B1, B2, …, A1 
B3, A1, …, A2 
B5, A2, …, A3 
A2, B6, …, A4 
A2, A4, …, A5
Матрицы 
class matrix { 
int size; 
double *body; 
public: 
matrix(int s): size(s) { 
body = new double[s*s]; 
} 
void transform() { 
… 
} 
double det() const { 
… 
} 
};
Матрицы: добавляем matrix() 
class matrix { 
int size; 
double *body; 
public: 
matrix(int s): size(s) { 
body = new double[s*s]; 
} 
void transform() { 
… 
} 
double det() const { 
… 
} 
}; 
class matrix { 
public: 
matrix(): size(0), body(0) { 
} 
};
Придется изменять методы 
class matrix { 
int size; 
double *body; 
public: 
matrix(): size(0), body(0) { 
} 
matrix(int s): size(s) { 
body = new double[s*s]; 
} 
void transform() { 
if(!body) throw exception(); 
… 
} 
double det() const { 
if(!body) throw exception(); 
… 
} 
};
Что случилось 
Инвариант класса matrix: size > 0 
Конструктор matrix() нарушил инвариант: size = 0 
Предусловия методов изменились с size > 0 на size ≥ 0, но 
{size ≥ 0} det {Q} не выводится из {size > 0} det {Q} 
Следовательно, надо изменять сами методы
Конструкторы по умолчанию 
Конструктор должен устанавливать 
инвариант класса 
Конструкторы по умолчанию часто этого не 
делают 
Стоит несколько раз подумать, прежде чем 
использовать конструктор по умолчанию
The Open-Closed Principle 
Программные объекты должны быть 
открыты для расширения, но в тоже время 
закрыты для модификации
Импликация на множестве 
Пусть P1 → P, 
B = { x | P1(x) = 1}, 
A = { x | P (x) = 1}. 
Тогда B ⊂ A. 
P ⊨ P1. Говорят, что P – 
более слабое условие, 
P1 – более сильное. 
A 
B
Построим вывод 
{S} cb {P}, {P} c {Q}, {Q} ca {R} ⊦ {S} cb; c; ca {R} 
Пусть P → P1, Q1 → Q 
Известно, что 
{S} cb {P}, {P1} c {Q1}, {Q} ca {R} 
Тогда 
{P} c {Q} (аксиома вывода) 
{S} cb; c; ca {R}
Иначе 
{S} cb {P}, {P} c {Q}, {Q} ca {R} ⊦ {S} cb; c; ca {R} 
Пусть P ↛ P1, но P ^ P1 → P1 
Известно, что 
{S} cb {P}, {P1} c {Q}, {Q} ca {R} 
Тогда 
{P1} c {Q} ⊦ {P} if (P1) then c endif {Q} 
{S} cb; if(P1) then c endif; ca {R}
The Dependency Inversion 
Principle 
Высокоуровневые компоненты не должны 
зависеть от низкоуровневых компонент. И 
те, и те должны зависеть от абстракций 
(оператора расширения).
Правило оператора расширения 
Оператор расширения должен допускать: 
1. Ослабление предусловий 
2. Усиление постусловий
Воронка – метафора для 
расширения
Как выглядит расширение? 
1. Статический полиморфизм 
template <class It, class Op> 
void for_each(It begin, It end, Op op) 
{ 
for(; begin != end; ++begin) 
op(*begin); 
} 
int arr[] = {1, 2, 3, 4, 5}; 
for_each(arr, arr+6, max<int>());
Как выглядит расширение? 
2. Во время выполнения 
– указатель на функцию 
void (*f) (int i); 
f pf; 
pf(5); 
– динамический полиморфизм 
class Shape { 
public: 
virtual void Draw() = 0; 
}; 
shape->Draw();
Что такое класс? 
Это набор методов, возможно полиморфных
The Liskov-Substitution Principle 
Функции, которые используют ссылки на 
базовые классы, должны иметь 
возможность использовать объекты 
производных классов, не зная об этом.
Нарушение OCP, LSP 
enum 
switch 
if-else if-else 
Операторы приведения типа
Несколько операторов 
расширения
Жирный интерфейс
The Interface Segregation Principle 
Класс не должен зависеть от интерфейсов, 
которые он не использует
А не для классов? 
bool (*validator) (Document const & doc); 
std::vector<validator> rules = …; 
for (int i = 0; i < n; ++i) 
if(!rules[i](document)) 
return false; 
return true;
В каком случае гарантированно удастся 
избежать жирного интерфейса?
The Single Responsibility Principle 
Должна быть ровно 
одна причина для 
изменения класса
А как же функциональщина?
В акторной модели не работают? 
Тезис Ковальского 
Hewitt, Agha 1988 
«Вычисления могут 
Guarded Horn clause 
быть сгруппированы 
languages: are they 
по логическим 
deductive and Logical? 
выводам» 
Clinger 1981 
Foundations Of Actor 
Semantics
Приглашаю на баркемп 
7 декабря 
11-00
Мы пишем книги 
Нерассказанные факты об императивном 
программировании 
oopguide.ru 
Разработка серверов и серверных 
приложений 
actorsmodelguide.ru
Спасибо 
Тюменцев Евгений 
Директор HWdTech, LLC 
Звоните: +7 913 150 22 04 
Пишите: etyumentcev@gmail.com 
hwdtech.ru

More Related Content

What's hot

Лекция 2 Сортировки, поиск и порядковые статистики
Лекция 2 Сортировки, поиск и порядковые статистикиЛекция 2 Сортировки, поиск и порядковые статистики
Лекция 2 Сортировки, поиск и порядковые статистикиsimple_people
 
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программированияПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программированияAlexey Paznikov
 
Лекция №3. Свойства и моделирование стандартных схем программ. Предмет "Теори...
Лекция №3. Свойства и моделирование стандартных схем программ. Предмет "Теори...Лекция №3. Свойства и моделирование стандартных схем программ. Предмет "Теори...
Лекция №3. Свойства и моделирование стандартных схем программ. Предмет "Теори...Nikolay Grebenshikov
 
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...corehard_by
 
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...Alexey Paznikov
 
О-символика
О-символикаО-символика
О-символикаDEVTYPE
 
Лекция 11: Методы разработки алгоритмов
Лекция 11: Методы разработки алгоритмовЛекция 11: Методы разработки алгоритмов
Лекция 11: Методы разработки алгоритмовMikhail Kurnosov
 
Лекция 11 Приближенные алгоритмы
Лекция 11 Приближенные алгоритмыЛекция 11 Приближенные алгоритмы
Лекция 11 Приближенные алгоритмыsimple_people
 
чернякова г.в.
чернякова г.в.чернякова г.в.
чернякова г.в.sharikdp
 
2015-04-12 07 Евгений Тюменцев. Зачем программисту нужно знать математику?
2015-04-12 07 Евгений Тюменцев. Зачем программисту нужно знать математику?2015-04-12 07 Евгений Тюменцев. Зачем программисту нужно знать математику?
2015-04-12 07 Евгений Тюменцев. Зачем программисту нужно знать математику?HappyDev
 
практика 4
практика 4практика 4
практика 4student_kai
 
Лекция 12: Методы разработки алгоритмов. Динамическое программирование. Жадны...
Лекция 12: Методы разработки алгоритмов. Динамическое программирование. Жадны...Лекция 12: Методы разработки алгоритмов. Динамическое программирование. Жадны...
Лекция 12: Методы разработки алгоритмов. Динамическое программирование. Жадны...Mikhail Kurnosov
 
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.Roman Orlov
 
19 pascal urok_3
19 pascal urok_319 pascal urok_3
19 pascal urok_3Ann Eres
 

What's hot (18)

Урок 8. Введение в редукцию графов
Урок 8. Введение в редукцию графовУрок 8. Введение в редукцию графов
Урок 8. Введение в редукцию графов
 
Урок 6. Чистое лямбда-исчисление.
Урок 6. Чистое лямбда-исчисление. Урок 6. Чистое лямбда-исчисление.
Урок 6. Чистое лямбда-исчисление.
 
Лекция 2 Сортировки, поиск и порядковые статистики
Лекция 2 Сортировки, поиск и порядковые статистикиЛекция 2 Сортировки, поиск и порядковые статистики
Лекция 2 Сортировки, поиск и порядковые статистики
 
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программированияПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
 
Лекция №3. Свойства и моделирование стандартных схем программ. Предмет "Теори...
Лекция №3. Свойства и моделирование стандартных схем программ. Предмет "Теори...Лекция №3. Свойства и моделирование стандартных схем программ. Предмет "Теори...
Лекция №3. Свойства и моделирование стандартных схем программ. Предмет "Теори...
 
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
 
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
 
О-символика
О-символикаО-символика
О-символика
 
структура программы
структура программыструктура программы
структура программы
 
Лекция 11: Методы разработки алгоритмов
Лекция 11: Методы разработки алгоритмовЛекция 11: Методы разработки алгоритмов
Лекция 11: Методы разработки алгоритмов
 
Лекция 11 Приближенные алгоритмы
Лекция 11 Приближенные алгоритмыЛекция 11 Приближенные алгоритмы
Лекция 11 Приближенные алгоритмы
 
чернякова г.в.
чернякова г.в.чернякова г.в.
чернякова г.в.
 
2015-04-12 07 Евгений Тюменцев. Зачем программисту нужно знать математику?
2015-04-12 07 Евгений Тюменцев. Зачем программисту нужно знать математику?2015-04-12 07 Евгений Тюменцев. Зачем программисту нужно знать математику?
2015-04-12 07 Евгений Тюменцев. Зачем программисту нужно знать математику?
 
практика 4
практика 4практика 4
практика 4
 
паскаль
паскальпаскаль
паскаль
 
Лекция 12: Методы разработки алгоритмов. Динамическое программирование. Жадны...
Лекция 12: Методы разработки алгоритмов. Динамическое программирование. Жадны...Лекция 12: Методы разработки алгоритмов. Динамическое программирование. Жадны...
Лекция 12: Методы разработки алгоритмов. Динамическое программирование. Жадны...
 
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.
 
19 pascal urok_3
19 pascal urok_319 pascal urok_3
19 pascal urok_3
 

Similar to 2014.12.06 04 Евгений Тюменцев — Откуда появились s.o.l.i.d. принципы

Математическое обоснование SOLID принципов - Евгений Тюменцев Dev2Dev v2.0 30...
Математическое обоснование SOLID принципов - Евгений Тюменцев Dev2Dev v2.0 30...Математическое обоснование SOLID принципов - Евгений Тюменцев Dev2Dev v2.0 30...
Математическое обоснование SOLID принципов - Евгений Тюменцев Dev2Dev v2.0 30...Dev2Dev
 
07 HappyDev-lite-2015 spring. Евгений Тюменцев. Зачем программисту нужно зна...
07 HappyDev-lite-2015 spring. Евгений Тюменцев. Зачем программисту нужно зна...07 HappyDev-lite-2015 spring. Евгений Тюменцев. Зачем программисту нужно зна...
07 HappyDev-lite-2015 spring. Евгений Тюменцев. Зачем программисту нужно зна...HappyDev-lite
 
математическое обоснование Solid принципов. Конференция dotnetconf (Челябинск...
математическое обоснование Solid принципов. Конференция dotnetconf (Челябинск...математическое обоснование Solid принципов. Конференция dotnetconf (Челябинск...
математическое обоснование Solid принципов. Конференция dotnetconf (Челябинск...etyumentcev
 
разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3Eugeniy Tyumentcev
 
разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3etyumentcev
 
Python и его тормоза
Python и его тормозаPython и его тормоза
Python и его тормозаAlexander Shigin
 
ITMO RecSys course. Autumn 2014. Lecture 6
ITMO RecSys course. Autumn 2014. Lecture 6ITMO RecSys course. Autumn 2014. Lecture 6
ITMO RecSys course. Autumn 2014. Lecture 6Andrey Danilchenko
 
Характерные черты функциональных языков программирования
Характерные черты функциональных языков программированияХарактерные черты функциональных языков программирования
Характерные черты функциональных языков программированияAlex.Kolonitsky
 
Discovering Lambdas in Java 8
Discovering Lambdas in Java 8Discovering Lambdas in Java 8
Discovering Lambdas in Java 8Stfalcon Meetups
 
Статический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановСтатический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановYandex
 
Теория. Сложные условия в операторе сравнения
Теория. Сложные условия в операторе сравненияТеория. Сложные условия в операторе сравнения
Теория. Сложные условия в операторе сравненияAlexandr Grigorenko
 
C# Desktop. Занятие 03.
C# Desktop. Занятие 03.C# Desktop. Занятие 03.
C# Desktop. Занятие 03.Igor Shkulipa
 
Статический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановСтатический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановYandex
 
особенности программирования на с++
особенности программирования на с++особенности программирования на с++
особенности программирования на с++mcroitor
 
О SOLID-ности
О SOLID-ностиО SOLID-ности
О SOLID-ностиCEE-SEC(R)
 
основы Java переменные, циклы
основы Java   переменные, циклыосновы Java   переменные, циклы
основы Java переменные, циклыSergey Nemchinsky
 
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...OdessaFrontend
 
Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"Fwdays
 

Similar to 2014.12.06 04 Евгений Тюменцев — Откуда появились s.o.l.i.d. принципы (20)

Математическое обоснование SOLID принципов - Евгений Тюменцев Dev2Dev v2.0 30...
Математическое обоснование SOLID принципов - Евгений Тюменцев Dev2Dev v2.0 30...Математическое обоснование SOLID принципов - Евгений Тюменцев Dev2Dev v2.0 30...
Математическое обоснование SOLID принципов - Евгений Тюменцев Dev2Dev v2.0 30...
 
07 HappyDev-lite-2015 spring. Евгений Тюменцев. Зачем программисту нужно зна...
07 HappyDev-lite-2015 spring. Евгений Тюменцев. Зачем программисту нужно зна...07 HappyDev-lite-2015 spring. Евгений Тюменцев. Зачем программисту нужно зна...
07 HappyDev-lite-2015 spring. Евгений Тюменцев. Зачем программисту нужно зна...
 
математическое обоснование Solid принципов. Конференция dotnetconf (Челябинск...
математическое обоснование Solid принципов. Конференция dotnetconf (Челябинск...математическое обоснование Solid принципов. Конференция dotnetconf (Челябинск...
математическое обоснование Solid принципов. Конференция dotnetconf (Челябинск...
 
разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3
 
разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3
 
Python и его тормоза
Python и его тормозаPython и его тормоза
Python и его тормоза
 
ITMO RecSys course. Autumn 2014. Lecture 6
ITMO RecSys course. Autumn 2014. Lecture 6ITMO RecSys course. Autumn 2014. Lecture 6
ITMO RecSys course. Autumn 2014. Lecture 6
 
Характерные черты функциональных языков программирования
Характерные черты функциональных языков программированияХарактерные черты функциональных языков программирования
Характерные черты функциональных языков программирования
 
Discovering Lambdas in Java 8
Discovering Lambdas in Java 8Discovering Lambdas in Java 8
Discovering Lambdas in Java 8
 
Статический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановСтатический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий Леванов
 
Теория. Сложные условия в операторе сравнения
Теория. Сложные условия в операторе сравненияТеория. Сложные условия в операторе сравнения
Теория. Сложные условия в операторе сравнения
 
C# Desktop. Занятие 03.
C# Desktop. Занятие 03.C# Desktop. Занятие 03.
C# Desktop. Занятие 03.
 
Статический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановСтатический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий Леванов
 
особенности программирования на с++
особенности программирования на с++особенности программирования на с++
особенности программирования на с++
 
О SOLID-ности
О SOLID-ностиО SOLID-ности
О SOLID-ности
 
Синтез функциональных программ при помощи метода дедуктивных таблиц
Синтез функциональных программ при помощи метода дедуктивных таблицСинтез функциональных программ при помощи метода дедуктивных таблиц
Синтез функциональных программ при помощи метода дедуктивных таблиц
 
основы Java переменные, циклы
основы Java   переменные, циклыосновы Java   переменные, циклы
основы Java переменные, циклы
 
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
 
Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"
 
Урок 7. Интерпретация и компиляция функциональных программ.
Урок 7. Интерпретация и компиляция функциональных программ.Урок 7. Интерпретация и компиляция функциональных программ.
Урок 7. Интерпретация и компиляция функциональных программ.
 

More from HappyDev

2015-12-06 Aнтон Непомнящих - Принципы канбан и теории ограничений на примере...
2015-12-06 Aнтон Непомнящих - Принципы канбан и теории ограничений на примере...2015-12-06 Aнтон Непомнящих - Принципы канбан и теории ограничений на примере...
2015-12-06 Aнтон Непомнящих - Принципы канбан и теории ограничений на примере...HappyDev
 
2015-12-05 Антон Непомнящих - Agile — как уложиться в сроки и бюджет?
2015-12-05 Антон Непомнящих - Agile — как уложиться в сроки и бюджет?2015-12-05 Антон Непомнящих - Agile — как уложиться в сроки и бюджет?
2015-12-05 Антон Непомнящих - Agile — как уложиться в сроки и бюджет?HappyDev
 
2015 12-05 Александр Шиповалов - Инструмент для тестирования Sikuli script
2015 12-05 Александр Шиповалов - Инструмент для тестирования Sikuli script2015 12-05 Александр Шиповалов - Инструмент для тестирования Sikuli script
2015 12-05 Александр Шиповалов - Инструмент для тестирования Sikuli scriptHappyDev
 
2015-12-06 Константин Борисов - Как собеседовать программиста?
2015-12-06 Константин Борисов - Как собеседовать программиста?2015-12-06 Константин Борисов - Как собеседовать программиста?
2015-12-06 Константин Борисов - Как собеседовать программиста?HappyDev
 
2015-12-05 Данил Никифоров - NoSQL для мобайла с синхронизацией данных
2015-12-05 Данил Никифоров - NoSQL для мобайла с синхронизацией данных2015-12-05 Данил Никифоров - NoSQL для мобайла с синхронизацией данных
2015-12-05 Данил Никифоров - NoSQL для мобайла с синхронизацией данныхHappyDev
 
2015-12-06 Букуров Алексей - Автоматическое формирование интерфейса по метаоп...
2015-12-06 Букуров Алексей - Автоматическое формирование интерфейса по метаоп...2015-12-06 Букуров Алексей - Автоматическое формирование интерфейса по метаоп...
2015-12-06 Букуров Алексей - Автоматическое формирование интерфейса по метаоп...HappyDev
 
2015-12-06 Евгений Тюменцев - Практики разработки серверных приложений
2015-12-06 Евгений Тюменцев - Практики разработки серверных приложений2015-12-06 Евгений Тюменцев - Практики разработки серверных приложений
2015-12-06 Евгений Тюменцев - Практики разработки серверных приложенийHappyDev
 
2015-12-06 Александр Чернышев - Технологии открытости мобильных приложений
2015-12-06 Александр Чернышев - Технологии открытости мобильных приложений2015-12-06 Александр Чернышев - Технологии открытости мобильных приложений
2015-12-06 Александр Чернышев - Технологии открытости мобильных приложенийHappyDev
 
2015-12-05 Вадим Литвинов - Нагрузочное тестирование с MZBench
2015-12-05 Вадим Литвинов - Нагрузочное тестирование с MZBench2015-12-05 Вадим Литвинов - Нагрузочное тестирование с MZBench
2015-12-05 Вадим Литвинов - Нагрузочное тестирование с MZBenchHappyDev
 
2015-12-05 Александр Шиповалов - Веселые картинки в тестировании
2015-12-05 Александр Шиповалов - Веселые картинки в тестировании2015-12-05 Александр Шиповалов - Веселые картинки в тестировании
2015-12-05 Александр Шиповалов - Веселые картинки в тестированииHappyDev
 
2015-12-05 Александр Бындю, Андрей Шапиро - Пять самых важных составляющих пр...
2015-12-05 Александр Бындю, Андрей Шапиро - Пять самых важных составляющих пр...2015-12-05 Александр Бындю, Андрей Шапиро - Пять самых важных составляющих пр...
2015-12-05 Александр Бындю, Андрей Шапиро - Пять самых важных составляющих пр...HappyDev
 
2015-12-05 Александр Коротков, Иван Панченко - Слабо-структурированные данные...
2015-12-05 Александр Коротков, Иван Панченко - Слабо-структурированные данные...2015-12-05 Александр Коротков, Иван Панченко - Слабо-структурированные данные...
2015-12-05 Александр Коротков, Иван Панченко - Слабо-структурированные данные...HappyDev
 
2015-12-06 Юрий Мельничек - Руководство для разработчиков по маркетингу мобил...
2015-12-06 Юрий Мельничек - Руководство для разработчиков по маркетингу мобил...2015-12-06 Юрий Мельничек - Руководство для разработчиков по маркетингу мобил...
2015-12-06 Юрий Мельничек - Руководство для разработчиков по маркетингу мобил...HappyDev
 
2015-12-06 Сергей Хрущев - Человеческим языком о суперкомпьютерах
2015-12-06 Сергей Хрущев - Человеческим языком о суперкомпьютерах2015-12-06 Сергей Хрущев - Человеческим языком о суперкомпьютерах
2015-12-06 Сергей Хрущев - Человеческим языком о суперкомпьютерахHappyDev
 
2015-12-06 Максим Юнусов - Проектирование REST приложения, или нужно ли прогр...
2015-12-06 Максим Юнусов - Проектирование REST приложения, или нужно ли прогр...2015-12-06 Максим Юнусов - Проектирование REST приложения, или нужно ли прогр...
2015-12-06 Максим Юнусов - Проектирование REST приложения, или нужно ли прогр...HappyDev
 
2015-12-06 Евгений Тюменцев - Разработка надежных параллельных, распределенны...
2015-12-06 Евгений Тюменцев - Разработка надежных параллельных, распределенны...2015-12-06 Евгений Тюменцев - Разработка надежных параллельных, распределенны...
2015-12-06 Евгений Тюменцев - Разработка надежных параллельных, распределенны...HappyDev
 
2015-12-06 Артем Зиненко - Что делать, если браузеры клиентов действуют проти...
2015-12-06 Артем Зиненко - Что делать, если браузеры клиентов действуют проти...2015-12-06 Артем Зиненко - Что делать, если браузеры клиентов действуют проти...
2015-12-06 Артем Зиненко - Что делать, если браузеры клиентов действуют проти...HappyDev
 
2015-12-06 Антон Тарасенко - Ваш следующий сервис будет асинхронным
2015-12-06 Антон Тарасенко - Ваш следующий сервис будет асинхронным2015-12-06 Антон Тарасенко - Ваш следующий сервис будет асинхронным
2015-12-06 Антон Тарасенко - Ваш следующий сервис будет асинхроннымHappyDev
 
2015-12-06 Андрей Коновалов - От сервисной компании к продуктовой: что нужно,...
2015-12-06 Андрей Коновалов - От сервисной компании к продуктовой: что нужно,...2015-12-06 Андрей Коновалов - От сервисной компании к продуктовой: что нужно,...
2015-12-06 Андрей Коновалов - От сервисной компании к продуктовой: что нужно,...HappyDev
 
2015-12-05 Вадим Литвинов - Проблемы разработки распределённых систем
2015-12-05 Вадим Литвинов - Проблемы разработки распределённых систем2015-12-05 Вадим Литвинов - Проблемы разработки распределённых систем
2015-12-05 Вадим Литвинов - Проблемы разработки распределённых системHappyDev
 

More from HappyDev (20)

2015-12-06 Aнтон Непомнящих - Принципы канбан и теории ограничений на примере...
2015-12-06 Aнтон Непомнящих - Принципы канбан и теории ограничений на примере...2015-12-06 Aнтон Непомнящих - Принципы канбан и теории ограничений на примере...
2015-12-06 Aнтон Непомнящих - Принципы канбан и теории ограничений на примере...
 
2015-12-05 Антон Непомнящих - Agile — как уложиться в сроки и бюджет?
2015-12-05 Антон Непомнящих - Agile — как уложиться в сроки и бюджет?2015-12-05 Антон Непомнящих - Agile — как уложиться в сроки и бюджет?
2015-12-05 Антон Непомнящих - Agile — как уложиться в сроки и бюджет?
 
2015 12-05 Александр Шиповалов - Инструмент для тестирования Sikuli script
2015 12-05 Александр Шиповалов - Инструмент для тестирования Sikuli script2015 12-05 Александр Шиповалов - Инструмент для тестирования Sikuli script
2015 12-05 Александр Шиповалов - Инструмент для тестирования Sikuli script
 
2015-12-06 Константин Борисов - Как собеседовать программиста?
2015-12-06 Константин Борисов - Как собеседовать программиста?2015-12-06 Константин Борисов - Как собеседовать программиста?
2015-12-06 Константин Борисов - Как собеседовать программиста?
 
2015-12-05 Данил Никифоров - NoSQL для мобайла с синхронизацией данных
2015-12-05 Данил Никифоров - NoSQL для мобайла с синхронизацией данных2015-12-05 Данил Никифоров - NoSQL для мобайла с синхронизацией данных
2015-12-05 Данил Никифоров - NoSQL для мобайла с синхронизацией данных
 
2015-12-06 Букуров Алексей - Автоматическое формирование интерфейса по метаоп...
2015-12-06 Букуров Алексей - Автоматическое формирование интерфейса по метаоп...2015-12-06 Букуров Алексей - Автоматическое формирование интерфейса по метаоп...
2015-12-06 Букуров Алексей - Автоматическое формирование интерфейса по метаоп...
 
2015-12-06 Евгений Тюменцев - Практики разработки серверных приложений
2015-12-06 Евгений Тюменцев - Практики разработки серверных приложений2015-12-06 Евгений Тюменцев - Практики разработки серверных приложений
2015-12-06 Евгений Тюменцев - Практики разработки серверных приложений
 
2015-12-06 Александр Чернышев - Технологии открытости мобильных приложений
2015-12-06 Александр Чернышев - Технологии открытости мобильных приложений2015-12-06 Александр Чернышев - Технологии открытости мобильных приложений
2015-12-06 Александр Чернышев - Технологии открытости мобильных приложений
 
2015-12-05 Вадим Литвинов - Нагрузочное тестирование с MZBench
2015-12-05 Вадим Литвинов - Нагрузочное тестирование с MZBench2015-12-05 Вадим Литвинов - Нагрузочное тестирование с MZBench
2015-12-05 Вадим Литвинов - Нагрузочное тестирование с MZBench
 
2015-12-05 Александр Шиповалов - Веселые картинки в тестировании
2015-12-05 Александр Шиповалов - Веселые картинки в тестировании2015-12-05 Александр Шиповалов - Веселые картинки в тестировании
2015-12-05 Александр Шиповалов - Веселые картинки в тестировании
 
2015-12-05 Александр Бындю, Андрей Шапиро - Пять самых важных составляющих пр...
2015-12-05 Александр Бындю, Андрей Шапиро - Пять самых важных составляющих пр...2015-12-05 Александр Бындю, Андрей Шапиро - Пять самых важных составляющих пр...
2015-12-05 Александр Бындю, Андрей Шапиро - Пять самых важных составляющих пр...
 
2015-12-05 Александр Коротков, Иван Панченко - Слабо-структурированные данные...
2015-12-05 Александр Коротков, Иван Панченко - Слабо-структурированные данные...2015-12-05 Александр Коротков, Иван Панченко - Слабо-структурированные данные...
2015-12-05 Александр Коротков, Иван Панченко - Слабо-структурированные данные...
 
2015-12-06 Юрий Мельничек - Руководство для разработчиков по маркетингу мобил...
2015-12-06 Юрий Мельничек - Руководство для разработчиков по маркетингу мобил...2015-12-06 Юрий Мельничек - Руководство для разработчиков по маркетингу мобил...
2015-12-06 Юрий Мельничек - Руководство для разработчиков по маркетингу мобил...
 
2015-12-06 Сергей Хрущев - Человеческим языком о суперкомпьютерах
2015-12-06 Сергей Хрущев - Человеческим языком о суперкомпьютерах2015-12-06 Сергей Хрущев - Человеческим языком о суперкомпьютерах
2015-12-06 Сергей Хрущев - Человеческим языком о суперкомпьютерах
 
2015-12-06 Максим Юнусов - Проектирование REST приложения, или нужно ли прогр...
2015-12-06 Максим Юнусов - Проектирование REST приложения, или нужно ли прогр...2015-12-06 Максим Юнусов - Проектирование REST приложения, или нужно ли прогр...
2015-12-06 Максим Юнусов - Проектирование REST приложения, или нужно ли прогр...
 
2015-12-06 Евгений Тюменцев - Разработка надежных параллельных, распределенны...
2015-12-06 Евгений Тюменцев - Разработка надежных параллельных, распределенны...2015-12-06 Евгений Тюменцев - Разработка надежных параллельных, распределенны...
2015-12-06 Евгений Тюменцев - Разработка надежных параллельных, распределенны...
 
2015-12-06 Артем Зиненко - Что делать, если браузеры клиентов действуют проти...
2015-12-06 Артем Зиненко - Что делать, если браузеры клиентов действуют проти...2015-12-06 Артем Зиненко - Что делать, если браузеры клиентов действуют проти...
2015-12-06 Артем Зиненко - Что делать, если браузеры клиентов действуют проти...
 
2015-12-06 Антон Тарасенко - Ваш следующий сервис будет асинхронным
2015-12-06 Антон Тарасенко - Ваш следующий сервис будет асинхронным2015-12-06 Антон Тарасенко - Ваш следующий сервис будет асинхронным
2015-12-06 Антон Тарасенко - Ваш следующий сервис будет асинхронным
 
2015-12-06 Андрей Коновалов - От сервисной компании к продуктовой: что нужно,...
2015-12-06 Андрей Коновалов - От сервисной компании к продуктовой: что нужно,...2015-12-06 Андрей Коновалов - От сервисной компании к продуктовой: что нужно,...
2015-12-06 Андрей Коновалов - От сервисной компании к продуктовой: что нужно,...
 
2015-12-05 Вадим Литвинов - Проблемы разработки распределённых систем
2015-12-05 Вадим Литвинов - Проблемы разработки распределённых систем2015-12-05 Вадим Литвинов - Проблемы разработки распределённых систем
2015-12-05 Вадим Литвинов - Проблемы разработки распределённых систем
 

2014.12.06 04 Евгений Тюменцев — Откуда появились s.o.l.i.d. принципы