Применение принципов функционального мышления
#
Васильев Андрей Михайлович, 2022
Версии презентации
Обзор лекции
#
В рамках данной лекции будут кратко освещено применение основных идей из данной книги на конкретном примере. Данные мысли будут раскрыты детально в дальнейшем
Пиццерия будущего
#
Рассмотрим пиццерию Тани в 2118 году:
- пиццу готовят в пиццериях
- пиццу употребляют
- пиццу готовят роботы
- сценарии приготовления пиццы пишем на JavaScript
Применение принципов в пиццерии
#
Рецепты Тани стали популярны и ей необходимо расширять производственную линию, поэтому она пытается применить принципы функционального программирования для своей задачи
- Часть №1: выделение действий, вычислений и данных
- Разделение кода по приготовлению пиццы на категории
- Организация кода по слоям согласно принципам статифицированного дизайна
- Часть №2: использование функциональных абстракций и подходов
- Использование временного графика для анализа работы системы
- Применение функций высшего порядка для координации роботов
Разделение кода на категории
#
Таня произвела разделение исходного кода на три категории
- Действия. Подразумевают использование ингридиентов и других ресурсов кухни: духовка, доставка. Примеры:
- Раскатка теста
- Доставка пиццы
- Заказ ингридиентов
- Вычисления. Позволяют принимать решения и планировать следующие шаги
- Копирование рецепта
- Определение списка покупок
- Данные в неизменяемом формате. Описывают все особенности работы пиццерии
- Заказы клиентов
- Рецепты, инвентарь
- Чеки
Организация кода в соответствии с частотой изменений
#
Со временем большинство приложений, включая программы Татьяны, приходится изменять в соответствии с изменениями в логике работы предприятия. Статифицированный подход к организации исходного кода помогает уменьшить количество изменений и снизить стоимость их внесения
Логика стратификации:
- В основе кода должны находится код, слабо подверженный изменениями
- Код, наиболее подверженный изменениям, зависит от слабо изменяющихся частей
Разделение на примере кода Тани:
- В основе лежит язык JavaScript, массивы и объекты, не изменяется часто
- На его основе формируется слой предметной области, описывающий приготовление пиццы
- На самом верху находится код, описывающий специфику бизнеса Тани
Разделение кода на примере Тани
#
Изменения |
Слои кухни |
Слои инвентаря |
Слои |
Часто |
Меню на эту неделю, рецепт блюда дня |
Поездка за продуктами, выбор поставщиков продуктов |
Бизнес-правила |
Не часто |
Приготовление пиццы, структурирование рецепта |
Списки ингридиентов, операции по работе над списками |
Предметная область |
Редко |
Язык JavaScript объекты, массивы |
Язык JavaScript, объекты, массивы |
Стек технологий |
Бизнес-правила легко изменять, так как от них не зависят другие части приложения
Функциональные абстракции
#
В настоящий момент пиццу готовит один робот и его производительности уже не хватает для обслуживания всех клиентов пиццерии
- Каждый шаг данной последовательности является действием
- По завершению одного шага всегда понятно что делать дальше
Попытаемся привлечь к созданию пиццы нескольких роботов: можно явно отделить задачи по созданию теста, соуса и тёртого сыра от их использования
Визуализация распределённых систем
#
В случае выполнения действий по приготовлению пиццы несколькими роботами задача становится распределённой
После первой попытки распределения задачи между тремя роботами много пицц было испорчено
Для поиска причины сформируем диаграмму временной последовательности
Варианты приготовления пиццы
#
Роботы при выполнении работы не смотрят друг на друга, а выполняют задачу, следовательно возможны следующие варианты по времени завершения дел роботами:
- Вариант №1
- Приготовить тесто
- Натереть сыр
- Приготовить соус
- Вариант №2
- Приготовить тесто
- Приготовить соус
- Натереть сыр
- Вариант №3
- Приготовить соус
- Приготовить тесто
- Натереть сыр
- Вариант №4
- Приготовить соус
- Натереть сыр
- Приготовить тесто
- Вариант №5
- Натереть сыр
- Приготовить тесто
- Приготовить соус
- Вариант №6
- Натереть сыр
- Приготовить соус
- Приготовить тесто
Только варианты с подготовкой соуса последним гарантируют нормальное приготовление пиццы
Анализ результатов распределённого приготовления пиццы
#
- По умолчанию распределённые процессы не координированы друг с другом. Для совместной работы нужна координация.
- Нельзя полагаться на время выполнения действий в других процессах. Процесс не должен иметь скрытых зависимостей от других процессов.
- Плохая, но возможная, последовательность действий скорее всего произойдёт. Распределённые системы должны всегда предоставлять хорошие результаты.
- Диаграммы временных последовательностей помогают понять проблемы распределённых систем.
Подход к решению проблемы приготовления пиццы
#
Для решения проблемы Татьяна прибегает к технике разрезания временной последовательности: каждая последовательность будет выполняться независимо друг от друга, но в конце они дождутся окончания каждой из задач
При использовании такого подхода пиццы успешно готовятся без ошибок
Анализ работы разрезанной временной последовательности
#
- Разрезание временной последовательности позволяет рассуждать о полученных частях в изоляции друг от друга. Короткие временные последовательности легче к осознанию.
- Работа с диаграммами временных последовательностей позволяет понять работу распределённых систем во времени.
- Диаграммы временных последовательностей являются гибким инструментом. Их можно применять для моделирования взаимодействия между временными последовательностями
Краткие выводы
#
- Деление кода на действия, вычисления и данные является краеугольным навыком для применения функциональных языков программирования
- При разработке приложений на ФЯП удобно прибегать к стратифицированной архитектуре, чтобы минимизировать внесение изменений
- Диаграммы временных последовательностей позволяют визуализировать выполнение действий во времени. Они позволяют находить взаимное влияние действий друг на друга
- Разрезание временных последовательностей позволяют координировать действия между собой. Координация действий позволяет избежать непредвиденных результатов