javascript - 如果 Ramda ifElse 抽象了一个三元运算,那么它是一个有效的模式吗

标签 javascript functional-programming ternary-operator ramda.js

有风险的问题要固执己见。我正在使用 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 作者):

  • 很多时候,你是对的。当新用户在 Javascript 中使用 FP 时,会过度使用无点代码。我通常建议它仅在提高可读性时才有用。
  • 一个 ifElse调用不等同于 Javascript 条件表达式(三元)。但是,它可以等同于返回三元值的 lambda 函数。也就是说,这个例子更像 (urlObject) => hasUrl(urlObject) ? promptToShare(urlObject) : null .此时,ifElse至少可能更具可读性。这将我们从关于部分应用程序/currying
  • 的评论中引出。
  • 我几乎没有理由使用 ifElse具有不同签名的函数。也就是说,如果 promptToShare不带参数,那么它可能不属于对 ifElse 的调用.
  • getEvent功能看起来很奇怪。鉴于它使用像 sendAnalyticsEvent 这样的名称,我猜它会产生一些副作用。另一个分支是无操作的。虽然 Ramda 团队并不真正关心您如何使用该库,但这并不是我们设想用户使用它创建的那种功能。
  • 我还看到了其他对 ifElse 的奇怪电话。为其中一个分支函数传递身份。这些应该被替换为 whenunless ,这肯定会更具语义。

  • 所以我同意你的例子不需要ifElse一点也不。但是ifElse及其同行whenunless确实有他们的位置。

    关于javascript - 如果 Ramda ifElse 抽象了一个三元运算,那么它是一个有效的模式吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52397146/

    相关文章:

    javascript - 具有滑动背景、固定图像和滑动前景的轮播

    javascript - React/Redux 组件重新渲染

    functional-programming - 用函数式语言生成所有排列

    python 三元运算符行为

    javascript - 在 Google 表格中跨行添加数字

    javascript - 列表项中的元素为空,但对象不为空

    Python: map 调用函数不起作用

    Clojure,尝试调用未绑定(bind)的 fn

    c - 这个返回语句是什么意思

    java - 嵌套怎么写? : statements