2016-08-20 8 views
7

私は様々なNode.jsプロジェクトのソースを見てきましたが、一部の人々はinvariantを使用していることに気付きました。私が理解したところでは、invariantはコードにアサーションを入れ、必要に応じてエラーを発生させるツールです。Facebookの不変量vs投げる場合

質問:

にエラーに伝統的な方法を投げ対invariantを使用して有利に働きますか?

// Using invariant 
function doSomething(a, b) { 
    invariant(a > b, 'A should be greater than B'); 
} 

// If throw 
function doSomething(a, b) { 
    if(a <= b) { 
     throw new Error('A should be greater than B'); 
    } 
} 
+0

多分、複数の行ではなく1行だからです。 Googleグーバ(Java)の「前提条件」と同じ種類のパターン – Krease

答えて

11

いくつかの理由があります:

  • それはあなたがそれらをスタックしたいときに読みやすいのですが。あなたは、たとえば、検証するための3つの前提条件を持っている場合、あなたは常にinvariant(x ...を見て、それがチェックされているものを参照するのは簡単です:

function f(xs, x) { 
    // all the invariants are lined up, one after another 
    invariant(xs.type == x.type, "adding an element with the same type"); 
    invariant(xs.length != LIST_MAX_SIZE, "the list isn't full"); 
    invariant(fitting(x), "x is fitting right in the list"); 
} 

は、通常のスロー・アプローチと比較する:

function f(xs, x) { 
    if (xs.type != x.type) 
     throw new Error("adding an element with the same type"); 
    if (xs.length == LIST_MAX_SIZE) 
     throw new Error("the list isn't full"); 
    if (!fitting(x)) 
     throw new Error("x is fitting right in the list"); 
} 

  • リリースビルドで簡単に削除できます。

    dev/testで前提条件をチェックしたいと思うことはよくありますが、どれくらい時間がかかるためにリリースされることは望ましくありません。 このようなinvariant機能を使用している場合は、バーベルなどのツールを使用して、プロダクションビルド からこれらのコールを削除できます(これはDのやり方と多少似ています)。

+0

prodビルドでアサーションを無効にすることは素晴らしい考えです。 'if throw'アプローチを使用するのは難しいことです。 –

+0

@ rodrigo-silveira確かに!それらは簡単に集めることができます(ドキュメンテーションのために使用することもできます)。これが十分な答えだったら、それを合格とマークすることを自由にしてください。 – Ven

関連する問題