Sollte der ternäre Operator außerhalb von Zuweisungsanweisungen verwendet werden?

9

Bearbeiten Dies ist keine Frage, ob der ternäre Operator schädlich ist oder nicht . Es geht darum, ob es einen Konsens darüber gibt, ob es außerhalb von Zuweisungsanweisungen verwendet werden soll oder nicht. /Bearbeiten

Basierend auf einem Booleschen Wert möchte ich eine von zwei verschiedenen Funktionen aufrufen (ohne Rückgabewert). Ich habe dieses Stück Javascript geschrieben:

(condition) ? doThis(arg) : doThat(arg)

Was meiner Meinung nach sauberer aussieht, als eine if-else-Erklärung zu schreiben:

if(condition) {
    doThis(arg);
}
else {
    doThat(arg);
}

Meine Kollegen sind der festen Überzeugung, dass ternäre Anweisungen nur in Zuweisungsanweisungen verwendet werden sollten. Ich kann keine Styleguides finden, die dies diskutieren, wahrscheinlich weil Sprachen wie Java und C # dies überhaupt nicht zulassen (ihre Compiler erfordern ternäre Operatoren, um einen Wert zurückzugeben). Sollte dies als eine schlechte Verwendung der ternären Aussage angesehen werden? Warum?

BobbyA
quelle
Denken Sie daran, dass die Jason Voorhees möglicherweise Ihren Code beibehalten.
David Hammen
2
@gnat - kein Duplikat dieser Frage, bei der es um die allgemeine Verwendung von ?: in Ausdrücken geht, während es speziell darum geht, sie als Ersatz für if-else zu verwenden, wenn kein einzelner Wert berechnet wird.
Jules
Ich bin mir zwar nicht sicher, ob das vorgeschlagene Duplikat angemessen ist, aber diese Frage basiert immer noch hauptsächlich auf Meinungen. Daher sehe ich keinen Grund, es erneut zu öffnen.
Ixrec
Warum denkst du, sieht das sauberer aus? Konventionen wie diese zu brechen ist das Gegenteil von sauber.
JacquesB

Antworten:

10

Im Allgemeinen soll der bedingte Operator eine if-Anweisung mit einem Wert erstellen . w = x ? y : z. Wenn Sie es also für Nebenwirkungen verwenden, ist es nicht intuitiv. Gültig, aber nicht intuitiv; und denken Sie daran, dass Sie Code schreiben, den Ihre Teamkollegen lesen können.

asthasr
quelle
Das scheint richtig zu sein. Nahezu jedes Verwendungsbeispiel, das ich finde, einschließlich Wikipedia, verwendet den Operator, um eine bedingte Zuweisung durchzuführen.
BobbyA
3

Einige Fälle, bei denen es sich nicht um Zuweisungen handelt, bei denen ich ternäre Operatoren nützlich finde, sind:

In Funktionsargumenten: meiner Meinung nach

f( e1, .. cond ? em : dm, .. en);

ist weniger fehleranfällig als

if ( cond) f( e1, .. em, .. en); else f( e1, .. dm, .. en);

Wenn Sie die eine oder andere Funktion mit identischen Argumenten aufrufen möchten: wieder finde ich

(cond ? f : g)( /* long and complex argument list */);

weniger fehleranfällig als

if ( cond) f( /* long and complex argument list */);
else g( /* long and complex argument list */);

Aus meiner Sicht ist das Wichtigste in jedem Fall, dass das? Form hat weniger Wiederholung. Wiederholung eröffnet die Möglichkeit, eine Instanz zu ändern und zu vergessen, die andere zu ändern.

dmuir
quelle
5
In diesen Fällen verwenden Sie jedoch immer noch den ternären Operator, um einen Wert zurückzugeben, der gemäß der obigen Antwort von syrion eine erwartete Verwendung darstellt.
BobbyA
@ BobbyA was ist mit leeren Funktionen?
Bitte