Математическое обоснование S.O.L.I.D принциповetyumentcevДается математическое обоснование S.O.L.I.D принципов с помощью логики Хоара, из которого следует, что S.O.L.I.D верны не только для ООП, но и для статического полиморфизма, но и для императивного программирования вообще.
Обработка коллекций наизнанку: как применить много функций к одному аргументу...corehard_byСовременный язык C++ подвергается всё большему влиянию понятий и методов, заимствованных из парадигмы функционального программирования. В этом докладе представлен пример типично функционального решения, пригодного для довольно широкого круга практических задач. В противоположность привычной обработки коллекций (функции fmap, std::transform), где набор значений пропускается через единственную функцию, можно делать наоборот - подать одно значение на коллекцию функций. Есть несколько способов едалать это, один из них подробно описан здесь. Доклад охватывает как математические свойства, так и реализацию на языке C++, выполненную с использованием вариадических шаблонах и метапрограммирования.
Урок 8. Введение в редукцию графовСистема дистанционного обучения MyDLSУрок 8. Введение в редукцию графов. Больше интересных публикаций смотри на сайте mydls.ru
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...corehard_byОбобщенное программирование - это подход к программированию, когда алгоритм пишется без указания конкретных типов данных. Используя данный подход можно значительно увеличить количество повторно используемого кода. В C++ данный подход реализуется за счет механизма шаблонов. В данном докладе рассмотрим некоторые возможности по обобщенному программированию, которые предоставляет C++. На конкретных примерах рассмотрим, как они могут упростить нам жизнь и с какими трудностями приходится сталкиваться при их использовании.
Probabilistic Verification in Computational Systems DesignIosif ItkinSergey Frenkel, Victor Zakharov, Vladimir Ushakov, IPI RAS, Lomonosov Moscow State University, Moscow
Факторизационные модели в рекомендательных системахromovpaФакторизационные модели, модели разложения матриц для коллаборативной фильтрации в рекомендательных системах. В презентации рассматриваются теоретические аспекты и алгоритмы.
С доклада на спецсеминаре "Machine Learning & Information Retrieval" в Школе Анализа Данных Яндекса.
07 HappyDev-lite-2015 spring. Евгений Тюменцев. Зачем программисту нужно зна...HappyDev-liteК сожалению, не все студенты знают связь между программированием и математикой.
Урок 8. Введение в редукцию графовСистема дистанционного обучения MyDLSУрок 8. Введение в редукцию графов. Больше интересных публикаций смотри на сайте mydls.ru
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...corehard_byОбобщенное программирование - это подход к программированию, когда алгоритм пишется без указания конкретных типов данных. Используя данный подход можно значительно увеличить количество повторно используемого кода. В C++ данный подход реализуется за счет механизма шаблонов. В данном докладе рассмотрим некоторые возможности по обобщенному программированию, которые предоставляет C++. На конкретных примерах рассмотрим, как они могут упростить нам жизнь и с какими трудностями приходится сталкиваться при их использовании.
Probabilistic Verification in Computational Systems DesignIosif ItkinSergey Frenkel, Victor Zakharov, Vladimir Ushakov, IPI RAS, Lomonosov Moscow State University, Moscow
Факторизационные модели в рекомендательных системахromovpaФакторизационные модели, модели разложения матриц для коллаборативной фильтрации в рекомендательных системах. В презентации рассматриваются теоретические аспекты и алгоритмы.
С доклада на спецсеминаре "Machine Learning & Information Retrieval" в Школе Анализа Данных Яндекса.
07 HappyDev-lite-2015 spring. Евгений Тюменцев. Зачем программисту нужно зна...HappyDev-liteК сожалению, не все студенты знают связь между программированием и математикой.
Статический и динамический полиморфизм в C++, Дмитрий ЛевановYandexНа примере некоторых архитектурных решений Крипты Дмитрий расскажет о способах реализации полиморфного поведения в программах на C++, о преимуществах и недостатках этих способов, а также о новых возможностях C++11.
разработка серверов и серверных приложений лекция №3etyumentcevВ третьей главе рассматриваются базовые свойства акторов, описанные в PhD диссертации Gul Agha: каждый актор имеет адрес, большой почтовый ящик, куда доставляются сообщения, адресованные актору и поведение. В ответ на входящее сообщение актор может отправить конечный набор сообщений другим акторам и/или создать конечное число новых акторов и/или поменять свое поведение для обработки следующего сообщения.
В рамках данного курса будет разработана библиотека для разработки параллельных приложений на платформе .NET, построенная по модели акторов.
Исходные коды библиотеки будут выкладываться на GitHub: https://github.com/hwdtech/HWdTech.DS
Код библиотеки будет разработан с использованием следующих принципов, приемов и методик:
S.O.L.I.D. - принципы
Unit-tests
Mock
IoC контейнеры
Для удобства слушателей курса краткий обзор данных практик приведен в Главе 4.
разработка серверов и серверных приложений лекция №3Eugeniy TyumentcevВ третьей главе рассматриваются базовые свойства акторов, описанные в PhD диссертации Gul Agha: каждый актор имеет адрес, большой почтовый ящик, куда доставляются сообщения, адресованные актору и поведение. В ответ на входящее сообщение актор может отправить конечный набор сообщений другим акторам и/или создать конечное число новых акторов и/или поменять свое поведение для обработки следующего сообщения.
В рамках данного курса будет разработана библиотека для разработки параллельных приложений на платформе .NET, построенная по модели акторов.
Исходные коды библиотеки будут выкладываться на GitHub: https://github.com/hwdtech/HWdTech.DS
Код библиотеки будет разработан с использованием следующих принципов, приемов и методик:
S.O.L.I.D. - принципы
Unit-tests
Mock
IoC контейнеры
Для удобства слушателей курса краткий обзор данных практик приведен в Главе 4.
Статический и динамический полиморфизм в C++, Дмитрий ЛевановYandexНа примере некоторых архитектурных решений Крипты Дмитрий расскажет о способах реализации полиморфного поведения в программах на C++, о преимуществах и недостатках этих способов, а также о новых возможностях C++11.
Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...Sigma SoftwareEmbedded meetup of Open Tech Week by Sigma Software, Odesa 2018
Tricky Java GenericsAlexander MatorinGenerics were added to the Java language more than 10 year ago. But do you really understand them?
We’ll discuss:
What is heap pollution?
How does the compiler translate generics?
Why it’s not allowed to create parametrized array (List<string>[])
What are bridge methods, can we reach them?
Type erasure rules
Difference between List, List<object>, List<?>
Why it’s not allowed to add Integer to List<?>
Why it’s not allowed to parameterize exception classes?
What’s wrong with Collections.max signature: <t><?>> T max(Collection<?> coll);
Code that should be compiled, but can’t be compiled and vice versa
How to write good API using generics and wildcards
And other generic puzzlers
Lambdas in java 8chashnikovJava 8, самой заметной фичей которой стало появление лямбд, вышла два года назад, а в этом году мы даже начали её использовать в продакшен коде Идеи. Такое заметное нововведение в языке вызывает множество вопросов. Какие возможности перед нами открываются и какие проблемы при неаккуратном использовании лямбд могут возникнуть, как лямбды устроены внутри, во что они компилируются и как исполняются — вот темы, которые мы обсудим на докладе.
Дмитрий Прокопцев — R-ссылки в С++11YandexДмитрий Прокопцев, Яндекс
Речь пойдёт о, наверное, одном из самых важных и в то же время сложных нововведений в С++11 — R-ссылках (rvalue references). Мы рассмотрим базовые правила работы с такими ссылками и связанные с ними новые концепции языка: перемещение классов, универсальные ссылки и перенаправление вызовов.
Николай Паламарчук "Functional Programming basics for PHP developers"FwdaysFunctional Programming becomes very popular nowadays. What is it? Is it a hype or panacea? Should you deal with it as a PHP programmer? Let's find out!
Алгоритмы решения задачи о булевой выполнимости (SAT) и их применение в крипт...Positive Hack DaysАлгоритмы решения задачи о
булевой выполнимости (SAT)
и их применение в
криптоанализе
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...Alexey PaznikovЛЕКЦИЯ 1. Актуальность параллельных вычислений. Анализ параллельных алгоритмов. Многоядерные вычислительные систем с общей памятью
Курс "Параллельные вычислительные технологии" (ПВТ), весна 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
Стажировка 2016-07-27 02 Денис Нелюбин. PostgreSQL и jsonbSmartToolsThe document discusses using PostgreSQL and JSONB data. It covers installing PostgreSQL, connecting to a database, configuring network access and authentication, creating a database and user, inserting and querying JSONB data using operators like ->> and ->, updating and deleting rows, and creating a functional index to query on fields within the JSONB data.
2. 14 лет преподаю
ИМИТ, ФКН ОмГУ
ИТ-компании
Школа программиста
10 лет разрабатываю ПО
разработчик, архитектор,
PM, руководство до 70
человек
Тюменцев Евгений
5. The Liskov Substitution Principle
Функции, которые используют
ссылки на базовые классы, должны
иметь возможность использовать
объекты производных классов, не
зная об этом.
05
7. The Dependency Inversion Principle
Высокоуровневые компоненты не
должны зависеть от низкоуровневых
компонент. И те, и те должны
зависеть от абстракций.
Абстракции не должны зависеть от
деталей. Детали должны зависеть
от абстракций.
07
8. Пример нарушения DIP 08
void Copy()
{
int ch;
while ((ch = Keyboard()) != EOF)
{
WritePrinter(c);
}
}
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);
}
}
enum OutputDevice
{
printer,
disk
};
void Copy(OutputDevice dev)
{
int c;
while ((c = ReadKeyboard()) != EOF)
{
if (dev == printer)
WritePrinter(c);
else
WriteDisk(c);
}
}
9. Пример соответствия DIP 09
class IReader
{
public:
virtual int Read() = 0;
}
class IWriter
{
public:
virtual void Write(char) = 0;
}
void Copy(IReader& r, IWriter& w)
{
int c;
while((c=r.Read()) != EOF)
w.Write(c);
}
10. The Interface Segregation Principle
Класс не должен зависеть от
интерфейсов, которые он не
использует.
10
11. Пример нарушения ISP 13
class matrix
{
public:
virtual int size() const = 0;
virtual void get_ij(int I, int j, double &value) const = 0;
virtual void set_ij(int I, int j, double value) = 0;
};
class diagonal: public matrix
{
public:
void set_ij(int I, int j, double value)
{
// ? Что делать, если i != j
}
};
15. LSP, OOPSLA’87
Если для каждого объекта o1
типа S существует объект o2
типа T, который для всех
программ P определен в
терминах T, то поведение P
не изменится, если o1
заменить на o2 при условии,
что S является подтипом T
История вопроса 15
Barbara Liskov
17. LSP, OOPSLA’87
1988, опубликованы в
Object-oriented Software Construction
1994, A behavioral notion
of subtyping
История вопроса 17
Barbara Liskov
18. LSP, OOPSLA’87
1988, опубликованы в
Object-oriented Software Construction
1994, A behavioral notion of subtyping
1995-96, статьи в The
C++ Report
“Uncle Bob”
Автор названия
S.O.L.I.D.
История вопроса 18
Robert Martin
19. LSP, OOPSLA’87
1988, опубликованы в
Object-oriented Software Construction
1994, A behavioral notion of subtyping
1995-96, статьи в The C++ Report
2009, Spolsky VS Uncle Bob
they all sounded to me like
extremely bureaucratic
programming that came from
the mind of somebody that
has not written a lot of code…
История вопроса 19
Joel Spolsky
21. Выводимость 21
Пусть L – множество формул, B – формула.
Тогда L ⊦ B, если ∃ B1, B2, …, Bn , что
1.Bn – это B,
2.Bi – это
либо формула из L,
либо аксиома,
либо общезначимая формула,
либо формула полученная при
помощи правила вывода
24. 1969 г. An Axiomatic Basis for
Computer Programming
1971 г. Procedures and Parameters:
An Axiomatic Approach
1980 г. премия Тьюринга
1990 г. Медаль “Пионер
компьютерной техники”
2000 г. рыцарский титул за заслуги в
области образования и
компьютерной техники, премия
Киото
Логика Хоара
Чарльз Хоар
24
35. Закольцованный список с буферным элементом 35
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;
}
36. Закольцованный список с буферным элементом 36
node* insert(node& c, int v) {
node *n = new node;
n -> val = v;
n -> next = c.next;
c.next = n;
return n;
}
43. Если использовать
1. статическое связывание
2. Рекурсию
3. Вложенные процедуры
4. Процедуры, принимающие в качестве
параметров процедуры.
5. Глобальные переменные
то не существует полной системы аксиом.
Глобальные переменные 40
44. ⊢ 𝐿 𝞿 и ⊢ 𝐿 `𝞿
Значит, что любое
изменение в коде надо
тестировать!
Противоречивость 40
50. Так ли страшен hell… 40
24 марта https://habrahabr.ru/post/280099/
left-pad
«Многие разработчики не могли понять, что
случилось: они никогда не использовали такой
модуль. Однако его могли использовать другие
модули, о чем можно просто не догадываться»
https://meduza.io/feature/2016/03/28/kak-slomat-
internet
55. Аксиома оператора цикла 42
Повторное использование кода — методология
проектирования компьютерных и других
систем, заключающаяся в том, что система
(компьютерная программа, программный
модуль) частично либо полностью должна
составляться из частей, написанных ранее
компонентов и/или частей другой системы, и
эти компоненты должны применяться более
одного раза (если не в рамках одного проекта,
то хотя бы разных).
https://ru.wikipedia.org/wiki/Повторное_использование_кода
56. Когда происходит повторное
использование?
Если нужно внести изменение в
существующее приложение, то мы
пытаемся повторно использовать свой
же собственный код, чтобы получить
тоже приложение, но с новой
функциональностью.
43
61. Из закрытости следует выводимость! 48
Программные объекты должны быть
открыты для расширения, но в тоже
время закрыты для модификации.
The Open-Closed Principle
62. Матрицы 49
class matrix {
int size;
double *body;
public:
matrix(int s): size(s) {
body = new double[s*s];
}
void transform() {
…
}
double det() const {
…
}
};
63. Матрицы: добавляем matrix() 50
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) {
}
};
64. Матрицы: придется менять методы 51
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();
…
}
};
66. Что случилось? 52
Инвариант класса matrix: size > 0
Конструктор matrix() нарушил инвариант: size = 0
Предусловия методов изменились с size > 0 на size ≥ 0, но
{size ≥ 0} det {Q} не выводится из {size > 0} det {Q}
Следовательно, надо изменять сами методы
67. Импликация на множестве 54
Пусть P1 → P,
B = { x | P1(x) = 1},
A = { x | P (x) = 1}.
Тогда B ⊂ A.
P ⊨ P1. Говорят, что P –
более слабое условие,
P1 – более сильное.
A
B
68. Построим вывод 55
{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}
69. А если импликации нет? 56
{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}
72. Для оператора расширения получаем 59
Высокоуровневые компоненты не
должны зависеть от низкоуровневых
компонент. И те, и те должны
зависеть от абстракций.
Абстракции не должны зависеть от
деталей. Детали должны зависеть от
абстракций.
The Dependency Inversion Principle
78. Условие для методов класса 65
Для каждого метода подкласса
1. предусловия могут быть ослаблены
2. Постусловия усилены
79. The Liskov Substitution Principle
Функции, которые используют
ссылки на базовые классы, должны
иметь возможность использовать
объекты производных классов, не
зная об этом.
66
82. Пустой метод – метод, который подходит не для всех! 69
The Interface Segregation Principle
Класс не должен зависеть от
интерфейсов, которые он не
использует.
83. А не для классов? 70
bool (*validator) (Document const & doc);
std::vector<validator> rules = …;
for (int i = 0; i < n; ++i)
if(!rules[i](document))
return false;
return true;
84. В каком случае гарантированно
удастся избежать жирного
интерфейса?
71
#2: Эта презентация демонстрирует новые возможности PowerPoint. Ее рекомендуется просматривать в режиме показа слайдов. Эти слайды должны дать вам представление о том, какие эффектные презентации можно создать с помощью PowerPoint 2010.
Для доступа к другим образцам шаблонов перейдите на вкладку "Файл", а затем щелкните "Образцы слайдов" на вкладке "Создать".