Давайте начнем с признания того, что obj.value = f(obj)
является изменяемым назначением и поэтому не является функциональной идиомой для начала.Это мышление в стиле императива на работе.
Хранение вычисленного значения как свойства вашего объекта в большинстве случаев является ошибкой.Если изменяется либо appleCount
, либо orangeCount
, то нет ничего, что обеспечивало бы целостность fruitCount
.
fruitCount
должна быть функцией , а не свойством.
const fruitCount =
pipe
( props ([ 'appleCount', 'orangeCount' ])
, sum
)
fruitCount ({ appleCount: 1, orangeCount: 3 }) // 4
fruitCount ({ appleCount: 5, orangeCount: 3 }) // 8
Если бы мне пришлось угадывать, это поддельные данные и примерная проблема.В некоторых сценариях вычисленное значение имеет смысл (запоминание - это первая техника, которая приходит на ум), но эти случаи составляют исключение, а не правило.Вы говорите "абсолютная частота, с которой я использую это ..." , поэтому я бы поспорил, что вы сделаете это в большем количестве областей, чем должны.
И, как вы указали, Рамдане имеет встроенного для этого, так что это также должно указывать на то, что есть более традиционные способы решения такого рода проблем.
Объектно-ориентированный программист назначил бы это как вычисляемое свойство-
const FruitData = function (apples = 0, oranges = 0)
{ this.apples = apples
this.oranges = oranges
}
Object.defineProperty
( FruitData.prototype
, 'fruitCount'
, { get () { return this.apples + this.oranges } }
)
const f =
new FruitData (3, 4)
console .log (f.fruitCount) // 7
При написании функционального стиля мы оставляем концепции ООП за дверью.Начните думать с точки зрения функций, и ваши проблемы исчезнут -
const FruitData = (apples = 0, oranges = 0) =>
({ apples, oranges })
const appleCount = fd =>
fd.apples
const orangeCount = fd =>
fd.oranges
const fruitCount = fd =>
appleCount (fd) + orangeCount (fd)
console .log (fruitCount (FruitData (10, 3))) // 13