SlideShare uma empresa Scribd logo
1 de 56
Baixar para ler offline
Елементи функціонального
програмування в C#
на прикладі бібліотеки Language-Ext
Автор: Юрій Науринський
1. Процес моделювання маршруту за допомогою
функціональних елементів
2. Керування функціональними елементами
3. Типові питання
4. Висновки
Зміст
Дисклеймер – яку мову програмування
ми використовуємо?
Ми використовуємо C#
Чому не F#?
Це буде зрозуміло наприкінці презентації
Guard – для валідування НЕ
бізнес-логіки
Language-Ext — бібліотека
скарбничка функціональних
елементів, про яку саме йде річ
Дисклеймер — які бібліотеки
ми використовуємо?
Специфіка домену MapService
1. Практично немає внутрішньої поведінки класів
2. Дуже багато інваріантів
3. Все залежить від зовнішніх сервісів (налаштувань, БД)
4. Контроль типів як наслідок
5. Контроль валідності стану системи
Де це все використовувати?
HERE!
Мова йде тільки про домен
Гарне питання про те,
як використовувати функціональні
елементи в інфраструктурі:
https:/
/github.com/louthy/language-ext/
discussions/1102
Процес моделювання маршруту
за допомогою функціональних елементів
● Звичайний клас
● Record
● Засилля примітивних типів
● Вічний Null
● Discriminated Union
● Опціональні значення
● Створення нового об’єкту
Звичайний клас
Немає дотримання
інваріантів
Мутабельність
Що тут потрібне,
а що ні?
Неможливо порівняти
один маршрут з іншим
Неявні винятки
Іммутабельно
А як цей клас
тоді змінювати?
Звичайний клас
Record
З переваг – компілятор
за нас написав Equals
& Compare & ToString
Елегантно (ні) вирішуємо
всі наявні проблеми одним
ключовим словом
Все ще маршрут
відповідає за інваріанти
своїх дистанції та довжини
З таким записом змінювати
рекорд за допомогою with
не можна
На жаль конструктор не генерує,
тому створення лише через init
Насправді, саме так
правильно дотримуватись
інваріантів у випадку рекордів
Record
Суттєвий мінус —
використовує
застарілий кодген
Виглядає практично так само
як і нативний рекорд, але
просто з’явився раніше
Практично всі ті самі фічі
як і в нативному.
Але є Лінзи, що зручно
Record
Недоліки:
Висновок: не є зараз актуальним, так як з’явився нативний рекорд. Буде більш
актуальним тоді, коли в ньому з’являться перевірки на Null, та буде
використовувати Source Generators.
● Допускає запис Null https:/
/github.com/louthy/language-ext/issues/1105
● Використовує застарілий кодген
Record — Language Ext
Засилля примітивних типів
Кожен раз де є дистанція
так перевіряти?
Можемо помилятися
в порядку при
створенні маршруту
Це метри, кілометри,
сантиметри, чи що?
Проблема подвійної валідації
Невже це все знову потрібно
валідувати в методі?
Щось там обчислює…
Техніка “X-ing”
Чим ці два методи відрізняються?
Відпадає питання
одиниць вимірювання
Клас обгортка
На практиці надзвичайно зручна
валідація внутрішніх значень
Засилля примітивних типів
NewType — зручне створення нових типів обгорток
NumType & FloatType — все те ж саме, але для цілих чисел,
або чисел з рухомою комою
Сигнатура:
а. NewType<NEWTYPE, A, PRED>
i. NEWTYPE — реалізуємий тип
ii. A – внутрішній тип
iii. PRED — предикат, який валідує внутрішній тип
За замовчуванням викидає виняток, якщо предикат повертає false
Є статичний метод NewOption з результатом у вигляді типу Option
Засилля примітивних типів
Ніякої подвійної валідації.
Гарантовано валідні дистанція
та тривалість
Проблема подвійної валідації
Кришталево зрозуміло, що тепер
відбувається
Техніка “X-ing”
Переваги та недоліки типів обгорток
проти засилля примітивних типів
Переваги
● Зникає проблема подвійної
валідації
● Зникає проблема “X-ing”
● Неможливо переплутати
багато однакових аргументів
місцями
Недоліки
● Необхідно постійно створювати ці
типи обгортки
● Більше навантаження на GC?
(треба вимірювати)
Вічний Null
Ідеально?
Ні, про null забули…
Зручний Fluent спосіб
валідування на null
Тільки для інфраструктурної
валідації !!!
Використовується бібліотека
Dawn.Guard
Вічний Null
Discriminated Union
Приходить бізнес-аналітик і каже:
“Дистанція маршруту тепер може бути
розділена за ознакою в місті, або за містом.
Але таке розділення не завжди потрібне.”!
А ось тут кодген вже корисний, бо
нативної підтримки типів сум (юніонів)
в C# ще (сподіваюсь) немає
Тут можливі два випадки (кейси):
● АБО загальна дистанція
● АБО розділена дистанція
Чи потрібно тут створювати
нові класи обгортки
DistanceInsideCIty & DistanceOutsideCity?
Залежить від вимог
Discriminated Union
Елегантно вирішена
проблема кількох станів
Discriminated Union
Автоматично генерується
клас конструктор юніону
Compile-time safe обробка
всіх станів
Discriminated Union
Ніби емуляція нативними
засобами мови
Але Compile-time safe обробку
прийдеться писати власноруч,
кожен раз
Discriminated Union
Недоліки:
Висновок: є зараз актуальним, бо нативних аналогів немає. Можна емулювати,
але емулювання не дає compile-time safe гарантію обробки всіх станів.
Елегантно вирішує проблему опису кількох одночасних станів.
● Допускає запис Null https:/
/github.com/louthy/language-ext/issues/1105
● Використовує застарілий кодген
Discriminated Union — Language Ext
Аксіома - Null означає
відсутність об'єкта в
застосунку,
а не в бізнес-логіці!
З C# 8 можна навіть
класи помітити як ті,
які опціонально
містять null
Але так моделювати опціональні
значення незручно
Опціональні значення
Семантична коректність та гарантія
обробки, але що таке Option?
Опціональні значення
Семантично означає опціональне
значення
Один з найвикористовуваніших типів
для моделювання домену
Не потрібно писати власноруч,
вже є в бібліотеці, разом з низкою
корисних методів
Опціональні значення
Самописний Option
з бібліотеки Uklon.Nul
Справжній Option повинен:
● Бути структурою
● Реалізовувати всі інтерфейси
порівняння та серіалізації
● Мати такі методи:
- Option<A>.Some(...)
- Option<A>.None
- Map
- Bind
Option з бібліотеки
Language-Ext
Опціональні значення
Переваги та недоліки моделювання опціональних
значень за допомогою Option чи null
Option
● Зникає проблема подвійної валідації
● Коректна семантика опціональності
● Ідеально для бізнес-логіки
● Захаращує код
Null
● Помилка часу виконання
● Семантика існування посилання
● Ідеально для інфраструктури на
кордонах застосунку (адаптери,
контролери)
● Захаращує пам’ять та час розробника
Як маючи ці два примітивні
значення створити маршрут?
Створення нового об’єкту
Оптимістичний підхід
Ціле виключення на таку незначну
дрібницю як невалідна
дистанція/тривалість?
Багато честі
Але який тип тоді потрібен, щоб
показати, що створення не вдалось?
Створення нового об’єкту
Виглядає практично як
імперативний код
Як тільки зустрічаємо перший None
● наступні кроки НЕ обробляються
● значення всього виразу стає None
Монадична обробка
Порядок обробки:
● повертає валідну дистанцію або None
● повертає валідну тривалість або None
● повертає валідний маршрут або None
Створення нового об’єкту
Але я хочу знати, яка саме
помилка при створенні
об'єкта!
Дуже зручно помилки
моделювати юніонами
Практично те саме, що й з Option, але
замість None буде CreateRouteError
Створення нового об’єкту
Зазвичай це стан
помилки
Два стани: або лівий,
або правий
Створення нового об’єкту
Але я хочу знати
ВСІ помилки при
створенні об’єкту!
Аплікативний стиль
Збираємо ВСІ помилки. Гарно працює коли всі
помилки один від одного незалежні
Створення нового об’єкту
Колекція помилок
Створення нового об’єкту
Переваги та недоліки функціонального рішення
створення нового об’єкту
Переваги
● Ніяких раптових винятків
● Даний підхід ЗМУШУЄ подумати
про обробку помилок
Недоліки
● Неясно
● Незрозуміло
● Не прийнято суспільством
● Достатньо високий поріг входження
● Через брак підтримки в мові,
потребує використання самописних
бібліотек
Висновки по створенню об’єктів
● Зовнішня простота приховує за собою внутрішню складність
● Винятки – лише для виняткових ситуацій в програмі!
● Якщо бізнес-логіка об’єкта передбачає можливість невдалого створення
об’єкта (наприклад, під час валідації) – це не виняткова ситуація!
● Можливі три різні підходи для створення об’єктів в функціональному стилі:
а. використовуючи тип Option – якщо нам важливо лише те, чи був створений об’єкт, чи ні
b. використовуючи тип Either – якщо важлива лише перша помилка при створенні об'єкта
с. використовуючи тип Validation – якщо важливо зібрати всі помилки при створенні об'єкта
Головні функції для керування
елементами
Так робити некоректно, Option не стикаються!
Якщо потрібно перетворити Option
і в результаті перетворення
отримуємо новий Option
Якщо внутрішнє значення Option
потрібно в щось перетворити
Єдиний вірний варіант отримати
внутрішнє значення (крім Match)
Всі ці функції стандартні,
також є в Either & Validation
Стандартна функція, яка
також є в Either & Validation
Оброблюємо всі
можливі стани
Головні функції для керування
елементами
Практично імперативний код!
Гуглити “do notation”
Функціонально еквівалентні
варіанти запису
● Це інша мова зі своїм специфічним синтаксисом та особливостями
● Вибір мови – це не твій персональний вибір
● Простіше вивчити нову бібліотеку ніж мову?
● C# вже дуже гарний та майже функціональний (але зрозуміло ООП
підхід перш за все)
● Вчити елементи та концепції функціонального програмування на
початку простіше в знайомому оточенні
Чому б просто не використовувати F#?
Чому саме ця бібліотека?
● Або писати самому – або брати вже готове
● На прикладі бібліотеки Uklon.Null ми побачили що буде, якщо
писати це все самому
● До того ж, є неймовірно багато речей, які можуть бути корисними, але про
них треба знати. Якщо писати самому — про них не дізнаєшся
Навіщо це взагалі потрібно?
● Дані методи дають змогу безпечно моделювати складний
домен, де багато зовнішніх залежностей
● Ці методи НЕ замінюють тести, сонар та інше, а лише
ДОПОВНЮЮТЬ!
Висновки
● Спробуйте на практиці змоделювати свою бізнес-логику за допомогою
описаних методів
● Насправді порядок моделювання не дуже важливий, до кінцевого результату ви
врешті решт прийдете використавши всі потрібні вам та описані методи
● Так в чому ж основна перевага? Ми ЗАВЖДИ знаємо, як комбінувати наші типи
декларативним способом, що автоматично робить наш код більш простим та
підтримуваним
Корисні посилання
https:/
/github.com/louthy/language-ext
https:/
/github.com/louthy/language-ext/wiki
https:/
/fsharpforfunandprofit.com
https:/
/fsharpforfunandprofit.com/posts/13-ways-of-looking-at-a-turtle
http:/
/blog.ezyang.com/2010/05/design-patterns-in-haske
https:/
/enterprisecraftsmanship.com/ps-func
https:/
/enterprisecraftsmanship.com/posts/functional-c-immutability/
https:/
/blog.ploeh.dk/
https:/
/www.youtube.com/watch?v=Nrp_LZ-XGsY
Дякую за
увагу!
Q&A

Mais conteúdo relacionado

Semelhante a "Elements of functional programming in C# based on Language-Ext library as an example", Yurii Naurynskyi

природна і економна дорожня карта для переходу команди розробки на тест центр...
природна і економна дорожня карта для переходу команди розробки на тест центр...природна і економна дорожня карта для переходу команди розробки на тест центр...
природна і економна дорожня карта для переходу команди розробки на тест центр...Andrii Podanenko
 
Stfalcon QA Meetup 31.01.2020
Stfalcon QA Meetup 31.01.2020Stfalcon QA Meetup 31.01.2020
Stfalcon QA Meetup 31.01.2020Stfalcon Meetups
 
Корнілов Андрій
Корнілов АндрійКорнілов Андрій
Корнілов АндрійOleg Nazarevych
 
ЮРІЙ СЕРДЮК «Патерни проектування в автоматизації. Практичний досвід з Python...
ЮРІЙ СЕРДЮК «Патерни проектування в автоматизації. Практичний досвід з Python...ЮРІЙ СЕРДЮК «Патерни проектування в автоматизації. Практичний досвід з Python...
ЮРІЙ СЕРДЮК «Патерни проектування в автоматизації. Практичний досвід з Python...GoQA
 
основи програмування 1
основи програмування  1основи програмування  1
основи програмування 1CDN_IF
 
конспект уроку налагодження програм
конспект уроку налагодження програмконспект уроку налагодження програм
конспект уроку налагодження програмtan4ikbah
 
iPhone Objective-C Development (ukr) (2009)
iPhone Objective-C Development (ukr) (2009)iPhone Objective-C Development (ukr) (2009)
iPhone Objective-C Development (ukr) (2009)Anatoliy Okhotnikov
 
Continuous Integration - Анатолій Охотніков
Continuous Integration - Анатолій ОхотніковContinuous Integration - Анатолій Охотніков
Continuous Integration - Анатолій ОхотніковIgor Bronovskyy
 
ITEvent: Continuous Integration (ukr)
ITEvent: Continuous Integration (ukr)ITEvent: Continuous Integration (ukr)
ITEvent: Continuous Integration (ukr)Anatoliy Okhotnikov
 
Іван Дзямулич “AppStore – як стартанути і розвиватись?”
Іван Дзямулич “AppStore – як стартанути і розвиватись?”Іван Дзямулич “AppStore – як стартанути і розвиватись?”
Іван Дзямулич “AppStore – як стартанути і розвиватись?”Lviv Startup Club
 
AngularJS on Javascript User Group, Lviv
AngularJS on Javascript User Group, LvivAngularJS on Javascript User Group, Lviv
AngularJS on Javascript User Group, LvivDmitriy Hunkin
 
.NET Platform. C# Basics
.NET Platform. C# Basics.NET Platform. C# Basics
.NET Platform. C# Basicseleksdev
 
[Knowledge Sharing] - Behavioral patterns by Pavlo Serdyuk (UKR)
[Knowledge Sharing] - Behavioral patterns by Pavlo Serdyuk (UKR)[Knowledge Sharing] - Behavioral patterns by Pavlo Serdyuk (UKR)
[Knowledge Sharing] - Behavioral patterns by Pavlo Serdyuk (UKR)Exoft LLC
 
Мови програмування
Мови програмуванняМови програмування
Мови програмуванняAlyona Tribko
 

Semelhante a "Elements of functional programming in C# based on Language-Ext library as an example", Yurii Naurynskyi (20)

природна і економна дорожня карта для переходу команди розробки на тест центр...
природна і економна дорожня карта для переходу команди розробки на тест центр...природна і економна дорожня карта для переходу команди розробки на тест центр...
природна і економна дорожня карта для переходу команди розробки на тест центр...
 
Less34
Less34Less34
Less34
 
Ak 11kl urok_13_tema
Ak 11kl urok_13_temaAk 11kl urok_13_tema
Ak 11kl urok_13_tema
 
Stfalcon QA Meetup 31.01.2020
Stfalcon QA Meetup 31.01.2020Stfalcon QA Meetup 31.01.2020
Stfalcon QA Meetup 31.01.2020
 
Корнілов Андрій
Корнілов АндрійКорнілов Андрій
Корнілов Андрій
 
ЮРІЙ СЕРДЮК «Патерни проектування в автоматизації. Практичний досвід з Python...
ЮРІЙ СЕРДЮК «Патерни проектування в автоматизації. Практичний досвід з Python...ЮРІЙ СЕРДЮК «Патерни проектування в автоматизації. Практичний досвід з Python...
ЮРІЙ СЕРДЮК «Патерни проектування в автоматизації. Практичний досвід з Python...
 
основи програмування 1
основи програмування  1основи програмування  1
основи програмування 1
 
04
0404
04
 
конспект уроку налагодження програм
конспект уроку налагодження програмконспект уроку налагодження програм
конспект уроку налагодження програм
 
m-9-10.pptx
m-9-10.pptxm-9-10.pptx
m-9-10.pptx
 
dfgInf tema 1_urok_4_6_klas
dfgInf tema 1_urok_4_6_klasdfgInf tema 1_urok_4_6_klas
dfgInf tema 1_urok_4_6_klas
 
iPhone Objective-C Development (ukr) (2009)
iPhone Objective-C Development (ukr) (2009)iPhone Objective-C Development (ukr) (2009)
iPhone Objective-C Development (ukr) (2009)
 
Continuous Integration - Анатолій Охотніков
Continuous Integration - Анатолій ОхотніковContinuous Integration - Анатолій Охотніков
Continuous Integration - Анатолій Охотніков
 
ITEvent: Continuous Integration (ukr)
ITEvent: Continuous Integration (ukr)ITEvent: Continuous Integration (ukr)
ITEvent: Continuous Integration (ukr)
 
Python for physicists. introduction
Python for physicists. introductionPython for physicists. introduction
Python for physicists. introduction
 
Іван Дзямулич “AppStore – як стартанути і розвиватись?”
Іван Дзямулич “AppStore – як стартанути і розвиватись?”Іван Дзямулич “AppStore – як стартанути і розвиватись?”
Іван Дзямулич “AppStore – як стартанути і розвиватись?”
 
AngularJS on Javascript User Group, Lviv
AngularJS on Javascript User Group, LvivAngularJS on Javascript User Group, Lviv
AngularJS on Javascript User Group, Lviv
 
.NET Platform. C# Basics
.NET Platform. C# Basics.NET Platform. C# Basics
.NET Platform. C# Basics
 
[Knowledge Sharing] - Behavioral patterns by Pavlo Serdyuk (UKR)
[Knowledge Sharing] - Behavioral patterns by Pavlo Serdyuk (UKR)[Knowledge Sharing] - Behavioral patterns by Pavlo Serdyuk (UKR)
[Knowledge Sharing] - Behavioral patterns by Pavlo Serdyuk (UKR)
 
Мови програмування
Мови програмуванняМови програмування
Мови програмування
 

Mais de Fwdays

"How Preply reduced ML model development time from 1 month to 1 day",Yevhen Y...
"How Preply reduced ML model development time from 1 month to 1 day",Yevhen Y..."How Preply reduced ML model development time from 1 month to 1 day",Yevhen Y...
"How Preply reduced ML model development time from 1 month to 1 day",Yevhen Y...Fwdays
 
"GenAI Apps: Our Journey from Ideas to Production Excellence",Danil Topchii
"GenAI Apps: Our Journey from Ideas to Production Excellence",Danil Topchii"GenAI Apps: Our Journey from Ideas to Production Excellence",Danil Topchii
"GenAI Apps: Our Journey from Ideas to Production Excellence",Danil TopchiiFwdays
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...Fwdays
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr LapshynFwdays
 
"What is a RAG system and how to build it",Dmytro Spodarets
"What is a RAG system and how to build it",Dmytro Spodarets"What is a RAG system and how to build it",Dmytro Spodarets
"What is a RAG system and how to build it",Dmytro SpodaretsFwdays
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii SoldatenkoFwdays
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr BaganFwdays
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
"Distributed graphs and microservices in Prom.ua", Maksym Kindritskyi
"Distributed graphs and microservices in Prom.ua",  Maksym Kindritskyi"Distributed graphs and microservices in Prom.ua",  Maksym Kindritskyi
"Distributed graphs and microservices in Prom.ua", Maksym KindritskyiFwdays
 
"Rethinking the existing data loading and processing process as an ETL exampl...
"Rethinking the existing data loading and processing process as an ETL exampl..."Rethinking the existing data loading and processing process as an ETL exampl...
"Rethinking the existing data loading and processing process as an ETL exampl...Fwdays
 
"How Ukrainian IT specialist can go on vacation abroad without crossing the T...
"How Ukrainian IT specialist can go on vacation abroad without crossing the T..."How Ukrainian IT specialist can go on vacation abroad without crossing the T...
"How Ukrainian IT specialist can go on vacation abroad without crossing the T...Fwdays
 
"The Strength of Being Vulnerable: the experience from CIA, Tesla and Uber", ...
"The Strength of Being Vulnerable: the experience from CIA, Tesla and Uber", ..."The Strength of Being Vulnerable: the experience from CIA, Tesla and Uber", ...
"The Strength of Being Vulnerable: the experience from CIA, Tesla and Uber", ...Fwdays
 
"[QUICK TALK] Radical candor: how to achieve results faster thanks to a cultu...
"[QUICK TALK] Radical candor: how to achieve results faster thanks to a cultu..."[QUICK TALK] Radical candor: how to achieve results faster thanks to a cultu...
"[QUICK TALK] Radical candor: how to achieve results faster thanks to a cultu...Fwdays
 
"[QUICK TALK] PDP Plan, the only one door to raise your salary and boost care...
"[QUICK TALK] PDP Plan, the only one door to raise your salary and boost care..."[QUICK TALK] PDP Plan, the only one door to raise your salary and boost care...
"[QUICK TALK] PDP Plan, the only one door to raise your salary and boost care...Fwdays
 
"4 horsemen of the apocalypse of working relationships (+ antidotes to them)"...
"4 horsemen of the apocalypse of working relationships (+ antidotes to them)"..."4 horsemen of the apocalypse of working relationships (+ antidotes to them)"...
"4 horsemen of the apocalypse of working relationships (+ antidotes to them)"...Fwdays
 
"Reconnecting with Purpose: Rediscovering Job Interest after Burnout", Anast...
"Reconnecting with Purpose: Rediscovering Job Interest after Burnout",  Anast..."Reconnecting with Purpose: Rediscovering Job Interest after Burnout",  Anast...
"Reconnecting with Purpose: Rediscovering Job Interest after Burnout", Anast...Fwdays
 
"Mentoring 101: How to effectively invest experience in the success of others...
"Mentoring 101: How to effectively invest experience in the success of others..."Mentoring 101: How to effectively invest experience in the success of others...
"Mentoring 101: How to effectively invest experience in the success of others...Fwdays
 
"Mission (im) possible: How to get an offer in 2024?", Oleksandra Myronova
"Mission (im) possible: How to get an offer in 2024?",  Oleksandra Myronova"Mission (im) possible: How to get an offer in 2024?",  Oleksandra Myronova
"Mission (im) possible: How to get an offer in 2024?", Oleksandra MyronovaFwdays
 
"Why have we learned how to package products, but not how to 'package ourselv...
"Why have we learned how to package products, but not how to 'package ourselv..."Why have we learned how to package products, but not how to 'package ourselv...
"Why have we learned how to package products, but not how to 'package ourselv...Fwdays
 
"How to tame the dragon, or leadership with imposter syndrome", Oleksandr Zin...
"How to tame the dragon, or leadership with imposter syndrome", Oleksandr Zin..."How to tame the dragon, or leadership with imposter syndrome", Oleksandr Zin...
"How to tame the dragon, or leadership with imposter syndrome", Oleksandr Zin...Fwdays
 

Mais de Fwdays (20)

"How Preply reduced ML model development time from 1 month to 1 day",Yevhen Y...
"How Preply reduced ML model development time from 1 month to 1 day",Yevhen Y..."How Preply reduced ML model development time from 1 month to 1 day",Yevhen Y...
"How Preply reduced ML model development time from 1 month to 1 day",Yevhen Y...
 
"GenAI Apps: Our Journey from Ideas to Production Excellence",Danil Topchii
"GenAI Apps: Our Journey from Ideas to Production Excellence",Danil Topchii"GenAI Apps: Our Journey from Ideas to Production Excellence",Danil Topchii
"GenAI Apps: Our Journey from Ideas to Production Excellence",Danil Topchii
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
 
"What is a RAG system and how to build it",Dmytro Spodarets
"What is a RAG system and how to build it",Dmytro Spodarets"What is a RAG system and how to build it",Dmytro Spodarets
"What is a RAG system and how to build it",Dmytro Spodarets
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
"Distributed graphs and microservices in Prom.ua", Maksym Kindritskyi
"Distributed graphs and microservices in Prom.ua",  Maksym Kindritskyi"Distributed graphs and microservices in Prom.ua",  Maksym Kindritskyi
"Distributed graphs and microservices in Prom.ua", Maksym Kindritskyi
 
"Rethinking the existing data loading and processing process as an ETL exampl...
"Rethinking the existing data loading and processing process as an ETL exampl..."Rethinking the existing data loading and processing process as an ETL exampl...
"Rethinking the existing data loading and processing process as an ETL exampl...
 
"How Ukrainian IT specialist can go on vacation abroad without crossing the T...
"How Ukrainian IT specialist can go on vacation abroad without crossing the T..."How Ukrainian IT specialist can go on vacation abroad without crossing the T...
"How Ukrainian IT specialist can go on vacation abroad without crossing the T...
 
"The Strength of Being Vulnerable: the experience from CIA, Tesla and Uber", ...
"The Strength of Being Vulnerable: the experience from CIA, Tesla and Uber", ..."The Strength of Being Vulnerable: the experience from CIA, Tesla and Uber", ...
"The Strength of Being Vulnerable: the experience from CIA, Tesla and Uber", ...
 
"[QUICK TALK] Radical candor: how to achieve results faster thanks to a cultu...
"[QUICK TALK] Radical candor: how to achieve results faster thanks to a cultu..."[QUICK TALK] Radical candor: how to achieve results faster thanks to a cultu...
"[QUICK TALK] Radical candor: how to achieve results faster thanks to a cultu...
 
"[QUICK TALK] PDP Plan, the only one door to raise your salary and boost care...
"[QUICK TALK] PDP Plan, the only one door to raise your salary and boost care..."[QUICK TALK] PDP Plan, the only one door to raise your salary and boost care...
"[QUICK TALK] PDP Plan, the only one door to raise your salary and boost care...
 
"4 horsemen of the apocalypse of working relationships (+ antidotes to them)"...
"4 horsemen of the apocalypse of working relationships (+ antidotes to them)"..."4 horsemen of the apocalypse of working relationships (+ antidotes to them)"...
"4 horsemen of the apocalypse of working relationships (+ antidotes to them)"...
 
"Reconnecting with Purpose: Rediscovering Job Interest after Burnout", Anast...
"Reconnecting with Purpose: Rediscovering Job Interest after Burnout",  Anast..."Reconnecting with Purpose: Rediscovering Job Interest after Burnout",  Anast...
"Reconnecting with Purpose: Rediscovering Job Interest after Burnout", Anast...
 
"Mentoring 101: How to effectively invest experience in the success of others...
"Mentoring 101: How to effectively invest experience in the success of others..."Mentoring 101: How to effectively invest experience in the success of others...
"Mentoring 101: How to effectively invest experience in the success of others...
 
"Mission (im) possible: How to get an offer in 2024?", Oleksandra Myronova
"Mission (im) possible: How to get an offer in 2024?",  Oleksandra Myronova"Mission (im) possible: How to get an offer in 2024?",  Oleksandra Myronova
"Mission (im) possible: How to get an offer in 2024?", Oleksandra Myronova
 
"Why have we learned how to package products, but not how to 'package ourselv...
"Why have we learned how to package products, but not how to 'package ourselv..."Why have we learned how to package products, but not how to 'package ourselv...
"Why have we learned how to package products, but not how to 'package ourselv...
 
"How to tame the dragon, or leadership with imposter syndrome", Oleksandr Zin...
"How to tame the dragon, or leadership with imposter syndrome", Oleksandr Zin..."How to tame the dragon, or leadership with imposter syndrome", Oleksandr Zin...
"How to tame the dragon, or leadership with imposter syndrome", Oleksandr Zin...
 

"Elements of functional programming in C# based on Language-Ext library as an example", Yurii Naurynskyi

  • 1. Елементи функціонального програмування в C# на прикладі бібліотеки Language-Ext Автор: Юрій Науринський
  • 2. 1. Процес моделювання маршруту за допомогою функціональних елементів 2. Керування функціональними елементами 3. Типові питання 4. Висновки Зміст
  • 3. Дисклеймер – яку мову програмування ми використовуємо? Ми використовуємо C# Чому не F#? Це буде зрозуміло наприкінці презентації
  • 4. Guard – для валідування НЕ бізнес-логіки Language-Ext — бібліотека скарбничка функціональних елементів, про яку саме йде річ Дисклеймер — які бібліотеки ми використовуємо?
  • 5. Специфіка домену MapService 1. Практично немає внутрішньої поведінки класів 2. Дуже багато інваріантів 3. Все залежить від зовнішніх сервісів (налаштувань, БД) 4. Контроль типів як наслідок 5. Контроль валідності стану системи
  • 6. Де це все використовувати? HERE! Мова йде тільки про домен Гарне питання про те, як використовувати функціональні елементи в інфраструктурі: https:/ /github.com/louthy/language-ext/ discussions/1102
  • 7. Процес моделювання маршруту за допомогою функціональних елементів ● Звичайний клас ● Record ● Засилля примітивних типів ● Вічний Null ● Discriminated Union ● Опціональні значення ● Створення нового об’єкту
  • 9. Неможливо порівняти один маршрут з іншим Неявні винятки Іммутабельно А як цей клас тоді змінювати? Звичайний клас
  • 10. Record З переваг – компілятор за нас написав Equals & Compare & ToString Елегантно (ні) вирішуємо всі наявні проблеми одним ключовим словом Все ще маршрут відповідає за інваріанти своїх дистанції та довжини З таким записом змінювати рекорд за допомогою with не можна
  • 11. На жаль конструктор не генерує, тому створення лише через init Насправді, саме так правильно дотримуватись інваріантів у випадку рекордів Record
  • 12. Суттєвий мінус — використовує застарілий кодген Виглядає практично так само як і нативний рекорд, але просто з’явився раніше Практично всі ті самі фічі як і в нативному. Але є Лінзи, що зручно Record
  • 13. Недоліки: Висновок: не є зараз актуальним, так як з’явився нативний рекорд. Буде більш актуальним тоді, коли в ньому з’являться перевірки на Null, та буде використовувати Source Generators. ● Допускає запис Null https:/ /github.com/louthy/language-ext/issues/1105 ● Використовує застарілий кодген Record — Language Ext
  • 14. Засилля примітивних типів Кожен раз де є дистанція так перевіряти? Можемо помилятися в порядку при створенні маршруту Це метри, кілометри, сантиметри, чи що?
  • 15. Проблема подвійної валідації Невже це все знову потрібно валідувати в методі? Щось там обчислює…
  • 16. Техніка “X-ing” Чим ці два методи відрізняються?
  • 17. Відпадає питання одиниць вимірювання Клас обгортка На практиці надзвичайно зручна валідація внутрішніх значень Засилля примітивних типів
  • 18. NewType — зручне створення нових типів обгорток NumType & FloatType — все те ж саме, але для цілих чисел, або чисел з рухомою комою Сигнатура: а. NewType<NEWTYPE, A, PRED> i. NEWTYPE — реалізуємий тип ii. A – внутрішній тип iii. PRED — предикат, який валідує внутрішній тип За замовчуванням викидає виняток, якщо предикат повертає false Є статичний метод NewOption з результатом у вигляді типу Option Засилля примітивних типів
  • 19. Ніякої подвійної валідації. Гарантовано валідні дистанція та тривалість Проблема подвійної валідації
  • 20. Кришталево зрозуміло, що тепер відбувається Техніка “X-ing”
  • 21. Переваги та недоліки типів обгорток проти засилля примітивних типів Переваги ● Зникає проблема подвійної валідації ● Зникає проблема “X-ing” ● Неможливо переплутати багато однакових аргументів місцями Недоліки ● Необхідно постійно створювати ці типи обгортки ● Більше навантаження на GC? (треба вимірювати)
  • 23. Зручний Fluent спосіб валідування на null Тільки для інфраструктурної валідації !!! Використовується бібліотека Dawn.Guard Вічний Null
  • 24. Discriminated Union Приходить бізнес-аналітик і каже: “Дистанція маршруту тепер може бути розділена за ознакою в місті, або за містом. Але таке розділення не завжди потрібне.”!
  • 25. А ось тут кодген вже корисний, бо нативної підтримки типів сум (юніонів) в C# ще (сподіваюсь) немає Тут можливі два випадки (кейси): ● АБО загальна дистанція ● АБО розділена дистанція Чи потрібно тут створювати нові класи обгортки DistanceInsideCIty & DistanceOutsideCity? Залежить від вимог Discriminated Union
  • 27. Автоматично генерується клас конструктор юніону Compile-time safe обробка всіх станів Discriminated Union
  • 28. Ніби емуляція нативними засобами мови Але Compile-time safe обробку прийдеться писати власноруч, кожен раз Discriminated Union
  • 29. Недоліки: Висновок: є зараз актуальним, бо нативних аналогів немає. Можна емулювати, але емулювання не дає compile-time safe гарантію обробки всіх станів. Елегантно вирішує проблему опису кількох одночасних станів. ● Допускає запис Null https:/ /github.com/louthy/language-ext/issues/1105 ● Використовує застарілий кодген Discriminated Union — Language Ext
  • 30. Аксіома - Null означає відсутність об'єкта в застосунку, а не в бізнес-логіці!
  • 31. З C# 8 можна навіть класи помітити як ті, які опціонально містять null Але так моделювати опціональні значення незручно Опціональні значення
  • 32. Семантична коректність та гарантія обробки, але що таке Option? Опціональні значення
  • 33. Семантично означає опціональне значення Один з найвикористовуваніших типів для моделювання домену Не потрібно писати власноруч, вже є в бібліотеці, разом з низкою корисних методів Опціональні значення
  • 34. Самописний Option з бібліотеки Uklon.Nul Справжній Option повинен: ● Бути структурою ● Реалізовувати всі інтерфейси порівняння та серіалізації ● Мати такі методи: - Option<A>.Some(...) - Option<A>.None - Map - Bind Option з бібліотеки Language-Ext Опціональні значення
  • 35. Переваги та недоліки моделювання опціональних значень за допомогою Option чи null Option ● Зникає проблема подвійної валідації ● Коректна семантика опціональності ● Ідеально для бізнес-логіки ● Захаращує код Null ● Помилка часу виконання ● Семантика існування посилання ● Ідеально для інфраструктури на кордонах застосунку (адаптери, контролери) ● Захаращує пам’ять та час розробника
  • 36. Як маючи ці два примітивні значення створити маршрут? Створення нового об’єкту
  • 37. Оптимістичний підхід Ціле виключення на таку незначну дрібницю як невалідна дистанція/тривалість? Багато честі Але який тип тоді потрібен, щоб показати, що створення не вдалось? Створення нового об’єкту
  • 38. Виглядає практично як імперативний код Як тільки зустрічаємо перший None ● наступні кроки НЕ обробляються ● значення всього виразу стає None Монадична обробка Порядок обробки: ● повертає валідну дистанцію або None ● повертає валідну тривалість або None ● повертає валідний маршрут або None Створення нового об’єкту
  • 39. Але я хочу знати, яка саме помилка при створенні об'єкта!
  • 40. Дуже зручно помилки моделювати юніонами Практично те саме, що й з Option, але замість None буде CreateRouteError Створення нового об’єкту
  • 41. Зазвичай це стан помилки Два стани: або лівий, або правий Створення нового об’єкту
  • 42. Але я хочу знати ВСІ помилки при створенні об’єкту!
  • 43. Аплікативний стиль Збираємо ВСІ помилки. Гарно працює коли всі помилки один від одного незалежні Створення нового об’єкту
  • 45. Переваги та недоліки функціонального рішення створення нового об’єкту Переваги ● Ніяких раптових винятків ● Даний підхід ЗМУШУЄ подумати про обробку помилок Недоліки ● Неясно ● Незрозуміло ● Не прийнято суспільством ● Достатньо високий поріг входження ● Через брак підтримки в мові, потребує використання самописних бібліотек
  • 46. Висновки по створенню об’єктів ● Зовнішня простота приховує за собою внутрішню складність ● Винятки – лише для виняткових ситуацій в програмі! ● Якщо бізнес-логіка об’єкта передбачає можливість невдалого створення об’єкта (наприклад, під час валідації) – це не виняткова ситуація! ● Можливі три різні підходи для створення об’єктів в функціональному стилі: а. використовуючи тип Option – якщо нам важливо лише те, чи був створений об’єкт, чи ні b. використовуючи тип Either – якщо важлива лише перша помилка при створенні об'єкта с. використовуючи тип Validation – якщо важливо зібрати всі помилки при створенні об'єкта
  • 47. Головні функції для керування елементами Так робити некоректно, Option не стикаються! Якщо потрібно перетворити Option і в результаті перетворення отримуємо новий Option Якщо внутрішнє значення Option потрібно в щось перетворити Єдиний вірний варіант отримати внутрішнє значення (крім Match) Всі ці функції стандартні, також є в Either & Validation
  • 48. Стандартна функція, яка також є в Either & Validation Оброблюємо всі можливі стани Головні функції для керування елементами
  • 49. Практично імперативний код! Гуглити “do notation” Функціонально еквівалентні варіанти запису
  • 50. ● Це інша мова зі своїм специфічним синтаксисом та особливостями ● Вибір мови – це не твій персональний вибір ● Простіше вивчити нову бібліотеку ніж мову? ● C# вже дуже гарний та майже функціональний (але зрозуміло ООП підхід перш за все) ● Вчити елементи та концепції функціонального програмування на початку простіше в знайомому оточенні Чому б просто не використовувати F#?
  • 51. Чому саме ця бібліотека? ● Або писати самому – або брати вже готове ● На прикладі бібліотеки Uklon.Null ми побачили що буде, якщо писати це все самому ● До того ж, є неймовірно багато речей, які можуть бути корисними, але про них треба знати. Якщо писати самому — про них не дізнаєшся
  • 52. Навіщо це взагалі потрібно? ● Дані методи дають змогу безпечно моделювати складний домен, де багато зовнішніх залежностей ● Ці методи НЕ замінюють тести, сонар та інше, а лише ДОПОВНЮЮТЬ!
  • 53. Висновки ● Спробуйте на практиці змоделювати свою бізнес-логику за допомогою описаних методів ● Насправді порядок моделювання не дуже важливий, до кінцевого результату ви врешті решт прийдете використавши всі потрібні вам та описані методи ● Так в чому ж основна перевага? Ми ЗАВЖДИ знаємо, як комбінувати наші типи декларативним способом, що автоматично робить наш код більш простим та підтримуваним
  • 56. Q&A