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.
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:)
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.
Ich denke, das sollte vermieden werden. Sie könnten an seiner Stelle eine 1-Zeilen-if-Anweisung verwenden.
%Vor%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.
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.
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%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
. : -)
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.
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%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.
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!
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%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. ;)