如果 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 的奇怪调用为其中一个分支函数传递身份。这些大概应该替换为 whenunless,这肯定会更语义化。

所以我同意你的例子根本不需要 ifElse。但是 ifElse 及其同行 whenunless 确实有自己的位置。