В последнее время я пишу приложения на основе реакции-редукса, а как разработчик реагирования пишу чистый, функциональный и предсказуемый код.Несмотря на то, что мне нравится этот опыт, у меня есть сомнения, хорош ли мой код или нет.
Итак, у меня есть дерево в моем состоянии, и мне нужно обновить группу узлов в дереве.Скажем, API дерева предоставляет pure метод pureUpdate(path, newNode, tree) => newTree
, который возвращает новое дерево с обновленным узлом.В этом случае мой метод редуктора может выглядеть следующим образом:
function updateNodes(tree, updateRules) {
updateRules.forEach(updateRule => {
const { path, node } = updateRule;
tree = pureUpdate(path, node, tree);
});
return tree;
}
Но я не уверен, что это лучшее, что можно сделать.
Первое, что выглядит противно, это tree = pureUpdate(path, node, tree);
.Это похоже на изменение параметра, что не рекомендуется, но я просто переназначаю ссылку, не так ли?Это объяснено здесь во второй части ответа.Но хотя этот трюк мог бы подойти, в этом обсуждении сказал, что такой код может быть неоптимизирован, и переназначение параметров может вызвать проблемы с производительностью ( больше информации с примерами ).Самое простое решение, которое мне пришло в голову, - это использовать дополнительную переменную, которая будет клоном дерева.
function updateNodes(tree, updateRules) {
let newTree = someCloneFunc(tree);
updateRules.forEach(updateRule => {
const { path, node } = updateRule;
newTree = pureUpdate(path, node, newTree);
});
return newTree;
}
Вопрос в том, не пропущу ли я что-нибудь, и мой код все еще чистый, красивый и будетне вызывает никаких проблем.