有风险的问题要固执己见。我正在使用 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 或在某些情况下为 null
R.ifElse(hasUrl, promptToShare, R.always(null))
不管未定义的可疑返回如何,使用三元运算符对 javascript 社区来说不是更惯用吗?
hasUrl(urlObject) ? promptToShare() : null
这对我来说似乎更简洁易读,我想重构。但这可能是由于我对 FP 世界的幼稚。
最佳答案
几点(免责声明:我是 Ramda 作者):
ifElse
调用不等同于 Javascript 条件表达式(三元)。但是,它可以等同于返回三元值的 lambda 函数。也就是说,这个例子更像 (urlObject) => hasUrl(urlObject) ? promptToShare(urlObject) : null
.此时,ifElse
至少可能更具可读性。这将我们从关于部分应用程序/currying ifElse
具有不同签名的函数。也就是说,如果 promptToShare
不带参数,那么它可能不属于对 ifElse
的调用. getEvent
功能看起来很奇怪。鉴于它使用像 sendAnalyticsEvent
这样的名称,我猜它会产生一些副作用。另一个分支是无操作的。虽然 Ramda 团队并不真正关心您如何使用该库,但这并不是我们设想用户使用它创建的那种功能。 ifElse
的奇怪电话。为其中一个分支函数传递身份。这些应该被替换为 when
或 unless
,这肯定会更具语义。 所以我同意你的例子不需要
ifElse
一点也不。但是ifElse
及其同行when
和 unless
确实有他们的位置。
关于javascript - 如果 Ramda ifElse 抽象了一个三元运算,那么它是一个有效的模式吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52397146/