SlideShare a Scribd company logo
1 of 43
Download to read offline
Дизайн крупных приложений
на функциональных языках
Александр Гранин
graninas@gmail.com
1
Технические аспекты
разработки крупного ПО
Зеленый ✓ ✗ ?: в мейнстриме
Красный ✓ ✗ ?: в ФП-мире
2
GRASP ✓✓✗ SOLID ✓✓✗
Мейнстрим
ФП
3
GRASP ✓✓✗ SOLID ✓✓✗
Паттерны проектирования
Мейнстрим
ФП
4
GRASP ✓✓✗ SOLID ✓✓✗
Паттерны проектирования ✓✓?
Мейнстрим
ФП
5
GRASP ✓✓✗ SOLID ✓✓✗
Паттерны проектирования ✓✓?
Inversion of Control ✓✓? Dependency Injection ✓✓?
Мейнстрим
ФП
6
GRASP ✓✓✗ SOLID ✓✓✗
Паттерны проектирования ✓✓?
Inversion of Control ✓✓? Dependency Injection ✓✓?
Мейнстрим
ФП
7
GRASP ✓✓✗ SOLID ✓✓✗
Паттерны проектирования ✓✓?
Inversion of Control ✓✓? Dependency Injection ✓✓?
Тестирование ✓✓✓✓ Отладка ✓✗✓?
Мейнстрим
ФП
8
GRASP ✓✓✗ SOLID ✓✓✗
Паттерны проектирования ✓✓?
Inversion of Control ✓✓? Dependency Injection ✓✓?
Тестирование ✓✓✓✓ Отладка ✓✓✓✗✓?
Мейнстрим
ФП
9
GRASP ✓✓✗ SOLID ✓✓✗
Паттерны проектирования ✓✓?
Inversion of Control ✓✓? Dependency Injection ✓✓?
Тестирование ✓✓✓✓ Отладка ✓✓✓✗✓?
Предметно-ориентированные языки
Мейнстрим
ФП
10
GRASP ✓✓✗ SOLID ✓✓✗
Паттерны проектирования ✓✓?
Inversion of Control ✓✓? Dependency Injection ✓✓?
Тестирование ✓✓✓✓ Отладка ✓✓✓✗✓?
Предметно-ориентированные языки ✗?✓ ✓✓✓
Мейнстрим
ФП
11
GRASP ✓✓✗ SOLID ✓✓✗
Паттерны проектирования ✓✓?
Inversion of Control ✓✓? Dependency Injection ✓✓?
Тестирование ✓✓✓✓ Отладка ✓✓✓✗✓?
Предметно-ориентированные языки ✗?✓ ✓✓✓
Комбинаторный подход
Мейнстрим
ФП
12
GRASP ✓✓✗ SOLID ✓✓✗
Паттерны проектирования ✓✓?
Inversion of Control ✓✓? Dependency Injection ✓✓?
Тестирование ✓✓✓✓ Отладка ✓✓✓✗✓?
Предметно-ориентированные языки ✗?✓ ✓✓✓
Комбинаторный подход ✗?✓ ✓✓✓
Мейнстрим
ФП
13
GRASP ✓✓✗ SOLID ✓✓✗
Паттерны проектирования ✓✓?
Inversion of Control ✓✓? Dependency Injection ✓✓?
Тестирование ✓✓✓✓ Отладка ✓✓✓✗✓?
Предметно-ориентированные языки ✗?✓ ✓✓✓
Комбинаторный подход ✗?✓ ✓✓✓
“Как это работает” ✓✗?✓ “Чем это является” ✗ ✓
Мейнстрим
ФП
14
GRASP ✓✓✗ SOLID ✓✓✗
Паттерны проектирования ✓✓?
Inversion of Control ✓✓? Dependency Injection ✓✓?
Тестирование ✓✓✓✓ Отладка ✓✓✓✗✓?
Предметно-ориентированные языки ✗?✓ ✓✓✓
Комбинаторный подход ✗?✓ ✓✓✓
“Как это работает” ✓✗?✓ “Чем это является” ✗ ✓
Мейнстрим
ФП
15
GRASP ✓✓✗ SOLID ✓✓✗
Паттерны проектирования ✓✓?
Inversion of Control ✓✓? Dependency Injection ✓✓?
Тестирование ✓✓✓✓ Отладка ✓✓✓✗✓?
Предметно-ориентированные языки ✗?✓ ✓✓✓
Комбинаторный подход ✗?✓ ✓✓✓
“Как это работает” ✓✗?✓ “Чем это является” ✗ ✓
Продвинутые идеи (FRP, STM, Actor Model, DSL, etc.)
Мейнстрим
ФП
16
GRASP ✓✓✗ SOLID ✓✓✗
Паттерны проектирования ✓✓?
Inversion of Control ✓✓? Dependency Injection ✓✓?
Тестирование ✓✓✓✓ Отладка ✓✓✓✗✓?
Предметно-ориентированные языки ✗?✓ ✓✓✓
Комбинаторный подход ✗?✓ ✓✓✓
“Как это работает” ✓✗?✓ “Чем это является” ✗ ✓
Продвинутые идеи (FRP, STM, Actor Model, DSL, etc.) ✗?
✓?
Мейнстрим
ФП
17
GRASP ✓✓✗ SOLID ✓✓✗
Паттерны проектирования ✓✓?
Inversion of Control ✓✓? Dependency Injection ✓✓?
Тестирование ✓✓✓✓ Отладка ✓✓✓✗✓?
Предметно-ориентированные языки ✗?✓ ✓✓✓
Комбинаторный подход ✗?✓ ✓✓✓
“Как это работает” ✓✗?✓ “Чем это является” ✗ ✓
Продвинутые идеи (FRP, STM, Actor Model, DSL, etc.) ✗?
✓?
Надежные нетекущие абстракции
Мейнстрим
ФП
18
GRASP ✓✓✗ SOLID ✓✓✗
Паттерны проектирования ✓✓?
Inversion of Control ✓✓? Dependency Injection ✓✓?
Тестирование ✓✓✓✓ Отладка ✓✓✓✗✓?
Предметно-ориентированные языки ✗?✓ ✓✓✓
Комбинаторный подход ✗?✓ ✓✓✓
“Как это работает” ✓✗?✓ “Чем это является” ✗ ✓
Продвинутые идеи (FRP, STM, Actor Model, DSL, etc.) ✗?
✓?
Надежные нетекущие абстракции ✗? ✓✓✓✗?
Мейнстрим
ФП
19
GRASP ✓✓✗ SOLID ✓✓✗
Паттерны проектирования ✓✓?
Inversion of Control ✓✓? Dependency Injection ✓✓?
Тестирование ✓✓✓✓ Отладка ✓✓✓✗✓?
Предметно-ориентированные языки ✗?✓ ✓✓✓
Комбинаторный подход ✗?✓ ✓✓✓
“Как это работает” ✓✗?✓ “Чем это является” ✗ ✓
Продвинутые идеи (FRP, STM, Actor Model, DSL, etc.) ✗?
✓?
Надежные нетекущие абстракции ✗? ✓✓✓✗?
Проектирование ПО ✓?✓✗ UML ✓✗
Мейнстрим
ФП
20
GRASP ✓✓✗ SOLID ✓✓✗
Паттерны проектирования ✓✓?
Inversion of Control ✓✓? Dependency Injection ✓✓?
Тестирование ✓✓✓✓ Отладка ✓✓✓✗✓?
Предметно-ориентированные языки ✗?✓ ✓✓✓
Комбинаторный подход ✗?✓ ✓✓✓
“Как это работает” ✓✗?✓ “Чем это является” ✗ ✓
Продвинутые идеи (FRP, STM, Actor Model, DSL, etc.) ✗?
✓?
Надежные нетекущие абстракции ✗? ✓✓✓✗?
Проектирование ПО ✓?✓✗ UML ✓✗
Мейнстрим
ФП
21
GRASP ✓✓✗ SOLID ✓✓✗
Паттерны проектирования ✓✓?
Inversion of Control ✓✓? Dependency Injection ✓✓?
Тестирование ✓✓✓✓ Отладка ✓✓✓✗✓?
Предметно-ориентированные языки ✗?✓ ✓✓✓
Комбинаторный подход ✗?✓ ✓✓✓
“Как это работает” ✓✗?✓ “Чем это является” ✗ ✓
Продвинутые идеи (FRP, STM, Actor Model, DSL, etc.) ✗?
✓?
Надежные нетекущие абстракции ✗? ✓✓✓✗?
Проектирование ПО ✓?✓✗ UML ✓✗
Мейнстрим
ФП
22
Проектирование ПО на UML
23
Анализ требований:
Use Cases
User Scenarios (текст)
Sequence Diagrams
24
Object Diagrams
Сommunication
Diagrams
25
Class Diagrams
26
Class Diagrams
Все,
приплыли.
27
Проектирование большого ФП-
проекта
28
Анализ требований:
MindMaps
29
Карта
необходимости
30
Карта элементов
(перфекционизм,
молчать!)
31
Карта подсистем
32
33
34
35
Побочные эффекты, FRP,
интерпретаторы и eDSL
36
37
viewFlow :: GameNode -> ViewWire () ()
viewFlow node = modes Render (selector node) . (
pure () &&&
interpret node
. printEventVal
. filterE isActualEvent
. now . event
)
Пример FRP-кода (Haskell Netwire)
38
produce f = do
prodObj <- createProduct (f ^. energyCost) (f ^. scheme)
placeProduct prodObj (f ^. placementAlg)
return "Successfully produced."
producingScenario :: Eval String
producingScenario = do
f <- read fabric
if f ^. producing then produce f else return "Producing paused."
Пример eDSL игровых сценариев
39
Ссылки
40
● Дизайн и архитектура ПО в ФП
http://habrahabr.ru/post/211871/
● Large-scale design in Haskell? (SO)
http://stackoverflow.com/questions/3077866/lar
ge-scale-design-in-haskell
Всем спасибо!
Александр Гранин
graninas@gmail.com
41
commandInterpreter :: GameNode -> Event -> Command
commandInterpreter _ ViewAcc.EventClose = V.Finish
commandInterpreter _ _ = V.Render
Пример интерпретатора событий
42
data Command = Finish
| Render
| StartViewPointMoving ScreenPoint
| ViewPointMoving ScreenPoint
| StopViewPointMoving ScreenPoint
modifyView (StartViewPointMoving scrPt) view = ...
modifyView (ViewPointMoving scrPt) view = ...
modifyView (StopViewPointMoving scrPt) view = ...
Пример eDSL модели представления
43

More Related Content

Similar to Design of big applications in FP

#MBLTdev: Практический пример переиспользования кода. Как повысить качество и...
#MBLTdev: Практический пример переиспользования кода. Как повысить качество и...#MBLTdev: Практический пример переиспользования кода. Как повысить качество и...
#MBLTdev: Практический пример переиспользования кода. Как повысить качество и...e-Legion
 
Cps 2014 cinesoft
Cps 2014 cinesoftCps 2014 cinesoft
Cps 2014 cinesoftCineSoft
 
Фреймворк для регрессионного тестирования на основе WebDriver
Фреймворк для регрессионного тестирования на основе WebDriverФреймворк для регрессионного тестирования на основе WebDriver
Фреймворк для регрессионного тестирования на основе WebDriverautomated-testing.info
 
Software process framework
Software process frameworkSoftware process framework
Software process frameworkachempion
 
Автоматизация визуального тестирования адаптивного дизайна на примере Galen F...
Автоматизация визуального тестирования адаптивного дизайна на примере Galen F...Автоматизация визуального тестирования адаптивного дизайна на примере Galen F...
Автоматизация визуального тестирования адаптивного дизайна на примере Galen F...COMAQA.BY
 
Михаил Корепанов "Инкрементальные обновления на клиенте"
Михаил Корепанов "Инкрементальные обновления на клиенте"Михаил Корепанов "Инкрементальные обновления на клиенте"
Михаил Корепанов "Инкрементальные обновления на клиенте"Yandex
 
Марина Апухтина: "SEO для IT: нюансы продвижения и чек-лист"
Марина Апухтина: "SEO для IT: нюансы продвижения и чек-лист"Марина Апухтина: "SEO для IT: нюансы продвижения и чек-лист"
Марина Апухтина: "SEO для IT: нюансы продвижения и чек-лист"Kharkov IT Cluster
 
Профессиональная разработка в суровом Enterprise
Профессиональная разработка в суровом EnterpriseПрофессиональная разработка в суровом Enterprise
Профессиональная разработка в суровом EnterpriseAlexander Granin
 
Безопасность веб-приложений: starter edition
Безопасность веб-приложений: starter editionБезопасность веб-приложений: starter edition
Безопасность веб-приложений: starter editionAndrew Petukhov
 
Частые ошибки при разработке фронтенда | Odessa Frontend Meetup #17
Частые ошибки при разработке фронтенда | Odessa Frontend Meetup #17Частые ошибки при разработке фронтенда | Odessa Frontend Meetup #17
Частые ошибки при разработке фронтенда | Odessa Frontend Meetup #17OdessaFrontend
 
Serghei Iakovlev "Chaos engineering in action"
Serghei Iakovlev "Chaos engineering in action"Serghei Iakovlev "Chaos engineering in action"
Serghei Iakovlev "Chaos engineering in action"Fwdays
 
DevNightDnepr 2015: «Взаимодействие менеджера и дизайнера: техническое задани...
DevNightDnepr 2015: «Взаимодействие менеджера и дизайнера: техническое задани...DevNightDnepr 2015: «Взаимодействие менеджера и дизайнера: техническое задани...
DevNightDnepr 2015: «Взаимодействие менеджера и дизайнера: техническое задани...DevGAMM Conference
 

Similar to Design of big applications in FP (13)

#MBLTdev: Практический пример переиспользования кода. Как повысить качество и...
#MBLTdev: Практический пример переиспользования кода. Как повысить качество и...#MBLTdev: Практический пример переиспользования кода. Как повысить качество и...
#MBLTdev: Практический пример переиспользования кода. Как повысить качество и...
 
Cps 2014 cinesoft
Cps 2014 cinesoftCps 2014 cinesoft
Cps 2014 cinesoft
 
Фреймворк для регрессионного тестирования на основе WebDriver
Фреймворк для регрессионного тестирования на основе WebDriverФреймворк для регрессионного тестирования на основе WebDriver
Фреймворк для регрессионного тестирования на основе WebDriver
 
Software process framework
Software process frameworkSoftware process framework
Software process framework
 
Автоматизация визуального тестирования адаптивного дизайна на примере Galen F...
Автоматизация визуального тестирования адаптивного дизайна на примере Galen F...Автоматизация визуального тестирования адаптивного дизайна на примере Galen F...
Автоматизация визуального тестирования адаптивного дизайна на примере Galen F...
 
Михаил Корепанов "Инкрементальные обновления на клиенте"
Михаил Корепанов "Инкрементальные обновления на клиенте"Михаил Корепанов "Инкрементальные обновления на клиенте"
Михаил Корепанов "Инкрементальные обновления на клиенте"
 
Марина Апухтина: "SEO для IT: нюансы продвижения и чек-лист"
Марина Апухтина: "SEO для IT: нюансы продвижения и чек-лист"Марина Апухтина: "SEO для IT: нюансы продвижения и чек-лист"
Марина Апухтина: "SEO для IT: нюансы продвижения и чек-лист"
 
Профессиональная разработка в суровом Enterprise
Профессиональная разработка в суровом EnterpriseПрофессиональная разработка в суровом Enterprise
Профессиональная разработка в суровом Enterprise
 
Безопасность веб-приложений: starter edition
Безопасность веб-приложений: starter editionБезопасность веб-приложений: starter edition
Безопасность веб-приложений: starter edition
 
Частые ошибки при разработке фронтенда | Odessa Frontend Meetup #17
Частые ошибки при разработке фронтенда | Odessa Frontend Meetup #17Частые ошибки при разработке фронтенда | Odessa Frontend Meetup #17
Частые ошибки при разработке фронтенда | Odessa Frontend Meetup #17
 
Serghei Iakovlev "Chaos engineering in action"
Serghei Iakovlev "Chaos engineering in action"Serghei Iakovlev "Chaos engineering in action"
Serghei Iakovlev "Chaos engineering in action"
 
DevNightDnepr 2015: «Взаимодействие менеджера и дизайнера: техническое задани...
DevNightDnepr 2015: «Взаимодействие менеджера и дизайнера: техническое задани...DevNightDnepr 2015: «Взаимодействие менеджера и дизайнера: техническое задани...
DevNightDnepr 2015: «Взаимодействие менеджера и дизайнера: техническое задани...
 
Bd
BdBd
Bd
 

More from Alexander Granin

Concurrent applications with free monads and stm
Concurrent applications with free monads and stmConcurrent applications with free monads and stm
Concurrent applications with free monads and stmAlexander Granin
 
Hierarchical free monads and software design in fp
Hierarchical free monads and software design in fpHierarchical free monads and software design in fp
Hierarchical free monads and software design in fpAlexander Granin
 
Final tagless vs free monad
Final tagless vs free monadFinal tagless vs free monad
Final tagless vs free monadAlexander Granin
 
The present and the future of functional programming in c++
The present and the future of functional programming in c++The present and the future of functional programming in c++
The present and the future of functional programming in c++Alexander Granin
 
О разработке десктопных приложений / About desktop development
О разработке десктопных приложений / About desktop developmentО разработке десктопных приложений / About desktop development
О разработке десктопных приложений / About desktop developmentAlexander Granin
 
Принципы и практики разработки ПО 2 / Principles and practices of software de...
Принципы и практики разработки ПО 2 / Principles and practices of software de...Принципы и практики разработки ПО 2 / Principles and practices of software de...
Принципы и практики разработки ПО 2 / Principles and practices of software de...Alexander Granin
 
Принципы и практики разработки ПО / Principles and practices of software deve...
Принципы и практики разработки ПО / Principles and practices of software deve...Принципы и практики разработки ПО / Principles and practices of software deve...
Принципы и практики разработки ПО / Principles and practices of software deve...Alexander Granin
 
Закон Деметры / Demetra's law
Закон Деметры / Demetra's lawЗакон Деметры / Demetra's law
Закон Деметры / Demetra's lawAlexander Granin
 
GitHub - зеркало разработчика
GitHub - зеркало разработчикаGitHub - зеркало разработчика
GitHub - зеркало разработчикаAlexander Granin
 
The Present and The Future of Functional Programming in C++
The Present and The Future of Functional Programming in C++The Present and The Future of Functional Programming in C++
The Present and The Future of Functional Programming in C++Alexander Granin
 
Functional programming in C++ LambdaNsk
Functional programming in C++ LambdaNskFunctional programming in C++ LambdaNsk
Functional programming in C++ LambdaNskAlexander Granin
 
Transition graph using free monads and existentials
Transition graph using free monads and existentialsTransition graph using free monads and existentials
Transition graph using free monads and existentialsAlexander Granin
 
Software transactional memory. pure functional approach
Software transactional memory. pure functional approachSoftware transactional memory. pure functional approach
Software transactional memory. pure functional approachAlexander Granin
 
Вы не понимаете ФП / You don't understand FP
Вы не понимаете ФП / You don't understand FPВы не понимаете ФП / You don't understand FP
Вы не понимаете ФП / You don't understand FPAlexander Granin
 
Functional "Life": parallel cellular automata and comonads
Functional "Life": parallel cellular automata and comonadsFunctional "Life": parallel cellular automata and comonads
Functional "Life": parallel cellular automata and comonadsAlexander Granin
 
Functional microscope - Lenses in C++
Functional microscope - Lenses in C++Functional microscope - Lenses in C++
Functional microscope - Lenses in C++Alexander Granin
 
Дизайн больших приложений в ФП
Дизайн больших приложений в ФПДизайн больших приложений в ФП
Дизайн больших приложений в ФПAlexander Granin
 
Линзы - комбинаторная манипуляция данными
Линзы - комбинаторная манипуляция даннымиЛинзы - комбинаторная манипуляция данными
Линзы - комбинаторная манипуляция даннымиAlexander Granin
 
Линзы - комбинаторная манипуляция данными (Dev2Dev)
Линзы - комбинаторная манипуляция данными (Dev2Dev)Линзы - комбинаторная манипуляция данными (Dev2Dev)
Линзы - комбинаторная манипуляция данными (Dev2Dev)Alexander Granin
 

More from Alexander Granin (20)

Concurrent applications with free monads and stm
Concurrent applications with free monads and stmConcurrent applications with free monads and stm
Concurrent applications with free monads and stm
 
Hierarchical free monads and software design in fp
Hierarchical free monads and software design in fpHierarchical free monads and software design in fp
Hierarchical free monads and software design in fp
 
Final tagless vs free monad
Final tagless vs free monadFinal tagless vs free monad
Final tagless vs free monad
 
Monadic parsers in C++
Monadic parsers in C++Monadic parsers in C++
Monadic parsers in C++
 
The present and the future of functional programming in c++
The present and the future of functional programming in c++The present and the future of functional programming in c++
The present and the future of functional programming in c++
 
О разработке десктопных приложений / About desktop development
О разработке десктопных приложений / About desktop developmentО разработке десктопных приложений / About desktop development
О разработке десктопных приложений / About desktop development
 
Принципы и практики разработки ПО 2 / Principles and practices of software de...
Принципы и практики разработки ПО 2 / Principles and practices of software de...Принципы и практики разработки ПО 2 / Principles and practices of software de...
Принципы и практики разработки ПО 2 / Principles and practices of software de...
 
Принципы и практики разработки ПО / Principles and practices of software deve...
Принципы и практики разработки ПО / Principles and practices of software deve...Принципы и практики разработки ПО / Principles and practices of software deve...
Принципы и практики разработки ПО / Principles and practices of software deve...
 
Закон Деметры / Demetra's law
Закон Деметры / Demetra's lawЗакон Деметры / Demetra's law
Закон Деметры / Demetra's law
 
GitHub - зеркало разработчика
GitHub - зеркало разработчикаGitHub - зеркало разработчика
GitHub - зеркало разработчика
 
The Present and The Future of Functional Programming in C++
The Present and The Future of Functional Programming in C++The Present and The Future of Functional Programming in C++
The Present and The Future of Functional Programming in C++
 
Functional programming in C++ LambdaNsk
Functional programming in C++ LambdaNskFunctional programming in C++ LambdaNsk
Functional programming in C++ LambdaNsk
 
Transition graph using free monads and existentials
Transition graph using free monads and existentialsTransition graph using free monads and existentials
Transition graph using free monads and existentials
 
Software transactional memory. pure functional approach
Software transactional memory. pure functional approachSoftware transactional memory. pure functional approach
Software transactional memory. pure functional approach
 
Вы не понимаете ФП / You don't understand FP
Вы не понимаете ФП / You don't understand FPВы не понимаете ФП / You don't understand FP
Вы не понимаете ФП / You don't understand FP
 
Functional "Life": parallel cellular automata and comonads
Functional "Life": parallel cellular automata and comonadsFunctional "Life": parallel cellular automata and comonads
Functional "Life": parallel cellular automata and comonads
 
Functional microscope - Lenses in C++
Functional microscope - Lenses in C++Functional microscope - Lenses in C++
Functional microscope - Lenses in C++
 
Дизайн больших приложений в ФП
Дизайн больших приложений в ФПДизайн больших приложений в ФП
Дизайн больших приложений в ФП
 
Линзы - комбинаторная манипуляция данными
Линзы - комбинаторная манипуляция даннымиЛинзы - комбинаторная манипуляция данными
Линзы - комбинаторная манипуляция данными
 
Линзы - комбинаторная манипуляция данными (Dev2Dev)
Линзы - комбинаторная манипуляция данными (Dev2Dev)Линзы - комбинаторная манипуляция данными (Dev2Dev)
Линзы - комбинаторная манипуляция данными (Dev2Dev)
 

Design of big applications in FP

  • 1. Дизайн крупных приложений на функциональных языках Александр Гранин graninas@gmail.com 1
  • 2. Технические аспекты разработки крупного ПО Зеленый ✓ ✗ ?: в мейнстриме Красный ✓ ✗ ?: в ФП-мире 2
  • 3. GRASP ✓✓✗ SOLID ✓✓✗ Мейнстрим ФП 3
  • 4. GRASP ✓✓✗ SOLID ✓✓✗ Паттерны проектирования Мейнстрим ФП 4
  • 5. GRASP ✓✓✗ SOLID ✓✓✗ Паттерны проектирования ✓✓? Мейнстрим ФП 5
  • 6. GRASP ✓✓✗ SOLID ✓✓✗ Паттерны проектирования ✓✓? Inversion of Control ✓✓? Dependency Injection ✓✓? Мейнстрим ФП 6
  • 7. GRASP ✓✓✗ SOLID ✓✓✗ Паттерны проектирования ✓✓? Inversion of Control ✓✓? Dependency Injection ✓✓? Мейнстрим ФП 7
  • 8. GRASP ✓✓✗ SOLID ✓✓✗ Паттерны проектирования ✓✓? Inversion of Control ✓✓? Dependency Injection ✓✓? Тестирование ✓✓✓✓ Отладка ✓✗✓? Мейнстрим ФП 8
  • 9. GRASP ✓✓✗ SOLID ✓✓✗ Паттерны проектирования ✓✓? Inversion of Control ✓✓? Dependency Injection ✓✓? Тестирование ✓✓✓✓ Отладка ✓✓✓✗✓? Мейнстрим ФП 9
  • 10. GRASP ✓✓✗ SOLID ✓✓✗ Паттерны проектирования ✓✓? Inversion of Control ✓✓? Dependency Injection ✓✓? Тестирование ✓✓✓✓ Отладка ✓✓✓✗✓? Предметно-ориентированные языки Мейнстрим ФП 10
  • 11. GRASP ✓✓✗ SOLID ✓✓✗ Паттерны проектирования ✓✓? Inversion of Control ✓✓? Dependency Injection ✓✓? Тестирование ✓✓✓✓ Отладка ✓✓✓✗✓? Предметно-ориентированные языки ✗?✓ ✓✓✓ Мейнстрим ФП 11
  • 12. GRASP ✓✓✗ SOLID ✓✓✗ Паттерны проектирования ✓✓? Inversion of Control ✓✓? Dependency Injection ✓✓? Тестирование ✓✓✓✓ Отладка ✓✓✓✗✓? Предметно-ориентированные языки ✗?✓ ✓✓✓ Комбинаторный подход Мейнстрим ФП 12
  • 13. GRASP ✓✓✗ SOLID ✓✓✗ Паттерны проектирования ✓✓? Inversion of Control ✓✓? Dependency Injection ✓✓? Тестирование ✓✓✓✓ Отладка ✓✓✓✗✓? Предметно-ориентированные языки ✗?✓ ✓✓✓ Комбинаторный подход ✗?✓ ✓✓✓ Мейнстрим ФП 13
  • 14. GRASP ✓✓✗ SOLID ✓✓✗ Паттерны проектирования ✓✓? Inversion of Control ✓✓? Dependency Injection ✓✓? Тестирование ✓✓✓✓ Отладка ✓✓✓✗✓? Предметно-ориентированные языки ✗?✓ ✓✓✓ Комбинаторный подход ✗?✓ ✓✓✓ “Как это работает” ✓✗?✓ “Чем это является” ✗ ✓ Мейнстрим ФП 14
  • 15. GRASP ✓✓✗ SOLID ✓✓✗ Паттерны проектирования ✓✓? Inversion of Control ✓✓? Dependency Injection ✓✓? Тестирование ✓✓✓✓ Отладка ✓✓✓✗✓? Предметно-ориентированные языки ✗?✓ ✓✓✓ Комбинаторный подход ✗?✓ ✓✓✓ “Как это работает” ✓✗?✓ “Чем это является” ✗ ✓ Мейнстрим ФП 15
  • 16. GRASP ✓✓✗ SOLID ✓✓✗ Паттерны проектирования ✓✓? Inversion of Control ✓✓? Dependency Injection ✓✓? Тестирование ✓✓✓✓ Отладка ✓✓✓✗✓? Предметно-ориентированные языки ✗?✓ ✓✓✓ Комбинаторный подход ✗?✓ ✓✓✓ “Как это работает” ✓✗?✓ “Чем это является” ✗ ✓ Продвинутые идеи (FRP, STM, Actor Model, DSL, etc.) Мейнстрим ФП 16
  • 17. GRASP ✓✓✗ SOLID ✓✓✗ Паттерны проектирования ✓✓? Inversion of Control ✓✓? Dependency Injection ✓✓? Тестирование ✓✓✓✓ Отладка ✓✓✓✗✓? Предметно-ориентированные языки ✗?✓ ✓✓✓ Комбинаторный подход ✗?✓ ✓✓✓ “Как это работает” ✓✗?✓ “Чем это является” ✗ ✓ Продвинутые идеи (FRP, STM, Actor Model, DSL, etc.) ✗? ✓? Мейнстрим ФП 17
  • 18. GRASP ✓✓✗ SOLID ✓✓✗ Паттерны проектирования ✓✓? Inversion of Control ✓✓? Dependency Injection ✓✓? Тестирование ✓✓✓✓ Отладка ✓✓✓✗✓? Предметно-ориентированные языки ✗?✓ ✓✓✓ Комбинаторный подход ✗?✓ ✓✓✓ “Как это работает” ✓✗?✓ “Чем это является” ✗ ✓ Продвинутые идеи (FRP, STM, Actor Model, DSL, etc.) ✗? ✓? Надежные нетекущие абстракции Мейнстрим ФП 18
  • 19. GRASP ✓✓✗ SOLID ✓✓✗ Паттерны проектирования ✓✓? Inversion of Control ✓✓? Dependency Injection ✓✓? Тестирование ✓✓✓✓ Отладка ✓✓✓✗✓? Предметно-ориентированные языки ✗?✓ ✓✓✓ Комбинаторный подход ✗?✓ ✓✓✓ “Как это работает” ✓✗?✓ “Чем это является” ✗ ✓ Продвинутые идеи (FRP, STM, Actor Model, DSL, etc.) ✗? ✓? Надежные нетекущие абстракции ✗? ✓✓✓✗? Мейнстрим ФП 19
  • 20. GRASP ✓✓✗ SOLID ✓✓✗ Паттерны проектирования ✓✓? Inversion of Control ✓✓? Dependency Injection ✓✓? Тестирование ✓✓✓✓ Отладка ✓✓✓✗✓? Предметно-ориентированные языки ✗?✓ ✓✓✓ Комбинаторный подход ✗?✓ ✓✓✓ “Как это работает” ✓✗?✓ “Чем это является” ✗ ✓ Продвинутые идеи (FRP, STM, Actor Model, DSL, etc.) ✗? ✓? Надежные нетекущие абстракции ✗? ✓✓✓✗? Проектирование ПО ✓?✓✗ UML ✓✗ Мейнстрим ФП 20
  • 21. GRASP ✓✓✗ SOLID ✓✓✗ Паттерны проектирования ✓✓? Inversion of Control ✓✓? Dependency Injection ✓✓? Тестирование ✓✓✓✓ Отладка ✓✓✓✗✓? Предметно-ориентированные языки ✗?✓ ✓✓✓ Комбинаторный подход ✗?✓ ✓✓✓ “Как это работает” ✓✗?✓ “Чем это является” ✗ ✓ Продвинутые идеи (FRP, STM, Actor Model, DSL, etc.) ✗? ✓? Надежные нетекущие абстракции ✗? ✓✓✓✗? Проектирование ПО ✓?✓✗ UML ✓✗ Мейнстрим ФП 21
  • 22. GRASP ✓✓✗ SOLID ✓✓✗ Паттерны проектирования ✓✓? Inversion of Control ✓✓? Dependency Injection ✓✓? Тестирование ✓✓✓✓ Отладка ✓✓✓✗✓? Предметно-ориентированные языки ✗?✓ ✓✓✓ Комбинаторный подход ✗?✓ ✓✓✓ “Как это работает” ✓✗?✓ “Чем это является” ✗ ✓ Продвинутые идеи (FRP, STM, Actor Model, DSL, etc.) ✗? ✓? Надежные нетекущие абстракции ✗? ✓✓✓✗? Проектирование ПО ✓?✓✗ UML ✓✗ Мейнстрим ФП 22
  • 24. Анализ требований: Use Cases User Scenarios (текст) Sequence Diagrams 24
  • 33. 33
  • 34. 34
  • 35. 35
  • 37. 37
  • 38. viewFlow :: GameNode -> ViewWire () () viewFlow node = modes Render (selector node) . ( pure () &&& interpret node . printEventVal . filterE isActualEvent . now . event ) Пример FRP-кода (Haskell Netwire) 38
  • 39. produce f = do prodObj <- createProduct (f ^. energyCost) (f ^. scheme) placeProduct prodObj (f ^. placementAlg) return "Successfully produced." producingScenario :: Eval String producingScenario = do f <- read fabric if f ^. producing then produce f else return "Producing paused." Пример eDSL игровых сценариев 39
  • 40. Ссылки 40 ● Дизайн и архитектура ПО в ФП http://habrahabr.ru/post/211871/ ● Large-scale design in Haskell? (SO) http://stackoverflow.com/questions/3077866/lar ge-scale-design-in-haskell
  • 42. commandInterpreter :: GameNode -> Event -> Command commandInterpreter _ ViewAcc.EventClose = V.Finish commandInterpreter _ _ = V.Render Пример интерпретатора событий 42
  • 43. data Command = Finish | Render | StartViewPointMoving ScreenPoint | ViewPointMoving ScreenPoint | StopViewPointMoving ScreenPoint modifyView (StartViewPointMoving scrPt) view = ... modifyView (ViewPointMoving scrPt) view = ... modifyView (StopViewPointMoving scrPt) view = ... Пример eDSL модели представления 43