2016-08-20 3 views
7

Ich habe verschiedene Quellen von Node.js-Projekten untersucht, und ich habe festgestellt, dass einige Leute invariant verwenden. Nach dem, was ich verstanden habe, ist invariant ein Werkzeug, mit dem Sie Assertionen in Ihren Code einfügen und Fehler nach Bedarf auslösen können.Mit Facebooks Invariante vs if throw

Frage:

Wann möchten Sie mit invariant vs werfen Fehler, die traditionelle Art und Weise begünstigen?

// 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

Wahrscheinlich nur weil es eine Zeile statt mehrerer Zeilen ist. Die gleiche Art von Muster wie 'Preconditions' in Google Guava (Java) – Krease

Antwort

11

Es gibt ein paar Gründe:

  • Es ist einfacher zu lesen, wenn man sie stapeln möchten. Wenn Sie haben, sagen wir, drei Voraussetzungen zu überprüfen, immer Sie invariant(x ... sehen, und es ist leicht zu sehen, was überprüft Sein:

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"); 
} 

mit den üblichen throw Ansatz vergleichen:

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"); 
} 

  • Es macht es einfach, es in Release-Build zu beseitigen.

    Es ist oft so, dass die Vorbedingungen in dev/test überprüft werden sollen, aber nicht in der Freigabe, weil sie langsam sind. Wenn Sie eine solche invariant Funktion haben, können Sie ein Tool wie Babel (oder eine andere) verwenden, um diese Aufrufe von Produktion Builds zu entfernen (das ist ein bisschen wie D tut es).

+0

Ah, das Deaktivieren der Assertionen in Prod-Builds klingt nach einer großartigen Idee. Etwas schwer, das mit dem 'if throw' Ansatz zu machen. –

+0

@ rodrigo-silveira in der Tat! Diese sind leicht zu sammeln (Sie können sie sogar zur Dokumentation verwenden). Wenn dies eine ausreichende Antwort war, können Sie es als akzeptiert markieren. – Ven