2016-10-27 3 views
4

非常に素晴らしいramdaライブラリを使用しています。これは、ほとんどポイントフリーのコードスタイルを使用できるため、素晴らしいことです。この問題は、コード内の何かを指し示すようなものが間違って見える場所がはるかに少ないことです。ほとんどの実行時エラーは、作成されたラムダ関数の誤用のために発生します。これを組み合わせて、多くのリダイレクトを使用するフレームワーク(これらの機能をリアクション/レクセス)に渡します。何か問題が起こった場合、ライブラリ専用のコードが深く、私がどこに行ったかを知ることは非常に困難です違う。ポイントフリーデバッグ

ポイントフリースタイルから離れることなくこの問題を緩和する方法はありますか?

答えて

5

1つのオプションはそうのように、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を、使用することです。

+3

Raine Virtaの[treis](https://github.com/raine/treis)とSeb Insuaの[Ramda-debug](https://github.com/sebinsua/ramda-debug)も便利です。 –

+0

私はすでに、特定の問題をデバッグするために、 'log'が' console'に束縛されていないので、あなたの例は動作しません。私は、ラムダ関数が間違って呼び出された場合、合理的なエラーが発生する一般的なスタイルでコードを記述する方法がもっと不思議です。これらのライブラリは本当に役に立ちます。フロー/タイスクリプトよりもそれらの利点? – jstaab

+1

'R.tap(console.log)'はNodeでは動作しますが、ブラウザでは動作しません。 'R.tap(console.log.bind(console))'は両方の環境で動作しますが、入力するのはちょっと面倒です。もちろん、このためのエイリアスを定義することもできます。 :) – davidchambers

3

サイドプロジェクトでRamdaと同じ問題が発生しました。それは私が生産でそれをあきらめさせた原因です。

この回答を書いている時点では、JavaScriptでポイントフリースタイルのプログラムをデバッグすることは非常に困難です。それが私が使っていない唯一の理由です。単体テストのカバレッジが優れていても、開発サイクルが長すぎて、デバッグが難しいことがわかりました。

私はRamDA-debugやR.tap()のようなツールが存在しますが、それらはアクティブなデバッグツールであり、プロジェクトに追加する必要があり、場合によってはコードに追加して後で削除する必要があります。ただし、エラーメッセージが表示された場合は、有用なスタックトレースが得られず、デバッガでフローを把握することができず、事前にフローを知る必要があります。

+0

フローやタイスクリプトのようなものを試したことがありますか? – jstaab

+0

私は今はTypeScriptを探していますが、 –

+3

@jstaab私はType Scriptを毎日、RamdaまたはLodash/fpと共に使用しています。 TSは関数型プログラミングを好まない。カレー化された関数のインタフェースを定義することは可能ですが、むしろ苦痛です。いずれにしても、デバッグには役に立ちません。わずかな静的型安全性しか持たない。しかし、この質問の範囲を超えている他の利点があります。 – RIAstar