免点调试

Point free debugging

所以我们在工作中使用了非常好的 ramda 库,这很棒,因为我们能够使用基本上无点的代码风格。这样做的问题是,当出现问题时,指向我们代码中某些东西的地方要少得多;大多数 运行 时间错误的发生是因为误用了组合的 ramda 函数。将其与将这些函数传递给使用大量重定向的框架相结合(我们在 react/redux),并且通常当出现问题时,它深藏在仅库代码中,并且很难找出位置我错了。

有没有什么方法可以在不脱离无点风格的情况下缓解这个问题?

我 运行 在我的业余项目中遇到了与 Ramda 相同的问题。这就是让我暂时放弃生产的原因。

截至撰写此答案时,在 JavaScript 中调试无点式程序非常困难甚至不可能。这是我不使用它的唯一原因。即使有很好的单元测试覆盖率,我也发现开发周期太长,调试也很困难。

我将对此进行扩展:虽然存在像 Ramda-debug 和 R.tap() 这样的工具,但它们是活跃的调试工具,您需要将其添加到您的项目中,在某些情况下,添加到您的代码中并在以后的生产中删除。但是,当您收到错误消息时,您无法获得有用的堆栈跟踪,并且无法在调试器中单步执行以找出流程,您需要提前了解流程。

一种选择是使用 R.tap,像这样:

const f = R.pipe(
  R.tap(console.log),  // logs x
  g,
  R.tap(console.log),  // logs g(x)
  h,
  R.tap(console.log),  // logs h(g(x))
  i,
  R.tap(console.log),  // logs i(h(g(x)))
  j,
  R.tap(console.log)   // logs j(i(h(g(x))))
);

f(x);

另一种选择是使用 Sanctuary,当函数应用于错误类型的参数时会引发信息性异常。