HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-03-10
1 <p>Императивный стиль программирования описывает набор шагов, которые нужно выполнить для достижения желаемого результата. Что касается<strong>декларативного стиля</strong>, то он описывает не конкретные инструкции, а желаемый результат. Примеры часто применяемых декларативных языков - HTML, SQL и даже JSX в React.</p>
1 <p>Императивный стиль программирования описывает набор шагов, которые нужно выполнить для достижения желаемого результата. Что касается<strong>декларативного стиля</strong>, то он описывает не конкретные инструкции, а желаемый результат. Примеры часто применяемых декларативных языков - HTML, SQL и даже JSX в React.</p>
2 <p>Допустим, базе данных не сообщают точные шаги получения данных. Вместо этого применяют SQL для описания того, что надо получить из базы.</p>
2 <p>Допустим, базе данных не сообщают точные шаги получения данных. Вместо этого применяют SQL для описания того, что надо получить из базы.</p>
3 SELECT * FROM Users WHERE Country='USA';<p>Примерно то же самое можно представить и в императивном JavaScript:</p>
3 SELECT * FROM Users WHERE Country='USA';<p>Примерно то же самое можно представить и в императивном JavaScript:</p>
4 let user = null; for (const u of users) { if (u.country === 'USA') { user = u; break; } }<p>А вот, как это выглядит в декларативном JavaScript, если применять<a>экспериментальный оператор конвейера</a>:</p>
4 let user = null; for (const u of users) { if (u.country === 'USA') { user = u; break; } }<p>А вот, как это выглядит в декларативном JavaScript, если применять<a>экспериментальный оператор конвейера</a>:</p>
5 import { filter, first } from 'lodash/fp'; const filterByCountry = country =&gt; filter( user =&gt; user.country === country ); const user = users |&gt; filterByCountry('USA') |&gt; first;<h2>Предпочтение выражений над операторами</h2>
5 import { filter, first } from 'lodash/fp'; const filterByCountry = country =&gt; filter( user =&gt; user.country === country ); const user = users |&gt; filterByCountry('USA') |&gt; first;<h2>Предпочтение выражений над операторами</h2>
6 <p>Если наша цель - декларативный код, то выражения должны быть предпочтительнее, чем операторы. Выражения возвращают значение всегда, а операторы применяются для выполнения действий, не возвращая никаких результатов. Это ещё называют побочными эффектами функционального программирования.</p>
6 <p>Если наша цель - декларативный код, то выражения должны быть предпочтительнее, чем операторы. Выражения возвращают значение всегда, а операторы применяются для выполнения действий, не возвращая никаких результатов. Это ещё называют побочными эффектами функционального программирования.</p>
7 <p>Как известно, чаще всего мы используем следующие операторы: for, switch, if, return, while.</p>
7 <p>Как известно, чаще всего мы используем следующие операторы: for, switch, if, return, while.</p>
8 <p>Посмотрим на простой пример:</p>
8 <p>Посмотрим на простой пример:</p>
9 const calculateStuff = input =&gt; { if (input.x) { return superCalculator(input.x); } return dumbCalculator(input.y); };<p>Этот же код мы можем переписать в виде тройного выражения, которое является декларативным:</p>
9 const calculateStuff = input =&gt; { if (input.x) { return superCalculator(input.x); } return dumbCalculator(input.y); };<p>Этот же код мы можем переписать в виде тройного выражения, которое является декларативным:</p>
10 const calculateStuff = input =&gt; { return input.x ? superCalculator(input.x) : dumbCalculator(input.y); };<p>Если же return - это единственный оператор в лямбда-функции, то язык программирования JavaScript даёт возможность также и полностью избавиться от лямбда-выражения:</p>
10 const calculateStuff = input =&gt; { return input.x ? superCalculator(input.x) : dumbCalculator(input.y); };<p>Если же return - это единственный оператор в лямбда-функции, то язык программирования JavaScript даёт возможность также и полностью избавиться от лямбда-выражения:</p>
11 const calculateStuff = input =&gt; input.x ? superCalculator(input.x) : dumbCalculator(input.y);<p>При этом тело функции мы можем сократить с 5 строк кода до 2-х.</p>
11 const calculateStuff = input =&gt; input.x ? superCalculator(input.x) : dumbCalculator(input.y);<p>При этом тело функции мы можем сократить с 5 строк кода до 2-х.</p>
12 <p>Есть и другие недостатки применения операторов. К примеру, они вызывают побочные эффекты и изменения, свойственные недетерминизму, в результате чего код делается менее надёжным и читаемым. Также операторы небезопасны и для переупорядочивания, т. к. они полагаются на порядок, в котором были использованы. Кроме того, операторы (в том числе и циклы) трудно распараллелить, т. к. они меняют состояние за пределами своей области видимости. В итоге, при работе с операторами следует понимать, что потребуются дополнительные умственные затраты, что связано с повышенной сложностью.</p>
12 <p>Есть и другие недостатки применения операторов. К примеру, они вызывают побочные эффекты и изменения, свойственные недетерминизму, в результате чего код делается менее надёжным и читаемым. Также операторы небезопасны и для переупорядочивания, т. к. они полагаются на порядок, в котором были использованы. Кроме того, операторы (в том числе и циклы) трудно распараллелить, т. к. они меняют состояние за пределами своей области видимости. В итоге, при работе с операторами следует понимать, что потребуются дополнительные умственные затраты, что связано с повышенной сложностью.</p>
13 <p>Что касается выражений, то их можно безопасно переупорядочивать и не вызывать побочных эффектов, также их можно без труда распараллелить.</p>
13 <p>Что касается выражений, то их можно безопасно переупорядочивать и не вызывать побочных эффектов, также их можно без труда распараллелить.</p>
14 <h2>Декларативное программирование потребует усилий</h2>
14 <h2>Декларативное программирование потребует усилий</h2>
15 <p>Декларативное программирование нельзя изучить за одну ночь. Особенно, если учесть, что многие обучались императивному программированию. Декларативное программирование - это, прежде всего, дисциплина и умение мыслить совершенно по-новому. Неплохой первый шаг в декларативном программировании - научиться создавать код без изменяемого состояния, а также не используя ключевое слово let.</p>
15 <p>Декларативное программирование нельзя изучить за одну ночь. Особенно, если учесть, что многие обучались императивному программированию. Декларативное программирование - это, прежде всего, дисциплина и умение мыслить совершенно по-новому. Неплохой первый шаг в декларативном программировании - научиться создавать код без изменяемого состояния, а также не используя ключевое слово let.</p>
16 <p>Но факт остаётся фактом: если вы сами попробуете декларативное программирование, вы удивитесь тому, насколько элегантным станет код.</p>
16 <p>Но факт остаётся фактом: если вы сами попробуете декларативное программирование, вы удивитесь тому, насколько элегантным станет код.</p>
17 <p>Осталось посмотреть на предлагаемую конфигурация ESLint:</p>
17 <p>Осталось посмотреть на предлагаемую конфигурация ESLint:</p>
18 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<p><a>Источник</a></p>
18 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<p><a>Источник</a></p>
19  
19