Основы функционального программирования, которые вы можете начать использовать сегодня

f из x. Эти слова, вероятно, наведут у вас неприятные воспоминания о классе математики в средней школе, где ваш учитель алгебры кропотливо рисует функцию на доске. В мое время у всех на столе стояли графические калькуляторы за 100 долларов, но все они рисовали эти графики вручную. Что с этим?

y = f (x) = x + 1. Когда x равно 1, y равно 2. Введите значение, получите взамен другое значение. Из этого основного принципа вы научились строить графики окружностей, синусоид и конических сечений. Вы научились вычислять площади и производные, подставляя значения в формулы.

Функциональное программирование делает программирование более надежным. Функциональные программисты стремятся к математической чистоте своего кода, в результате чего функции становятся согласованными, более простыми для тестирования и, в идеале, более простыми для понимания. Это не серебряная пуля. Это просто еще один способ думать о написанном вами коде.

Функциональное программирование пару лет назад стало чем-то вроде увлечения. Но это совсем не ново. Это одна из четырех парадигм программирования, используемых с начала 1960-х годов.

  • Императивное программирование выражает программу как последовательность шагов, аналогичную тому, как компьютер на самом деле выполняет программу или как человек может готовить по рецепту.
  • Структурированное программирование основано на императивном программировании, что позволяет программистам повторно использовать код в качестве подпрограмм (функций).
  • Объектно-ориентированное программирование объединяет состояние и функции в объекты, которые предназначены для моделирования абстрактных, а также реальных концепций.
  • … А затем есть функциональное программирование!

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

Трудно дать точное определение функциональному программированию, но программисты ищут пару принципов:

  1. Ссылочная прозрачность: когда функции передаются одни и те же параметры, она возвращает то же значение. Это делает программные функции более похожими на те, которые вы написали на уроках математики. Функцию со ссылочной прозрачностью легче тестировать и отлаживать, потому что она всегда делает одно и то же.
  2. Минимальное состояние: Состояние относится к значениям глобальных переменных, содержимому файлов, базам данных, устройствам ввода-вывода; любое значение, не находящееся под прямым контролем функции. Если бы компьютеры где-то не отслеживали состояние , наша отрасль не прошла бы мимо Hello World. Фактически, печать «Hello World» влияет на состояние устройства вывода, не так ли? Функциональные программисты передают состояние как параметры функциям или изо всех сил скрывают его в специальных контейнерах, называемых монадами.
  3. Никаких побочных эффектов: функция, вычисляющая сумму $ x и $ y, не занимается добавлением еще одного этажа к Эмпайр-стейт-билдинг. Каждая функция должна выполнять одно действие и возвращать результат без изменения значений своих параметров или чего-либо еще в этом отношении.

Давайте исследуем эти принципы, посмотрев на функцию из самого WordPress, одну из моих любимых.

absint () имеет идеальную ссылочную прозрачность. Независимо от того, какое значение вы ему передадите, вы всегда получите тот же результат. Он не влияет на какие-либо внешние переменные, ничего не выводит в браузер и не затрагивает файловую систему или базу данных. Побочных эффектов нет.

absint () принимает переданное вами значение, получает его значение как целое число и возвращает его абсолютное значение.

  • абсент (5) всегда 5
  • абсент («5») всегда 5
  • абсент (-5) всегда 5
  • абсент («wordpress») всегда 0

Мне нравятся такие функции, как absint (), из-за их предсказуемости. Посмотрите на некоторые тестовые примеры absint (), предложенные в билете Trac № 28559. Класс модульного тестирования не требует настройки или демонтажа. Он просто передает значение в absint (), проверяет, соответствует ли результат ожидаемому, и повторяет его.

Чистое vs. нечистое

Такие языки, как Haskell, созданы на основе функционального программирования и только функционального программирования. Они считаются чисто функциональными языками.

Но большинство используемых сегодня языков программирования являются мультипарадигмальными, поддерживающими структурированное, объектно-ориентированное и в некоторой степени функциональное программирование. Программисты могут смешивать стили в разных языках, выбирая лучший способ выразить свое решение проблемы. PHP и JavaScript - это языки с несколькими парадигмами.

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

В WordPress много глобальных переменных, но чистым функциям не нужно иметь дело с ними напрямую. Вместо функций, полагающихся на глобальные переменные, такие как $ post, попробуйте передать $ post или даже $ GLOBALS в качестве параметров между вашими функциями.

$ GLOBALS - это функция PHP, которая действует как большой ассоциативный массив, содержащий все глобальные переменные. Если ваша чистая функция ожидает передачи этого глобального состояния в виде большого массива, вы можете заменить другой массив в своих модульных тестах. Если функция имеет ссылочную прозрачность, это не имеет значения. Важно только то, что у заместителя есть те же ключи и значения массива, которые ожидает ваш код в $ GLOBALS.

Если вы не можете избежать работы с глобальным состоянием, напишите обертку вокруг вашей красивой, чистой функции, чтобы обработать эти неприятные примеси. Ничего страшного, полиция функционального программирования не придет за вами, если вы напишете пару нечистых функций по пути.

В этом примере _capitalize_the_post_title () чистый. Вы можете предсказать, каким будет результат для данной публикации $, потому что она имеет ссылочную прозрачность. Представьте, как легко было бы написать модульные тесты для этой функции! Вам не нужно передавать объект WP_Post, просто простой объект с post_title.

capitalize_the_post_title () выполняет грязную работу по работе с глобальным состоянием. Фактически, это все, что он делает. Он не пытается ничего сделать с этими данными, кроме как передать их чистой функции и вернуть результат.

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