有待商R的风险问题。我正在使用Ramda.js进行项目。在整个代码中,我看到许多ifElse
调用。
const getEvent = R.ifElse(
fireable,
R.always(sendAnalyticsEvent),
R.always(R.always(undefined))
);
如果Ramda最终只是抽象了一个三元运算,并且在错误匹配时返回undefined。
Ramdas ifElse
var ifElse = _curry3(function ifElse(condition, onTrue, onFalse) {
return curryN(Math.max(condition.length, onTrue.length, onFalse.length),
function _ifElse() {
return condition.apply(this, arguments) ? onTrue.apply(this, arguments) : onFalse.apply(this, arguments);
}
);
});
export default ifElse;
在FP世界中,这似乎是一种反模式,无论如何返回undefined,或者在某些情况下返回
R.ifElse(hasUrl, promptToShare, R.always(null))
不管undefined的回报如何,对于JavaScript社区,使用三元运算符会不会更加习惯?
hasUrl(urlObject) ? promptToShare() : null
对我来说,这似乎更简洁明了,我想重构。但这可能是由于我对FP世界的幼稚。
答案 0 :(得分:2)
几点(免责声明:我是Ramda作家)
太远了,你是对的。当新用户选择Java脚本中的FP时,会过度使用无点代码。我通常建议仅在提高可读性时才有用。
ifElse
调用不等同于Javascript条件表达式(三进制)。但是,它可以等同于返回三进制值的lambda函数。也就是说,该示例将更像(urlObject) => hasUrl(urlObject) ? promptToShare(urlObject) : null
。此时,ifElse
至少可能更具可读性。这使我们从关于部分应用程序/ currying的评论中获得了要点
我几乎没有理由看到将ifElse
与具有不同签名的函数一起使用。也就是说,如果promptToShare
不接受任何参数,则它可能不属于对ifElse
的调用。
该getEvent
函数看起来很奇怪。考虑到它使用的名称类似sendAnalyticsEvent
,我猜测它会产生一些副作用。而另一个分支是无操作的。尽管Ramda团队并不真正在乎您如何使用该库,但这并不是我们设想的用户使用该库创建的功能。
我已经看到对ifElse
的其他奇怪调用,以传递分支功能之一的标识。大概应该将它们替换为when
或unless
,这肯定会更具语义。
因此,我同意您的示例完全不需要ifElse
。但是ifElse
及其同{when
和unless
确实有自己的位置。