Slide 1

Slide 1 text

(ООП, ФП) в мейнстримовом программировании -> баланс Виталий Камянский FirstLine Software Software Engineering Conference Russia 2018 October 12-13 Moscow C# F#

Slide 2

Slide 2 text

Языки популярные денежные любимые 2 * по данным исследования Stack Overflow 2018

Slide 3

Slide 3 text

Технологии популярные денежные любимые 3 * по данным исследования Stack Overflow 2018

Slide 4

Slide 4 text

Среды веб данные и админ клиент 4 * по данным исследования Stack Overflow 2018

Slide 5

Slide 5 text

Языки популярные денежные любимые 5 * по данным исследования Stack Overflow 2018

Slide 6

Slide 6 text

ФП приходит в C# Ноябрь 2007 Март 2017 Август 2017 x => x + 1 A Extension(this A source){…} 2.0 Enumerable.Range(6, 10) new { Name = "Anonymous" } ("tuple", 1) switch(a) { case TypeA at when at.Name=="a": return “it is a“; … } var (name, num) = tuple; 6

Slide 7

Slide 7 text

Подходы императивный декларативный Сделаю кофе… Кофе, сахар, сливки, средний! 7

Slide 8

Slide 8 text

Сущности объекты данные вычисление значение значение значение значение состояние поведение состояние поведение обмен сообщениями 8

Slide 9

Slide 9 text

Пример: список C# F# 9

Slide 10

Slide 10 text

Пример: быстрые вычисления Императивный подход Декларативный подход 10

Slide 11

Slide 11 text

Пример: быстрые вычисления + волшебное слово Императивный подход Декларативный подход 11

Slide 12

Slide 12 text

Быстрые вычисления: скорость 1 10 100 1000 10000 100000 1.00E+00 1.00E+02 1.00E+04 1.00E+06 1.00E+08 1.00E+10 t имп. t дек. t дек. пар. 12

Slide 13

Slide 13 text

Быстрые вычисления (часть 2) Менее тривиальный способ параллелизации со страницами и разделами 13

Slide 14

Slide 14 text

Быстрые вычисления: скорость (часть 2) 1 10 100 1000 10000 100000 1.00E+02 1.00E+04 1.00E+06 1.00E+08 1.00E+10 t имп. t дек. t дек. пар. t дек. стр. пар. 0 50 100 150 200 250 300 350 400 450 500 1.00E+00 1.00E+02 1.00E+04 1.00E+06 t исп. n страниц 20 млн. элементов 14

Slide 15

Slide 15 text

Решения императивный подход декларативный подход объекты -> ООП пример: Windows Forms -> композиция с DSL пример: XAML / Autofac данные -> Процедурное программирование Циклы, ветвление, вызов подпрограмм, переменные общего доступа -> вычисления с DSL пример: SQL / LINQ 15

Slide 16

Slide 16 text

Чистые функции –> внутренние DSL ссылочная прозрачность D честность I отсутствие побочных эффектов S A B A B B A 16

Slide 17

Slide 17 text

Внутренние DSL: что нужно ещё? • Функции как данные • Возможность строить из функций pipeline 17

Slide 18

Slide 18 text

Пример: DSL для сжатия Сборка алгоритма декларативная Алгоритм работы со Stream императивный (демонстрация) 18

Slide 19

Slide 19 text

Пример: Autofac и функции Инъекция фабричной функции в свойство Настройка контейнера 19

Slide 20

Slide 20 text

В F# свои плюсы размеченные объединения единицы измерения сравнение с образцом 20

Slide 21

Slide 21 text

Выводы • Экземпляры типа (данные) или класса (объекты)? – зависит от контекста операции • ФП – надёжные вычисления с чистыми функциями + функции как данные • Внутренние DSL – композиция сущностей + декларативность + удобство • Элементы ФП и DSL в ООП-языке делают ООП комфортнее и сами полезны • 2 языка: многополярность – один из подходов 21

Slide 22

Slide 22 text

Ссылки • Исследование Stack Overflow 2018 https://insights.stackoverflow.com/survey/2018 • Tomas Petricek, Jon Skeet “Real-World Functional Programming” http://functional-programming.net/rwfp/ • Scott Wlaschin “Domain Modeling Made Functional” https://pragprog.com/book/swdddf/domain-modeling-made-functional • Bartosz Milewski “Category Theory for Programmers“ https://github.com/hmemcpy/milewski-ctfp-pdf 22

Slide 23

Slide 23 text

Вопросы • Виталий Камянский • Почта: [email protected] • Телефон: +7 (921) 322 05 96 • https://github.com/vkamiansky