2. О себе
2
● Продолжающий хаскеллист, исследователь
● LambdaNsk - ФП-сообщество Новосибирска
● Статьи на Хабре о Haskell, о дизайне в ФП
● Haskell pet-projects
● Работаю в Kaspersky Lab (C++, C#)
3. О чем будем говорить
● Проектирование в ФП
● Элементы функционального дизайна
● Кому он в ФП нужен, этот ваш дизайн?
3
7. 7
UML SOLID
SRP Single Responsibility Principle
OCP Open Close Principle
LSP Liskov Substitution Principle
ISP Interface Segregation Principle
DIP Dependency Injection Principle
Encapsulation
Inheritance
Polymorphism
AbstractionG.R.A.S.P.
Inversion of
Control
8. 8
UML SOLID
SRP Single Responsibility Principle
OCP Open Close Principle
LSP Liskov Substitution Principle
ISP Interface Segregation Principle
DIP Dependency Injection Principle
Encapsulation
Inheritance
Polymorphism
AbstractionG.R.A.S.P.
Inversion of
Control
9. 9
UML SOLID
SRP Single Responsibility Principle
OCP Open Close Principle
LSP Liskov Substitution Principle
ISP Interface Segregation Principle
DIP Dependency Injection Principle
Encapsulation
Inheritance
Polymorphism
AbstractionG.R.A.S.P.
Inversion of
Control
10. 10
UML SOLID
SRP Single Responsibility Principle
OCP Open Close Principle
LSP Liskov Substitution Principle
ISP Interface Segregation Principle
DIP Dependency Injection Principle
Encapsulation
Inheritance
Polymorphism
AbstractionG.R.A.S.P.
Inversion of
Control
MONADS
STATE State monad
IO IO monad
LIST List monad
ID Identity monad
RWS Read-Write-State monad
Laziness
Immutability
Combinators
Abstraction
D.S.L.
High Order
Functions
11. 11
UML SOLID
SRP Single Responsibility Principle
OCP Open Close Principle
LSP Liskov Substitution Principle
ISP Interface Segregation Principle
DIP Dependency Injection Principle
Encapsulation
Inheritance
Polymorphism
AbstractionG.R.A.S.P.
Inversion of
Control
MONADS
STATE State monad
IO IO monad
LIST List monad
ID Identity monad
RWS Read-Write-State monad
Laziness
Immutability
Combinators
Abstraction
D.S.L.
High Order
Functions
14. Дизайн в ФП?
14
SOLID
SRP Single Responsibility Principle
OCP Open Close Principle
LSP Liskov Substitution Principle
ISP Interface Segregation Principle
DIP Dependency Injection Principle
Inversion of
Control
26. 26
Карта элементов (ассоциативная)
● Все возможности
● Ассоциативные связи
● “Поток сознания” (!)
● Без структуры (!!)
● Легенда
Библиотеки, слои,
подсистемы, концепты,
данные, объекты, типы
53. Оставшиеся вопросы
53
● Типы данных
● Обработка ошибок
● Работа с внешними API
● Важные структуры данных
● UI
● Базы данных
● Потоковый дизайн
● ...
54. Полезные источники
54
Scott Wlaschin
● How to design and code a complete program
● Functional Programming Patterns
● Railway Oriented Programming
Александр Гранин
● Дизайн и архитектура в ФП
57. 2. Взаимодействие подсистем, контроль эффектов
57
● FRP / Event Bus, Reactive Scenarios
+ Низкая связанность (Low Coupling)
+ Независимость подсистем
+ Контроль побочных эффектов
+ Разное взаимодействие == разные сценарии
+ Сценарии: Arrows / Monads / Applicatives
- Зоопарк и сложность FRP-библиотек (Haskell)
- Много возможных моделей Event Flow
- Трудно тестировать FRP-сценарии
58. 58
● Монолитная - объекты описываются типами 1:1
+ Algebraic Data Types
+ Проста в понимании, реализации
+ Pattern Matching
+ Подходит для маленькой предметной области
- Сложность растет экспоненциально с ростом функциональности
- Монолитный код
- Зависимость кода от внутренностей модели
- Трудно адаптировать под изменяющиеся требования
3. Монолитная модель данных
59. 4. Комбинаторная модель данных
59
● Комбинаторная - объекты комбинируются из частей (свойств)
+ Богатые возможности комбинаторного подхода
+ Проще адаптировать под изменяющиеся требования
+ Легко адресовать функциональность к частям модели
+ Сложность растет линейно с ростом функциональности
+ Подходит для большой и сложной предметной области
- Более сложный код обвязки (создание / изменение объектов и т.д.)
- Трудно выделить правильные комбинатоы / свойства
60. 5. Трансформация модели данных
60
● Линзы
+ Работа со структурами любой сложности
+ Богатые возможности по трансформации и запросам к данным
+ Компактный код
- Сложность библиотек для линз (Haskell)
- Вопросы производительности
61. ● Наивный IoC - функции высших порядков
● Monad.State Dependency Injection
6. Inversion of Control, внедрение зависимостей
61
+ Код “сверху-вниз”, от общих функций к частным
+ IoC - привычный способ мышления
+ Подходит для небольших частей / программ
- State & Dependency Injection - Not a FP Way
- “Лобовые” решения типичных задач
- Нет места функциональным идиомам