Ramda ifElse如果抽象出三元运算,是有效的模式吗?

时间:2018-09-19 02:26:05

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

有待商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世界的幼稚。

1 个答案:

答案 0 :(得分:2)

几点(免责声明:我是Ramda作家)

  • 太远了,你是对的。当新用户选择Java脚本中的FP时,会过度使用无点代码。我通常建议仅在提高可读性时才有用。

  • ifElse调用不等同于Javascript条件表达式(三进制)。但是,它可以等同于返回三进制值的lambda函数。也就是说,该示例将更像(urlObject) => hasUrl(urlObject) ? promptToShare(urlObject) : null。此时,ifElse至少可能更具可读性。这使我们从关于部分应用程序/ currying的评论中获得了要点

  • 我几乎没有理由看到将ifElse与具有不同签名的函数一起使用。也就是说,如果promptToShare不接受任何参数,则它可能不属于对ifElse的调用。

  • getEvent函数看起来很奇怪。考虑到它使用的名称类似sendAnalyticsEvent,我猜测它会产生一些副作用。而另一个分支是无操作的。尽管Ramda团队并不真正在乎您如何使用该库,但这并不是我们设想的用户使用该库创建的功能。

  • 我已经看到对ifElse的其他奇怪调用,以传递分支功能之一的标识。大概应该将它们替换为whenunless,这肯定会更具语义。

因此,我同意您的示例完全不需要ifElse。但是ifElse及其同{whenunless确实有自己的位置。