如果 Ramda ifElse 抽象了一个三元操作,它是一个有效的模式吗
Is Ramda ifElse an effective pattern if it abstracts a ternary operation
自以为是的风险问题。我正在与 Ramda.js 合作一个项目。我在整个代码中看到许多 ifElse
调用。
const getEvent = R.ifElse(
fireable,
R.always(sendAnalyticsEvent),
R.always(R.always(undefined))
);
像这样将逻辑包装在函数式条件中真的值得吗?有好处吗?
如果最终 Ramda 只是抽象出一个三元运算,而我们 return undefined on false match。
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 世界中的一个反模式,总是 returning undefined 或者在某些情况下为 null
R.ifElse(hasUrl, promptToShare, R.always(null))
不管 undefined 有问题的 return,使用三元运算符不是更适合 javascript 社区吗?
hasUrl(urlObject) ? promptToShare() : null
这对我来说似乎更简洁易读,我想重构。但这可能是由于我对 FP 世界的天真。
几点(免责声明:我是Ramda作者):
很多时候,你是对的。当新用户在 Javascript 中获取 FP 时,无积分代码被过度使用。我一般建议它只有在提高可读性时才有用。
ifElse
调用不等同于 Javascript 条件表达式(三元)。它可以等同于 returns 的值的 lambda 函数然而,一个三元的。也就是说,该示例更像是 (urlObject) => hasUrl(urlObject) ? promptToShare(urlObject) : null
。在这一点上,ifElse
至少可能更具可读性。这使我们从关于部分 application/currying
的评论中得出了要点
我认为没有理由将 ifElse
用于具有不同签名的函数。也就是说,如果 promptToShare
没有参数,那么它可能不属于对 ifElse
.
的调用
那个getEvent
函数看起来很奇怪。鉴于它使用像 sendAnalyticsEvent
这样的名称,我猜测它会产生一些副作用。另一个分支是空操作。虽然 Ramda 团队并不真正关心您如何使用该库,但这不是我们设想用户使用它创建的那种功能。
我看到其他对 ifElse
的奇怪调用为其中一个分支函数传递身份。这些大概应该替换为 when
或 unless
,这肯定会更语义化。
所以我同意你的例子根本不需要 ifElse
。但是 ifElse
及其同行 when
和 unless
确实有自己的位置。
自以为是的风险问题。我正在与 Ramda.js 合作一个项目。我在整个代码中看到许多 ifElse
调用。
const getEvent = R.ifElse(
fireable,
R.always(sendAnalyticsEvent),
R.always(R.always(undefined))
);
像这样将逻辑包装在函数式条件中真的值得吗?有好处吗?
如果最终 Ramda 只是抽象出一个三元运算,而我们 return undefined on false match。
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 世界中的一个反模式,总是 returning undefined 或者在某些情况下为 null
R.ifElse(hasUrl, promptToShare, R.always(null))
不管 undefined 有问题的 return,使用三元运算符不是更适合 javascript 社区吗?
hasUrl(urlObject) ? promptToShare() : null
这对我来说似乎更简洁易读,我想重构。但这可能是由于我对 FP 世界的天真。
几点(免责声明:我是Ramda作者):
很多时候,你是对的。当新用户在 Javascript 中获取 FP 时,无积分代码被过度使用。我一般建议它只有在提高可读性时才有用。
ifElse
调用不等同于 Javascript 条件表达式(三元)。它可以等同于 returns 的值的 lambda 函数然而,一个三元的。也就是说,该示例更像是(urlObject) => hasUrl(urlObject) ? promptToShare(urlObject) : null
。在这一点上,ifElse
至少可能更具可读性。这使我们从关于部分 application/currying 的评论中得出了要点
我认为没有理由将
ifElse
用于具有不同签名的函数。也就是说,如果promptToShare
没有参数,那么它可能不属于对ifElse
. 的调用
那个
getEvent
函数看起来很奇怪。鉴于它使用像sendAnalyticsEvent
这样的名称,我猜测它会产生一些副作用。另一个分支是空操作。虽然 Ramda 团队并不真正关心您如何使用该库,但这不是我们设想用户使用它创建的那种功能。我看到其他对
ifElse
的奇怪调用为其中一个分支函数传递身份。这些大概应该替换为when
或unless
,这肯定会更语义化。
所以我同意你的例子根本不需要 ifElse
。但是 ifElse
及其同行 when
和 unless
确实有自己的位置。