Декларативный код в JavaScript | OTUS
⚡ Подписка на курсы OTUS!
Интенсивная прокачка навыков для IT-специалистов!
Подробнее

Курсы

Программирование
iOS Developer. Professional Kotlin Backend Developer Flutter Mobile Developer Symfony Framework C++ Developer. Basic Unity Game Developer. Basic Java Developer. Professional
-35%
Highload Architect Unity Game Developer. Professional React.js Developer Специализация Java-разработчик
-25%
Алгоритмы и структуры данных
-16%
Scala-разработчик C# Developer. Professional
-23%
Разработчик голосовых ассистентов и чат-ботов Team Lead Архитектура и шаблоны проектирования NoSQL Web-разработчик на Python Golang Developer. Professional PostgreSQL Vue.js разработчик Супер-практикум по использованию и настройке GIT Разработчик IoT Подготовка к сертификации Oracle Java Programmer (OCAJP) Программист С HTML/CSS
Инфраструктура
Инфраструктурная платформа на основе Kubernetes Microservice Architecture Базы данных Highload Architect Reverse-Engineering. Professional
-8%
Network engineer. Basic Administrator Linux.Basic MongoDB Infrastructure as a code MS SQL Server Developer Cloud Solution Architecture Мониторинг и логирование: Zabbix, Prometheus, ELK Супер-практикум по использованию и настройке GIT Разработчик IoT Экcпресс-курс «ELK» Супер-интенсив "Tarantool" Экспресс-курс «CI/CD или Непрерывная поставка с Docker и Kubernetes» Экспресс-курс «Введение в непрерывную поставку на базе Docker»
Корпоративные курсы
Безопасность веб-приложений Экосистема Hadoop, Spark, Hive Пентест. Практика тестирования на проникновение Node.js Developer Java QA Engineer. Basic
-18%
Reverse-Engineering. Professional
-8%
DevOps практики и инструменты NoSQL Reverse-Engineering. Basic Cloud Solution Architecture Внедрение и работа в DevSecOps Супер-практикум по работе с протоколом BGP Game QA Engineer Супер - интенсив по Kubernetes Дизайн сетей ЦОД Экспресс-курс «IaC Ansible» Экспресс-курс по управлению миграциями (DBVC) Экспресс-курс "Версионирование и командная работа с помощью Git" Основы Windows Server
Специализации Курсы в разработке Подготовительные курсы Подписка
+7 499 938-92-02

Декларативный код в JavaScript

Императивный стиль программирования описывает набор шагов, которые нужно выполнить для достижения желаемого результата. Что касается декларативного стиля, то он описывает не конкретные инструкции, а желаемый результат. Примеры часто применяемых декларативных языков — HTML, SQL и даже JSX в React.

Допустим, базе данных не сообщают точные шаги получения данных. Вместо этого применяют SQL для описания того, что надо получить из базы.

SELECT * FROM Users WHERE Country='USA';

Примерно то же самое можно представить и в императивном JavaScript:

let user = null;

for (const u of users) {
  if (u.country === 'USA') {
    user = u;
    break;
  }
}

А вот, как это выглядит в декларативном JavaScript, если применять экспериментальный оператор конвейера:

import { filter, first } from 'lodash/fp';

const filterByCountry =
  country => filter( user => user.country === country );

const user =
  users
  |> filterByCountry('USA')
  |> first;

Предпочтение выражений над операторами

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

Как известно, чаще всего мы используем следующие операторы: for, switch, if, return, while.

Посмотрим на простой пример:

const calculateStuff = input => {
  if (input.x) {
    return superCalculator(input.x); 
  }

  return dumbCalculator(input.y);
};

Этот же код мы можем переписать в виде тройного выражения, которое является декларативным:

const calculateStuff = input => {
  return input.x
          ? superCalculator(input.x)
          : dumbCalculator(input.y);
};

Если же return — это единственный оператор в лямбда-функции, то язык программирования JavaScript даёт возможность также и полностью избавиться от лямбда-выражения:

const calculateStuff = input =>
  input.x ? superCalculator(input.x) : dumbCalculator(input.y);

При этом тело функции мы можем сократить с 5 строк кода до 2-х.

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

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

Декларативное программирование потребует усилий

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

Но факт остаётся фактом: если вы сами попробуете декларативное программирование, вы удивитесь тому, насколько элегантным станет код.

Осталось посмотреть на предлагаемую конфигурация ESLint:

rules:
  fp/no-let: warn
  fp/no-loops: warn
  fp/no-mutating-assign: warn
  fp/no-mutating-methods: warn
  fp/no-mutation: warn
  fp/no-delete: warn

Источник

Не пропустите новые полезные статьи!

Спасибо за подписку!

Мы отправили вам письмо для подтверждения вашего email.
С уважением, OTUS!

Автор
0 комментариев
Для комментирования необходимо авторизоваться