点免费调试

jst*_*aab 6 javascript debugging pointfree ramda.js

所以我们在工作中使用了非常好的ramda库,这很棒,因为我们可以使用很大程度上无点的代码.这样做的问题是,当出现问题时,我们的代码中存在的内容要少得多; 大多数运行时错误是由于滥用组合的ramda函数而发生的.结合这个将这些函数传递给一个使用大量重定向的框架(我们正在使用react/redux),并且经常出现问题时,它只是在库中的代码很深,并且很难找到我去的地方错误.

有没有办法在不偏离无点风格的情况下缓解这个问题?

dav*_*ers 7

一种选择是使用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);
Run Code Online (Sandbox Code Playgroud)

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

  • 同样有用的是Raine Virta的[treis](https://github.com/raine/treis)和Seb Insua的[Ramda-debug](https://github.com/sebinsua/ramda-debug). (3认同)

Mad*_*iha 5

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

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

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

  • @jstaab 我每天都使用 TypeScript,与 Ramda 或 Lodash/fp 结合使用。我告诉你:TS不喜欢函数式编程。为柯里化函数定义接口是可能的,但相当痛苦。无论哪种方式,它都不会帮助您进行调试。它只会带来一些边际静态类型安全。但还有其他优点,这超出了这个问题的范围。 (4认同)