Außer vs in Javascript mit Verwendung von Ausrufezeichen?

8

Der folgende Code versucht, "ist gerade" für Zahlen auszugeben, die durch 2 teilbar sind.

Sollte es nicht sein, wenn (Test) dann () und nicht: wenn (! Test) dann (), wenn die Bedingung getestet ist "n% 2". Der folgende Code scheint zu lesen "IF-Nummern sind nicht durch 2 teilbar, ausdrucken 'Nummer ist gerade'", was nicht logisch erscheint.

Allgemeiner gesagt, welche Vorteile bietet das Schreiben einer Funktion "Wenn nicht" über die Verwendung einer If-Anweisung bei der Angabe der Bedingung, wenn wir nur schreiben können, wenn (! Bedingung)?

Jede Hilfe wird sehr geschätzt.

%Vor%     
Henry 23.01.2015, 23:43
quelle

2 Antworten

4

Der diskutierbare Vorteil davon ist, dass der Code etwas mehr wie Englisch liest: "Wenn n modulo 2 nicht Null ist, loggen Sie sich an die Konsole, dass n gerade ist."

Nach meiner Erfahrung besteht die praktische Konsequenz daraus darin, dass die meisten Programmierer das überprüfen müssen, es sei denn (), bevor sie sich damit wohl fühlen. Weil es kein Standardstück von Javascript ist, haben sie keine Möglichkeit zu wissen, ob es verwendet wird! oder == true oder === 0 oder ein anderer, immer etwas anderer Test, es sei denn, sie schauen sich die Implementierung an.

Mein Lieblingsbeispiel für dieses Prinzip ist COBOL. Diese Sprache versuchte sehr, Englisch zu ähneln, so dass sogar Nicht-Programmierer es benutzen konnten ... aber in Wirklichkeit scheinen sowohl Programmierer als auch Nicht-Programmierer es zu hassen, damit zu arbeiten.

    
Ixrec 23.01.2015 23:52
quelle
1

Es gibt keine Vorteile, wenn die Bedingung wie in diesem Szenario inline bereitgestellt wird. Sie können eine Transformation leicht anwenden, um sie in allen Fällen zu negieren (z. B. indem Sie vorher ein ! hinzufügen) und unless aus dem Bild herausnehmen bedeutet, dass es eine Sache weniger gibt, über die der Leser Bescheid wissen muss.

There könnte ein Vorteil sein, wenn die Bedingung in Form eines Rückrufs bereitgestellt wurde, z. B .:

%Vor%

In diesem Fall konnte die Negation von test nicht direkt an eine hypothetische Funktion onlyIf übergeben werden, die zu unless komplementär ist. Daher können sowohl onlyIf als auch unless den Code lesbarer machen erlaubt Ihnen dies zu tun:

%Vor%

statt dessen:

%Vor%

Die obige Situation könnte noch schlimmer sein, wenn dem Callback Argumente übergeben werden, die in test propagiert werden müssen.

    
Jon 23.01.2015 23:51
quelle