Введение

Первые 10 лет своей карьеры программиста я занимался объектно-ориентированным (ОО) программированием. Я работал в основном с Java. Я пытался овладеть искусством объектно-ориентированного программирования и изучил шаблоны проектирования, которые помогли мне придумать структуры классов, которые избегают дублирования кода и являются гибкими и адаптируемыми к будущим изменениям. Мой код был полон классов.

Все начало меняться после того, как я начал программировать на JavaScript, что не заставляло меня помещать весь мой код в классы. В моих первых проектах на JavaScript кодовая база все еще напоминала те, которые я собирал вместе с Java. Я не использовал классы, но, несмотря на это, некоторые файлы по-прежнему выглядели как классы. В коде были модули, которые группировали функции, которые были каким-то образом логически связаны друг с другом, как это было бы в типичном «сервисном» классе в Java.

Сегодня я программирую на JavaScript уже более 5 лет, и мой кодинг немного изменился. Я начал думать о своих программах как об процессорах данных. Всегда есть какие-то данные, которые нужно обработать. Я думаю о том, какие процессоры и функции нужны для преобразования данных. Мое изучение функционального программирования сильно повлияло на меня, и этот подход, ориентированный на данные, возникает из этого изучения и обучения.

В этой части блога я объясняю, почему для меня имело смысл изучать ФП и почему вам также следует его изучить.

Выгоды

Опытные функциональные программисты могут рассказать вам о многих преимуществах функционального программирования:

  1. Функциональный код легче понять
  2. Есть меньше ошибок
  3. Код более компактный
  4. Некоторые даже утверждают, что его легче тестировать и отлаживать.

Я согласен с этими утверждениями. Разницу между парадигмами легко увидеть, если взять нетривиальную задачу программирования, имеющую реализации как в функциональном, так и в традиционном императивном стиле.

Императивные реализации сложных задач могут быть сложны из-за вложенных циклов и вложенных операторов if-then-else, структур наследования классов и всего того, что мы обычно видим в императивных программах.

Вы когда-нибудь изучали большую объектно-ориентированную программу, написанную опытным практиком объектно-ориентированного программирования? Тот, который хорошо продуман для использования классов с четкими обязанностями. Тот, который не имеет дублированного кода и является DRY. Разбиение кода на классы с четко определенными обязанностями устраняет дублирование кода. Такого рода конструкции могут включать в себя несколько сотен классов. Может быть сложно понять, как работает эта программа и как работают разные классы во время выполнения.

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

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

Проблемы

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

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

Существует кривая обучения для понимания FP. Прежде всего, вам нужно изучить основы, и как только вы освоите основы, вы можете начать постепенно наращивать свои знания. Прежде чем стать мастером FP, нужно многому научиться. Я учусь этому уже год, и я все еще в начале своего пути. Я уверен, что когда-нибудь достигну статуса мастера, если просто продолжу усердно работать над достижением этой цели.

У меня 10-летний опыт объектно-ориентированного программирования с использованием Java. Я был большим поклонником книги Эрика Эванса Domain Driven Design и серьезно относился к ее учениям о сущностях, услугах и объектах-значениях. Я реализовал тысячи классов, используя шаблоны, описанные в книгах Domain Driven Design и GoF Design Patterns. Из-за моего прошлого, FP не имел для меня большого смысла, когда я впервые посмотрел на него.

Я нашел отладку функционального кода сложной задачей. Где вы добавляете свои точки останова, когда все, что у вас есть, это список функций, связанных вместе с помощью конвейера? Отладка — это еще одна область, где вам нужно изучить новые приемы, потому что старые не работают с FP. К счастью, существует множество стратегий для отладки функционального кода.

Изучение функционального программирования

Зачем вам прилагать усилия и изучать FP? Я думаю, самая важная причина в том, что изучение этого делает вас лучшим программистом. Вы можете извлечь пользу из знаний о FP, даже если вы продолжаете заниматься объектно-ориентированным программированием. Делать функции чистыми и отдавать предпочтение неизменности — это отличная привычка, независимо от вашей основной парадигмы программирования и языка программирования.

Вам не нужно полностью использовать функциональность и пугать своих коллег, придумывая код, который настолько полон карри [ссылка], что вам нужна степень по индийской кухне, чтобы понять это. Я бы порекомендовал книгу Кайла Симпсона «Функционально-легкий JavaScript для начала. Он обеспечивает прагматичный, сбалансированный способ выполнения FP в ваших проектах JavaScript. Это книга, с которой я начал работать с FP.

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

Освоение ФП требует времени. Я в начале своего пути, и мой путь до сих пор выглядел так:

  1. Я прочитал книгу Functional-Light JavaScript и был в восторге
  2. Я начал добавлять FP в свои ежедневные проекты. Я начал делать свои функции чистыми и начал избегать изменения своих данных.
  3. Но потом я занялся повседневными проектами, и мои амбиции по обучению FP отошли на второй план…
  4. Затем, к счастью, я снова стал менее занят, и мое обучение ФП пошло своим чередом.

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

Первоначально опубликовано на https://anssipiirainen.com 10 января 2020 г.