Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Design of big applications in FP

27 views

Published on

A talk for LambdaNsk meetup about common approaches to software design and their applicability to FP.

Published in: Technology
  • Be the first to comment

  • Be the first to like this

Design of big applications in FP

  1. 1. Дизайн крупных приложений на функциональных языках Александр Гранин graninas@gmail.com 1
  2. 2. Технические аспекты разработки крупного ПО Зеленый ✓ ✗ ?: в мейнстриме Красный ✓ ✗ ?: в ФП-мире 2
  3. 3. GRASP ✓✓✗ SOLID ✓✓✗ Мейнстрим ФП 3
  4. 4. GRASP ✓✓✗ SOLID ✓✓✗ Паттерны проектирования Мейнстрим ФП 4
  5. 5. GRASP ✓✓✗ SOLID ✓✓✗ Паттерны проектирования ✓✓? Мейнстрим ФП 5
  6. 6. GRASP ✓✓✗ SOLID ✓✓✗ Паттерны проектирования ✓✓? Inversion of Control ✓✓? Dependency Injection ✓✓? Мейнстрим ФП 6
  7. 7. GRASP ✓✓✗ SOLID ✓✓✗ Паттерны проектирования ✓✓? Inversion of Control ✓✓? Dependency Injection ✓✓? Мейнстрим ФП 7
  8. 8. GRASP ✓✓✗ SOLID ✓✓✗ Паттерны проектирования ✓✓? Inversion of Control ✓✓? Dependency Injection ✓✓? Тестирование ✓✓✓✓ Отладка ✓✗✓? Мейнстрим ФП 8
  9. 9. GRASP ✓✓✗ SOLID ✓✓✗ Паттерны проектирования ✓✓? Inversion of Control ✓✓? Dependency Injection ✓✓? Тестирование ✓✓✓✓ Отладка ✓✓✓✗✓? Мейнстрим ФП 9
  10. 10. GRASP ✓✓✗ SOLID ✓✓✗ Паттерны проектирования ✓✓? Inversion of Control ✓✓? Dependency Injection ✓✓? Тестирование ✓✓✓✓ Отладка ✓✓✓✗✓? Предметно-ориентированные языки Мейнстрим ФП 10
  11. 11. GRASP ✓✓✗ SOLID ✓✓✗ Паттерны проектирования ✓✓? Inversion of Control ✓✓? Dependency Injection ✓✓? Тестирование ✓✓✓✓ Отладка ✓✓✓✗✓? Предметно-ориентированные языки ✗?✓ ✓✓✓ Мейнстрим ФП 11
  12. 12. GRASP ✓✓✗ SOLID ✓✓✗ Паттерны проектирования ✓✓? Inversion of Control ✓✓? Dependency Injection ✓✓? Тестирование ✓✓✓✓ Отладка ✓✓✓✗✓? Предметно-ориентированные языки ✗?✓ ✓✓✓ Комбинаторный подход Мейнстрим ФП 12
  13. 13. GRASP ✓✓✗ SOLID ✓✓✗ Паттерны проектирования ✓✓? Inversion of Control ✓✓? Dependency Injection ✓✓? Тестирование ✓✓✓✓ Отладка ✓✓✓✗✓? Предметно-ориентированные языки ✗?✓ ✓✓✓ Комбинаторный подход ✗?✓ ✓✓✓ Мейнстрим ФП 13
  14. 14. GRASP ✓✓✗ SOLID ✓✓✗ Паттерны проектирования ✓✓? Inversion of Control ✓✓? Dependency Injection ✓✓? Тестирование ✓✓✓✓ Отладка ✓✓✓✗✓? Предметно-ориентированные языки ✗?✓ ✓✓✓ Комбинаторный подход ✗?✓ ✓✓✓ “Как это работает” ✓✗?✓ “Чем это является” ✗ ✓ Мейнстрим ФП 14
  15. 15. GRASP ✓✓✗ SOLID ✓✓✗ Паттерны проектирования ✓✓? Inversion of Control ✓✓? Dependency Injection ✓✓? Тестирование ✓✓✓✓ Отладка ✓✓✓✗✓? Предметно-ориентированные языки ✗?✓ ✓✓✓ Комбинаторный подход ✗?✓ ✓✓✓ “Как это работает” ✓✗?✓ “Чем это является” ✗ ✓ Мейнстрим ФП 15
  16. 16. GRASP ✓✓✗ SOLID ✓✓✗ Паттерны проектирования ✓✓? Inversion of Control ✓✓? Dependency Injection ✓✓? Тестирование ✓✓✓✓ Отладка ✓✓✓✗✓? Предметно-ориентированные языки ✗?✓ ✓✓✓ Комбинаторный подход ✗?✓ ✓✓✓ “Как это работает” ✓✗?✓ “Чем это является” ✗ ✓ Продвинутые идеи (FRP, STM, Actor Model, DSL, etc.) Мейнстрим ФП 16
  17. 17. GRASP ✓✓✗ SOLID ✓✓✗ Паттерны проектирования ✓✓? Inversion of Control ✓✓? Dependency Injection ✓✓? Тестирование ✓✓✓✓ Отладка ✓✓✓✗✓? Предметно-ориентированные языки ✗?✓ ✓✓✓ Комбинаторный подход ✗?✓ ✓✓✓ “Как это работает” ✓✗?✓ “Чем это является” ✗ ✓ Продвинутые идеи (FRP, STM, Actor Model, DSL, etc.) ✗? ✓? Мейнстрим ФП 17
  18. 18. GRASP ✓✓✗ SOLID ✓✓✗ Паттерны проектирования ✓✓? Inversion of Control ✓✓? Dependency Injection ✓✓? Тестирование ✓✓✓✓ Отладка ✓✓✓✗✓? Предметно-ориентированные языки ✗?✓ ✓✓✓ Комбинаторный подход ✗?✓ ✓✓✓ “Как это работает” ✓✗?✓ “Чем это является” ✗ ✓ Продвинутые идеи (FRP, STM, Actor Model, DSL, etc.) ✗? ✓? Надежные нетекущие абстракции Мейнстрим ФП 18
  19. 19. GRASP ✓✓✗ SOLID ✓✓✗ Паттерны проектирования ✓✓? Inversion of Control ✓✓? Dependency Injection ✓✓? Тестирование ✓✓✓✓ Отладка ✓✓✓✗✓? Предметно-ориентированные языки ✗?✓ ✓✓✓ Комбинаторный подход ✗?✓ ✓✓✓ “Как это работает” ✓✗?✓ “Чем это является” ✗ ✓ Продвинутые идеи (FRP, STM, Actor Model, DSL, etc.) ✗? ✓? Надежные нетекущие абстракции ✗? ✓✓✓✗? Мейнстрим ФП 19
  20. 20. GRASP ✓✓✗ SOLID ✓✓✗ Паттерны проектирования ✓✓? Inversion of Control ✓✓? Dependency Injection ✓✓? Тестирование ✓✓✓✓ Отладка ✓✓✓✗✓? Предметно-ориентированные языки ✗?✓ ✓✓✓ Комбинаторный подход ✗?✓ ✓✓✓ “Как это работает” ✓✗?✓ “Чем это является” ✗ ✓ Продвинутые идеи (FRP, STM, Actor Model, DSL, etc.) ✗? ✓? Надежные нетекущие абстракции ✗? ✓✓✓✗? Проектирование ПО ✓?✓✗ UML ✓✗ Мейнстрим ФП 20
  21. 21. GRASP ✓✓✗ SOLID ✓✓✗ Паттерны проектирования ✓✓? Inversion of Control ✓✓? Dependency Injection ✓✓? Тестирование ✓✓✓✓ Отладка ✓✓✓✗✓? Предметно-ориентированные языки ✗?✓ ✓✓✓ Комбинаторный подход ✗?✓ ✓✓✓ “Как это работает” ✓✗?✓ “Чем это является” ✗ ✓ Продвинутые идеи (FRP, STM, Actor Model, DSL, etc.) ✗? ✓? Надежные нетекущие абстракции ✗? ✓✓✓✗? Проектирование ПО ✓?✓✗ UML ✓✗ Мейнстрим ФП 21
  22. 22. GRASP ✓✓✗ SOLID ✓✓✗ Паттерны проектирования ✓✓? Inversion of Control ✓✓? Dependency Injection ✓✓? Тестирование ✓✓✓✓ Отладка ✓✓✓✗✓? Предметно-ориентированные языки ✗?✓ ✓✓✓ Комбинаторный подход ✗?✓ ✓✓✓ “Как это работает” ✓✗?✓ “Чем это является” ✗ ✓ Продвинутые идеи (FRP, STM, Actor Model, DSL, etc.) ✗? ✓? Надежные нетекущие абстракции ✗? ✓✓✓✗? Проектирование ПО ✓?✓✗ UML ✓✗ Мейнстрим ФП 22
  23. 23. Проектирование ПО на UML 23
  24. 24. Анализ требований: Use Cases User Scenarios (текст) Sequence Diagrams 24
  25. 25. Object Diagrams Сommunication Diagrams 25
  26. 26. Class Diagrams 26
  27. 27. Class Diagrams Все, приплыли. 27
  28. 28. Проектирование большого ФП- проекта 28
  29. 29. Анализ требований: MindMaps 29
  30. 30. Карта необходимости 30
  31. 31. Карта элементов (перфекционизм, молчать!) 31
  32. 32. Карта подсистем 32
  33. 33. 33
  34. 34. 34
  35. 35. 35
  36. 36. Побочные эффекты, FRP, интерпретаторы и eDSL 36
  37. 37. 37
  38. 38. viewFlow :: GameNode -> ViewWire () () viewFlow node = modes Render (selector node) . ( pure () &&& interpret node . printEventVal . filterE isActualEvent . now . event ) Пример FRP-кода (Haskell Netwire) 38
  39. 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. Ссылки 40 ● Дизайн и архитектура ПО в ФП http://habrahabr.ru/post/211871/ ● Large-scale design in Haskell? (SO) http://stackoverflow.com/questions/3077866/lar ge-scale-design-in-haskell
  41. 41. Всем спасибо! Александр Гранин graninas@gmail.com 41
  42. 42. commandInterpreter :: GameNode -> Event -> Command commandInterpreter _ ViewAcc.EventClose = V.Finish commandInterpreter _ _ = V.Render Пример интерпретатора событий 42
  43. 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

×