2017-02-03 4 views
3

JavaScriptの柔軟性により、副作用のあるコードを書くことができます。JavaScriptの副作用について警告するどんなリンターですか?

私は機能的なJavaScriptに興味があり、このパラダイムでプロジェクトを開始したいと考えています。そしてそれについてのリンターは、私が良い習慣を集めるのを確実に助けることができます。純粋な機能と副作用のフリースタイルを強制するリンターはありますか?

+0

@VinodLouis:私の知る限り、JSLintは機能的純度をチェックする方法を提供していません。 –

+0

JavaScriptで「副作用」と呼ぶものを記述できますか? – Justinas

+1

JSは機能として副作用に基づいて構築されています – Thomas

答えて

3

純度分析は停止問題の解決に相当し、そのコードが純粋か不純であるかどうかを判断することができます静的解析のいずれかの種類があります一般的には不可能です。彼らが純粋であるかどうかにかかわらず、決して決定できない無限に多くのプログラムが常に存在するでしょう。これらのプログラムの一部は純粋であり、一部は純粋ではありません。

静的アナライザーの代わりに故意に用語「リンター」を使用しましたが(もちろんリンターは静的アナライザーに過ぎません)、これはおおよそのヒューリスティックな結果を示しています。 は、あなたのコードが純粋であることを時々教えてくれるリンターを持っています。あなたのコードが純粋ではないことを時々教えてくれることが多く、あなたのコードが純粋であるか不純であるかを判断できません。また、純粋であることがわかっている操作のホワイトリスト(たとえば、+演算子を使用して2つのNumberを追加する)と、不完全であることが知られている操作のブラックリスト(たとえば、例外をスローする可能性があるもの、 、ifステートメント、Array.prototype.forEach)、ヒューリスティックスキャンを行います。

最終的には、結果があまりにも信頼できないため、重大なことを行うことはできません。

+1

なぜ、 'Math.add =(a、b)=> a + b; if文は不純なものとみなされますか?彼らは何も返さないので、意味のある何かをするために副作用を行わなければならないからです。 – ftor

+0

はい、それです。言い換えれば、それらは*ステートメント*なので。ステートメントは*定義通りです* impure: "純度"とは、プログラムの意味を変えずに式をその値で置き換えることができることを意味します。ステートメントには値はありません。私はプログラムの意味を変えずに何も置き換えない(削除する)必要があります。これは、NO-OPステートメントの場合にのみ当てはまります。実際に何かを行うステートメントは、おそらく純粋ではありません。 –

+0

には、その副作用がある場合にのみ副作用があります。あなたは、返される値を決定するために使用される多くのifを見ることができます。この場合、戻り値(または3者演算子のようなもの)で置き換えることができます。 –

0

JSを副作用なしで完全に使用することはできません。すべてのDOMアクセスは副作用であり、グローバル名空間全体がその定義に該当するという引数を持つこともできます。

あなたができることは、妥当であることです。仕事の馬

  • (ユーティリティ):彼らの目的はいくつかのデータを取るために何とかそれを処理することですが、私は、論理的に二つのグループにこれを分割しています。これらは(主に)の副作用です。ほとんどの場合、これらの関数は時には副作用であると主張できるカウンターやキャッシュのような状態を必要とするためですが、これは分離されている/これらの関数に囲まれているので気にしません。あなたがArray#map()または約束then()などに渡す機能のような
    と同様の場所。

  • およびこれらの機能は、独自のデータ処理を実行することはめったにありません。作成されたプロセスから、実行する必要のある処理(ユーティリティ)まで、データフローを編成します。 DOMの変更やオブジェクトの変更など、終了します。

    var theOnesINeed = compose(...); 
    var theOtherOnesINeed = compose(...); 
    var intoADifferentFormat = function(value){ return ... } 
    
    function(event){ 
        var a = someList.filter(theOnesINeed).map(intoADifferentFormat); 
        var b = someOtherList.filter(theOtherOnesINeed); 
        var rows = a.concat(b).map(wrap('<li>', '</li>')); 
    
        document.querySelector('#youYesYou').innerHTML = rows.join('\n'); 
    } 
    

すべての機能はできるだけ短くし、シンプルに滞在するように。そして、わかりやすい名前を恐れてはいけません。(一般的なものとは異なります:)

関連する問題