Создание значения на основе текущего состояния или на основе определенного значения внутри редуктора делает чистую функцию нечистой?

Я читаю на redux-devtools прохождение:

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

Эти слова говорят о генерации случайного значения. Но как насчет принятия уникальных значений на основе текущего состояния? Например, принимая длину массива в качестве идентификатора для элементов при сохранении данных в текущем состоянии. Пока я не удаляю никакое значение массива, он гарантированно будет уникальным. Это делает функцию нечистой?

Или, создав условное значение на основе текущего состояния, например:

function reducer (state, action) {
    if (state.isLocked) return state;
    // calculate further
}

Или, что более экстремально, имея определенное значение, которое существует только внутри функции, такой как:

{ type: 'CREATE_USER', age: 13 }

// it is predictable, always return the same value with same argument
function getAgeText(age) {
  if (age < 5) return 'baby';
  if (age < 20) return 'teenager';
  if (age < 30) return 'mature';
  if (age < 40) return 'old';
  if (age < 50) return 'very old';
  return 'astounding';
} // of course by assuming we have to use this function in case you
  // ask, "Why don't get those values anywhere else and not in
  // this reducer?"

function reducer (state, action) {
  switch (action.type) {
    case 'CREATE_USER':
      return Object.assign({}, state, {
        age: age, ageText: getAgeText(action.age)
      });
    default:
      return state;
  }
}

Итак, эти примеры делают функцию нечистой? И, если нет, то является ли плохой практикой в ​​редуксе создание длинных сложных вычислений или сильно вложенных редукторов, даже если это делается только из переданного значения (состояния и действия)?

1 ответ

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

Другие вопросы по тегам