79 lines
3.5 KiB
Markdown
79 lines
3.5 KiB
Markdown
![]() |
---
|
|||
|
id: 587d7b8e367417b2b2512b5e
|
|||
|
title: Уникайте будь-яких змін та побічних ефектів, використовуючи функціональне програмування
|
|||
|
challengeType: 1
|
|||
|
forumTopicId: 301228
|
|||
|
dashedName: avoid-mutations-and-side-effects-using-functional-programming
|
|||
|
---
|
|||
|
|
|||
|
# --description--
|
|||
|
|
|||
|
Якщо ви ще цього не зрозуміли, проблема в попередньому завданні була з `splice` у функції `Close()`. На жаль, `splice` змінює вихідний масив, в якому він викликається, тому другий дзвінок використовував модифікований масив і дав несподівані результати.
|
|||
|
|
|||
|
Це невеликий приклад набагато більшого шаблону - викликається функція змінної, масиву або об'єкта, а функція змінює саме змінну чи щось інше в об’єкті.
|
|||
|
|
|||
|
Одним з основних принципів функціонального програмування - не змінювати речі. Зміни призводять до помилок. Легше уникнути помилок, знаючи, що ваші функції нічого не змінюють, включаючи аргументи функцій чи будь-яку іншу глобальну змінну.
|
|||
|
|
|||
|
Попередній приклад не мав жодних складних операцій, але метод `splice` змінив оригінальний масив і видав помилку.
|
|||
|
|
|||
|
Нагадаємо, що у функціональному програмуванні зміни або зміна речей називається <dfn>мутацією</dfn>, і наслідок називається <dfn>побічним ефектом</dfn>. В ідеалі функція, повинна бути <dfn>pure function</dfn>, це означає, що вона не спричиняє жодних побічних ефектів.
|
|||
|
|
|||
|
Давайте спробуємо освоїти цю дисципліну і не будемо змінювати будь-які змінні або об'єкти в нашому коді.
|
|||
|
|
|||
|
# --instructions--
|
|||
|
|
|||
|
Ввести код для функції`incrementer` таким чином, значення глобальної змінної `fixedValue` зросло в один раз.
|
|||
|
|
|||
|
# --hints--
|
|||
|
|
|||
|
Ваша функція `incrementer` не повинна змінювати значення `fixedValue` (яка є `4`).
|
|||
|
|
|||
|
```js
|
|||
|
incrementer();
|
|||
|
assert(fixedValue === 4);
|
|||
|
```
|
|||
|
|
|||
|
Ваша функція `incrementer` повертає значення, яке на одиницю більше значення `fixedValue`.
|
|||
|
|
|||
|
```js
|
|||
|
const __newValue = incrementer();
|
|||
|
assert(__newValue === 5);
|
|||
|
```
|
|||
|
|
|||
|
Ваша функція `incrementer` повинна повертати значення на основі глобального змінного значення `fixedValue`.
|
|||
|
|
|||
|
```js
|
|||
|
(function () {
|
|||
|
fixedValue = 10;
|
|||
|
const newValue = incrementer();
|
|||
|
assert(fixedValue === 10 && newValue === 11);
|
|||
|
fixedValue = 4;
|
|||
|
})();
|
|||
|
```
|
|||
|
|
|||
|
# --seed--
|
|||
|
|
|||
|
## --seed-contents--
|
|||
|
|
|||
|
```js
|
|||
|
// The global variable
|
|||
|
let fixedValue = 4;
|
|||
|
|
|||
|
function incrementer() {
|
|||
|
// Only change code below this line
|
|||
|
|
|||
|
|
|||
|
// Only change code above this line
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
# --solutions--
|
|||
|
|
|||
|
```js
|
|||
|
let fixedValue = 4
|
|||
|
|
|||
|
function incrementer() {
|
|||
|
return fixedValue + 1
|
|||
|
}
|
|||
|
```
|