Функциональное программирование - это не только чистота, но и возможность повторного использования и разделения задач. Трудно написать большую сложную функцию, и еще сложнее протестировать и поддерживать ее. Следование функциональным принципам поможет нам избежать боли и дискомфорта.
Давайте начнем с выделения поведения, которое нам небезразлично. Мы идентифицируем функции push
, update
и pushKey
-
const identity = x =>
x
const push = (a = [], value) =>
a.concat([ value ])
const update = (o = {}, key = "", t = identity) =>
({ ...o, [key]: t(o[key]) })
const pushKey = (o = {}, key = "", value) =>
update(o, key, a => push(a, value))
Это позволяет легко выполнять базовые c неизменные преобразования -
const d1 = { a: [1], b: [] }
const d2 = pushKey(d1, "a", 2)
const d3 = pushKey(d2, "b", 3)
const d4 = pushKey(d3, "c", 4)
console.log(d1) // { a: [1], b: [] }
console.log(d2) // { a: [1, 2], b: [] }
console.log(d3) // { a: [1, 2], b: [3] }
console.log(d4) // { a: [1, 2], b: [3], c: [4] }
Развернуть фрагмент ниже, чтобы запустить программу в своем браузере -
const identity = x =>
x
const push = (a = [], value) =>
a.concat([ value ])
const update = (o = {}, key = "", t = identity) =>
({ ...o, [key]: t(o[key]) })
const pushKey = (o = {}, key = "", value) =>
update(o, key, a => push(a, value))
const d1 = { a: [1], b: [] }
const d2 = pushKey(d1, "a", 2)
const d3 = pushKey(d2, "b", 3)
const d4 = pushKey(d3, "c", 4)
console.log(JSON.stringify(d1)) // { a: [1], b: [] }
console.log(JSON.stringify(d2)) // { a: [1, 2], b: [] }
console.log(JSON.stringify(d3)) // { a: [1, 2], b: [3] }
console.log(JSON.stringify(d4)) // { a: [1, 2], b: [3], c: [4] }
Это позволяет вам разделить ваш сложный условный лог c на его собственную функцию -
const updateByCondition = (o = {}, conditions = [], ...) =>
{ if (...)
return pushKey(o, "foo", someValue)
else if (...)
return pushKey(o, "bar", someValue)
else
return pushKey(o, "default", someValue)
}
Преимущества этого подхода многочисленны. push
, update
и pushKey
очень легко писать, тестировать и обслуживать, и их легко использовать в других частях нашей программы. Написание updateByCondition
было намного проще, потому что у нас были лучшие базовые блоки c. Это все еще трудно проверить из-за сложности, которую вы пытаетесь закодировать, однако его гораздо проще поддерживать из-за разделения проблем.