Практическое функциональное реактивное программирование — Блог App’n’roll

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

Примечание. В этой статье предполагается, что у вас есть базовые знания о FRP. Если вы новичок в этой теме и хотите научиться — сначала ознакомьтесь с этими ресурсами.

FRP — прекрасный пример разницы между просто и легко. Это делает ваш код простым, предоставляя последовательный набор концепций, но взамен вы получаете крутую кривую обучения. Вы должны сначала осознать парадигму, чтобы использовать ее эффективно.

Если вы не уделяете достаточно времени изучению новых идей, вы будете использовать их неправильно и получите результаты, противоположные ожидаемым — код, который трудно читать, тестировать и поддерживать.

Истина в названии

Вам не нужно далеко ходить в поисках основ функционального реактивного программирования — все в названии! Мы будем разбирать его шаг за шагом, чтобы получить суть.

Функциональный

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

Ввод, вывод

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

Операторы

Функциональное программирование вводит операторы, которые являются строительными блоками новых функций. Составление существующих операторов поощряет повторное использование кода. Убедитесь, что вы понимаете значение уже существующих операторов. Некоторые из них легко понять (например, карту или фильтр), другие потребуют больше времени и усилий. Если вы небрежно используете flatMap vs flatMapLatest, прежде чем узнаете разницу, вы напрашиваетесь на неприятности.

Изменяемое состояние

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

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

Реактивные расширения представляют изменяемое состояние с субъектами. Это объекты, за которыми вы можете одновременно наблюдать и наполнять значениями. Это означает, что при неправильном использовании они могут создать побочные эффекты и затруднить понимание вашего кода.

Субъекты необходимы, но вы должны обращаться с ними, как с тем уродливым свитером, который достался вам от бабушки. Вы держите его в шкафу и предпочитаете ходить голым, чем носить его, но когда приезжает ваша бабушка, это особый случай, и для него требуется особая одежда. Используйте темы только в особых случаях.

реактивный

Реактивное программирование — это парадигма, которая фокусируется на потоках данных и наблюдении за событиями. Как и в случае с шаблонами NotificationCenter и Делегировать, вместо того, чтобы периодически проверять, не произошло ли что-то новое, вы регистрируетесь в качестве наблюдателя и ждете уведомления.

Время

Самое важное, что появилось в результате смешивания реактивного программирования с FRP, — это понимание времени. Ваша простая переменная не знает, каким было ее значение ранее, и вам пришлось бы написать много стандартного кода, чтобы добиться такого поведения.

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

Потоки

Потоки данных — мощная концепция, но она имеет свою цену. С большой и сложной логикой вы можете запутаться в концептуальном беспорядке, задаваясь вопросом, какие данные куда идут. Мы обнаружили, что лучшими инструментами для решения этой проблемы являются графики и мраморные диаграммы. Рисуйте рано, рисуйте часто.

Программирование

Вы можете подумать, что «программирование» — это просто слово, объединяющее функциональное и реактивное. Вы не могли быть дальше от истины. Программирование само по себе означает для нас определенное ремесло, которое может состоять из многих областей, которые помогают нам оставаться в здравом уме в нашей работе. Мы знаем о самом главном правиле ремесла:

Программы должны быть написаны для того, чтобы их могли читать люди, и лишь случайно для того, чтобы машины выполняли их.

Гарольд Абельсон, «Структура и интерпретация компьютерных программ»

Многие из нас, столкнувшихся с новой парадигмой, совершенно забывают об этом. Конечно, чтение кода FRP требует минимального знания таких понятий, как потоки, наблюдатели и так далее, но после определенного порога, если ваш коллега чешет затылок во время проверки кода — это не вина парадигмы — это ваша вина.

Резюме

FRP определенно сработал для нас. Мы работаем быстро благодаря многоразовым операторам. Наш код более гибкий — часто мы можем просто подключить новый оператор или удалить ненужный, чтобы получить новое поведение. В сочетании с модульным тестированием исправить ошибки несложно, потому что наш код легко читается и ему легко следовать.

Функциональное реактивное программирование — отличный инструмент для современных приложений, которые выполняют много асинхронной работы и сетевых запросов. Прежде чем получить доступ к полной силе парадигмы, вы должны сначала изменить свой разум и изучить новые концепции. Очень важно, чтобы вы изучали и понимали его корни. Это может быть большой временной инвестицией, и, как и все инвестиции, вы должны решить для себя, стоит ли отдача.

Мы будем рады услышать от вас

Это сработало для вас? Мы расширили ваше понимание функционального реактивного программирования? Хотели бы вы видеть больше подобного контента? Есть ли что-нибудь, что вы хотели бы добавить, мы ничего не пропустили?

Пожалуйста, не стесняйтесь делиться с нами своим опытом и вопросами в комментариях ниже или через социальные сети (также присылайте нам фотографии или видео), вы можете найти нас на Facebook, Twitter, Instagram и Pinterest, подключаемся!

Чтобы узнать больше о App'n'roll, посетите наш веб-сайт и наши другие сообщения.Если вам понравилась эта статья, нажмите на аплодисменты и порекомендуйте ее!

Все используемые изображения соответствуют стандарту CC0 1.0 Universal (CC0 1.0).

Первоначально опубликовано на https://www.appnroll.com 19 июля 2016 г.