Skip to main content

Що таке pure reducer (чиста функція)?

Визначення

Pure reducer (чиста функція-редьюсер) - це функція, яка завжди повертає одне й те саме значення при однакових вхідних даних і не має побічних ефектів.

Простіше кажучи: Reducer - це чиста функція, яка лише обчислює новий стан на основі старого і action - і нічого більше не робить.


Формально

Чиста функція:

javascript
newState = reducer(oldState, action)
  • Не змінює oldState напряму.
  • Не робить запитів, логування, таймерів тощо.
  • Не звертається до зовнішніх змінних.
  • Завжди повертає один і той самий результат при однакових вхідних даних.

Приклад чистого reducer'а

javascript
function counterReducer(state = { count: 0 }, action) { switch (action.type) { case 'INCREMENT': return { count: state.count + 1 } case 'DECREMENT': return { count: state.count - 1 } default: return state } }

Чиста функція:

  • Не мутує state
  • Не викликає API
  • Не використовує Math.random()
  • Не залежить від зовнішніх змінних

Приклад нечистого reducer'а

javascript
function counterReducer(state = { count: 0 }, action) { switch (action.type) { case 'INCREMENT': fetch('/api/log') // побічний ефект (виклик API) return { count: state.count + 1 } case 'DECREMENT': return { count: state.count - Math.random() } // непередбачуваність default: return state } }

Чому це погано:

  • Reducer повинен бути передбачуваним.
  • Redux порівнює старий і новий стан -> якщо функція непередбачувана, це ламає логіку.
  • Побічні ефекти (запити, таймери, логування) повинні виконуватись у middleware (наприклад, Redux Thunk, Saga тощо), а не в reducer'і.

Правила чистого reducer'а

ПравилоЩо означає
Не мутуй stateВикористовуй ...spread, map, filter, concat, але не push, splice, assign
Не викликай побічні ефектиНіяких fetch, console.log, setTimeout, alert тощо
Не звертайся до зовнішніх данихНе використовуй глобальні змінні, localStorage тощо
Повертай новий станreturn { ...state, ...changes }
Один і той самий input -> один і той самий outputПередбачуваність

Чому це важливо

  1. Передбачуваність - результат reducer'а завжди зрозумілий.
  2. Тестованість - можна просто передати state і action і перевірити результат.
  3. Відлагодження - Redux DevTools може "перемотувати" стан назад і вперед, бо функції не мають побічних ефектів.

Підсумок

ТермінЗначення
Pure functionФункція без побічних ефектів і з детермінованим результатом
ReducerЧиста функція, яка описує, як стан змінюється у відповідь на action
ПеревагиПередбачуваність, простота тестування, підтримка time-travel debugging

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.