Васильев Андрей Михайлович, 2022
Версии презентации
Курс основан на книге Grokking Simplicity Эрика Норманда
В рамках книги автор пытается внести определение функциональному программированию и разобрать базовые техники программирования
Необходимые знания для прохождения курса:
Функция для вычисления суммы чисел на JavaScript
function sum(array) {
let result = 0;
for(let i = 0; i < array.length; i++) {
result += array[i];
}
return result;
}
Большинство языков общего назначения являются императивными: C, C++, Python, C#, Java, JavaScript, Ruby, Kotlin, Swift, PHP, Go
С их помощью мы можем описать произвольные алгоритмы для решения любых задач
Выборка данных из базы данных на языке SQL
select name,surname from students where group='IT-11-MO'
Большинство предметно-ориентированных языков являются декларативными: SQL, HTML, XML, Prolog, QWL, XSLT, SPARQL
Данные языки реализованы зачастую на основе императивных языков программирования
Программисты заметили, что для решения задач в конкретной предметной области объём кода на декларативном языке заметно меньше кода на императивном языке. А чем меньше понятного кода написано, тем легче понимать данный код, тем легче его поддерживать.
Варианты внедрения декларативного подхода:
Все данные языки являются императивными языками программирования
Исторически один из первых подходов к формированию программ, включает:
Ядром данной концепции является объект, который включает в себя данные и код, который обрабатывает эти данные
Рассмотрим типичные определения функционального программирования
Ими называют любые действия функции, за исключением возвращения данных. В эти действия входит печать данных на экране, отправка почтового сообщения или модификация глобального состояния.
Побочные эффекты могут стать проблемой, так как они происходят при каждом вызове функции и могут быть непреднамеренными
Данные функции только лишь вычисляют результирующее значение на основе аргументов, которые были ей переданы, не имеет никаких побочных эффектов
В функциональном программировании приветствуется использование чистых функций, так как их легче понять и ими легче управлять
ФП — парадигма программирования при которой используются исключительно функции без побочных эффектов
Из определения следует, что побочных эффектов следует избегать, но они являются причиной существования ПО: почтовому клиенту нужно посылать электронные письма
В функциональных ЯП разработаны специальные техники для работы с побочными эффектами, чтобы их можно было совмещать с чистыми функциями
Определение парадигмы посредством математики может сказать, что парадигма неприменима на практике. На самом деле на ФЯП можно реализовать любое приложение и множество существующих проектов являются доказательством
В рамках данного курса (и базовой книги) мы попытаемся получить навыки и понять концепции ФП, которые можно применять уже сейчас. Причём многие из этих навыков применимы за пределами чисто функциональных языков программирования
Многие императивные языки вобрали в себя инструменты работы с данными из функциональных языков
С точки зрения ФП код можно разделить на 3 важных категории
Действия — это функции, результат работы которых зависит от времени их запуска или от количества запусков
То есть под действиями мы понимаем функции с побочными эффектами
Примеры таких функций:
sendEmail(to, from, subject, body)
— отправляет почтовое сообщениеsaveUserDB(user)
— после сохранения данные будут доступны всей системеgetCurrentTime()
— каждый вызов данной функции вернёт новые данныеВычисления и данные не зависят ни от времени обращения, ни от количества обращений. При любом обращении эти элементы будут возвращать корректные данные
Примеры:
{"firstname": "Bob"}
— данные не изменяются со временем (самостоятельно)sum(numbers)
— сумма чисел зависит только от переданных чиселstring_length(string)
— длина зависит от строки[1, 10, 15, 5, 26]
— массив не изменяется со временемРазница между вычислениями и данными заключается в том, что вычисления могут быть выполнены, а данные нет
При работе над исходным кодом программисты на ФЯП различают все три категории
Рассмотрим следующий пример работы веб-приложения:
Определим для каждого шага его категорию
Пользователь помечает в интерфейсе задачу как выполненную
Это действие, т.к. оно зависит от количества вызовов
Веб-браузер посылает сообщение на сервер, описывающий действие пользователя
Сообщение является данными, но их отправка — это действие
Сервер получает сообщение
Получение сообщения — это действие, т.к. зависит от количества
Сервер обрабатывает данные и сохраняет их в базу данных
Изменение состояния БД — это действие
Сервер выбирает корреспондентов для отправки почтовых сообщений
Выбор корреспондентов зависит только от события, это вычисление
Сервер высылает сообщение выбранным корреспондентам
Отправка почты — это действие
Если код зависит от времени выполнения, количества запусков или того и другого, то это действие
Если код занимается исключительно формированием результата на основании аргументов, то это вычисление
Данные обычно представляют собой записанные факты о произошедших событиях
Рассмотрим чек из ресторана. На данных из чека можно
ФЯП по своей природе гораздо лучше работают в рамках распределённых систем по сравнению с другими языками
Большинство современных приложений — распределённые
Проблемы сетевых распределённых приложений:
Т.е. возникают проблемы, связанные с моделированием изменений во времени: проблемы от количества вызовов и от времени вызовов
Данные и вычисления не зависят от количества обращений, ни от времени их выполнения. Чем больше данных и вычислений в приложении и чем меньше действий, тем меньше мест в приложении, где может возникнуть проблемы распределённых приложений
Проблемы останутся в действиях, но мы их явно идентифицировали в приложении, поэтому можем применить к ним техники управления указанными проблемами
Функциональное мышление — это набор умений и идей, которые используются при написании приложений на функциональных языках программирования
В рамках курса (и книги) постараемся овладеть этими инструментами, чтобы успешно применять их на практике
Базовые идеи ФП:
Данные правила были использованы для выбора идей для книги, и следовательно будут рассмотены в курсе