Ist das eine vernünftige Verwendung des ternären Operators? [geschlossen]

7

Gibt es Verständnis- / Wartbarkeitsprobleme, die sich aus Code wie

ergeben? %Vor%

und so weiter.

Die möglicherweise verwirrende Idee ist die Verwendung des ternären Operators für den Programmablauf anstelle der Variablenzuweisung, was die übliche Erklärung ist.

Ich habe bei der Arbeit keine Kodierungsstandards gesehen, die diese Verwendung ansprechen, also möchte ich herausfinden, ob es einen guten Grund gibt, das nicht zu tun.

    
user63572 07.02.2009, 01:39
quelle

16 Antworten

35

Ich denke, es ist verwirrend und viel schwerer zu lesen als einfach zu tippen;

%Vor%

Ich musste Ihr Beispiel mehrmals scannen, um herauszufinden, wie das Ergebnis mit Sicherheit aussehen würde. Ich würde sogar eine einzeilige if () {} -Anweisung als Ihr Beispiel bevorzugen - und ich hasse einzeilige if-Anweisungen:)

    
Andrew Grant 07.02.2009, 01:41
quelle
25

Der ternäre Operator soll einen Wert zurückgeben.

IMO, sollte es nicht Status mutieren, und der Rückgabewert sollte verwendet werden.

Im anderen Fall verwenden Sie if-Anweisungen. Wenn Anweisungen Code Blöcke ausführen sollen.

    
thinkbeforecoding 07.02.2009 01:44
quelle
11

Das ternäre ist eine gute Sache, und ich fördere es im Allgemeinen.

Was du hier tust, trübt jedoch seine Glaubwürdigkeit. Es ist kürzer, ja, aber es ist unnötig kompliziert.

    
dicroce 07.02.2009 02:53
quelle
10

Ich denke, das sollte vermieden werden. Sie könnten an seiner Stelle eine 1-Zeilen-if-Anweisung verwenden.

%Vor%     
Bill the Lizard 07.02.2009 01:41
quelle
6

Compiler werden in diesen Tagen ein so schnell wie ein ternärer Operator machen.

Ihr Ziel sollte sein, wie einfach es für einen anderen Softwareentwickler ist, es zu lesen.

Ich stimme für

%Vor%

warum die Klammern ... denn eines Tages möchten Sie vielleicht etwas anderes hineinlegen und die Klammern sind für Sie vorgefertigt. Die meisten Redakteure werden diese Tage sowieso einstellen.

    
Gregor Brandt 07.02.2009 02:34
quelle
6

Ihre Verwendung des ternären Operators bringt Ihnen nichts und Sie verletzen die Lesbarkeit der Codes.

Da der ternäre Operator einen Wert zurückgibt, den Sie nicht verwenden, handelt es sich um einen ungeraden Code. Die Verwendung von if ist in einem Fall wie deins deutlich klarer.

    
lillq 07.02.2009 02:48
quelle
5

Wie in den Kommentaren erwähnt, ist dieses nicht C ++ . GCC zum Beispiel wird einen Fehler in diesem Code ausgeben:

%Vor%

Allerdings kann man das durch Casting umgehen:

%Vor%

Aber um welchen Preis? Und zu welchem ​​Zweck?

Es ist nicht so, als wäre die Verwendung des ternären Operators hier prägnanter als eine if-Anweisung in dieser Situation:

%Vor%     
bk1e 07.02.2009 03:38
quelle
2

In der Praxis stimme ich zwar mit den Gefühlen derjenigen überein, die diese Art des Schreibens ablehnen (beim Lesen muss man jedoch extra arbeiten, um den Ausdruck nach seinen Nebenwirkungen zu scannen), ich möchte anbieten

%Vor%

... wenn du obskur bist, das ist es. GCC erlaubt x ?: y anstelle von x ? x : y . : -)

    
ephemient 07.02.2009 02:39
quelle
2

Ich verwende einen ternären Operator, wenn ich eine Funktion mit bedingten Argumenten aufrufen muss - in diesem Fall ist es besser als if .

Vergleiche:

%Vor%

mit

%Vor%

Ich finde das erste ist ansprechender. Und es entspricht dem Prinzip DRY , im Gegensatz zu Letzterem - Sie müssen nicht zwei nahezu identische Zeilen schreiben.

    
qrdl 07.02.2009 07:39
quelle
1

Ich denke, Sie wären besser darin, eine richtige, wenn auch Struktur zu geben. Ich bevorzuge sogar immer Klammern mit meinen if-Strukturen, für den Fall, dass ich später Zeilen zur bedingten Ausführung hinzufügen muss.

%Vor%     
Bill Perkins 07.02.2009 01:44
quelle
1

Ich denke, dass das Ternär manchmal ein notwendiges Übel in Initialisierungslisten für Konstruktoren ist. Ich benutze sie hauptsächlich für Konstruktoren, wo ich Speicher zuweisen und einen Zeiger auf den Körper des Konstruktors setzen möchte.

Nehmen wir zum Beispiel an, Sie hätten eine ganzzahlige Speicherklasse, die einen Vektor als Eingabe haben soll, aber die interne Repräsentation ist ein Array:

%Vor%

So benutze ich den ternären Operator. Ich glaube nicht, dass es so verwirrend ist, wie manche Leute, aber ich denke, dass man darauf beschränken sollte, wie viel sie es benutzen.

    
James Matta 07.02.2009 21:52
quelle
1

Die meisten der gefolterten Seeschwalben (wie ist das für Alliterationen?) Ich sehe nur Versuche, Logik, die wirklich in eine if-Aussage gehört, an einen Ort zu setzen, an dem eine if-Aussage nicht hingehört oder nicht gehen kann.

>

Zum Beispiel:

%Vor%

funktioniert unter der Annahme, dass v.push_back ungültig ist. Was aber, wenn ein Wert zurückgegeben wird, der an eine andere Funktion übergeben werden muss? In diesem Fall müsste es in etwa so aussehen:

%Vor%

Aber das ist mehr für ein so einfaches Stück Code zu verdauen. Meine Lösung: Definieren Sie eine andere Funktion.

%Vor%

Jedenfalls ist das der Punkt: Wenn Sie eine Logik haben, die für ein Ternär zu gequält ist, aber Ihren Code überflutet, wenn er in eine if-Anweisung eingefügt wird, legen Sie ihn woanders hin!

    
Jason Baker 08.03.2009 01:14
quelle
1
%Vor%

gemeinsames Muster in Sprachen wie Perl gefunden.

    
Hafthor 19.03.2009 00:52
quelle
0

Wenn Sie mehrere Methodenaufrufe in einem oder beiden der tenary-Argumente haben, ist es falsch. Alle Codezeilen, unabhängig von ihrer Aussage, sollten kurz und einfach sein, idealerweise nicht zusammengesetzt.

    
mP. 07.02.2009 07:50
quelle
0

Eine korrekte if-Anweisung ist besser lesbar, wie andere bereits erwähnt haben. Wenn Sie mit einem Debugger durch Ihren Code gehen, können Sie nicht sofort erkennen, welcher Zweig eines if verwendet wird, wenn sich alles in einer Zeile befindet oder Sie einen ternären Ausdruck verwenden:

%Vor%

Während das Folgende viel besser zu durchlaufen ist (ob Sie die Zahnspange haben oder nicht):

%Vor%     
Ates Goral 07.02.2009 07:50
quelle
0

Wie bereits erwähnt, ist es nicht kürzer oder klarer als eine 1-Zeilen-if-Anweisung. Aber es ist auch nicht mehr - und ist nicht wirklich so schwer zu grok. Wenn Sie den ternären Operator kennen, ist es ziemlich offensichtlich, was passiert.

Ich glaube nicht, dass irgendjemand ein Problem hätte, wenn es einer Variablen zugewiesen würde (auch wenn es sich um einen mutierenden Status handelte):

%Vor%

Die Tatsache, dass der ternäre Operator immer einen Wert zurückgibt - IMO - ist irrelevant. Es gibt sicherlich keine Anforderung, dass Sie alle Rückgabewerte verwenden ... schließlich gibt eine Zuweisung einen Wert zurück.

Ich würde es mit einer if-Anweisung ersetzen, wenn ich mit einer NULL-Verzweigung darüber stoße.

Aber , wenn es eine if-Anweisung mit drei Zeilen ersetzt:

%Vor%

mit:

%Vor%

Ich könnte es verlassen ... abhängig von meiner Stimmung. ;)

    
Mark Brackett 08.03.2009 01:15
quelle

Tags und Links