Принципы функционального программирования

Данные принципы позволяют создавать многопоточные и многосерверные приложения, которые легко будут масштабироваться.

Принципы:

  1. Масштабируемость - это возможность запустить один и тот же код паралельно (либо в несколько потоков, либо на разныз серверах). Масштабируемость позволяет разрабатывать многопоточные приложения, которые не влияют на работу друг друга.
  2. Отсутсвие состояния. Функция не хранит внутри себя состояния, не сохраняет сессии, логи, файлы. Состояние храниться в провайдерах, либо в базе данных. Два запроса могут быть отправлены к двум одинаковым функциям, в разных потоках, и при этом они будут одинаково обработаны.
  3. Асинхронность. Во время ожидания результата от провайдера или базы данных, можно спокойно выполнить другую функцию. Это приводит к кооперативной многозадачности.
  4. Неизменяемые структуры данных. Это данные которые нельзя изменить. Чтобы изменить данные нужно создать новый объект с новыми данными.
    - Позволяет использовать в многопоточных приложениях, при этом можно спокойно с ними работать и не боятся, что какой-то поток изменит данные объекта
    - Чтобы проверить изменился ли объект, достаточно проверить ссылку на объект. Не нужно проверять все данные этого объекта.
  5. Запрос к функции должен обладать достаточным объемом данных, для ответа этой функции. Один запрос (в котором находятся все нужные данные) - один ответ. Это актуально для API. Для того, чтобы получить ответ должен быть один запрос к API. Если для ответа нужно отправить несколько подряд запросов, то этот паттерн нарушается.
  6. Чистые функции:
    - всегда возвращает одинаковый результат, на один и тот же запрос
    - не изменяет входные данные
    - не обращается к базе, провайдерам и другим источником данных
    - не хранит внутри себя состояния
  7. Функции высших порядков. Это функция, которая возвращает другую функцию. Можно использовать как фабрики. Либо в map-reduce или пайпах.
  8. Идемпотентность. Свойства функций возвращать один и тот же ответ при одинаковых запросах.
  9. Кэшируемость. Так как чистые функции возвращают одинаковый ответ, на одинаковый запрос, то ответы можно закэшировать. Если приходят два одинаковых запроса, то можно использовать ответ от уже ранее вызываной функции.

Рекомендуется также ознакомится с 12 факторной моделью разработки.