Zu ternär oder nicht zu ternär? [geschlossen]

186

Ich persönlich bin ein Anwalt des ternären Operators: ()? :; Mir ist klar, dass es seinen Platz hat, aber ich bin auf viele Programmierer gestoßen, die völlig dagegen sind, es jemals zu benutzen, und auf einige, die es zu oft benutzen.

Was denkst du darüber? Welchen interessanten Code haben Sie bei der Verwendung gesehen?

Pixel
quelle
22
Ein Verfechter von etwas ist eine Person, die dieses Ding unterstützt.
Doug McClean
8
Verwenden Sie es, wenn es klar ist, vermeiden Sie es, wenn es verwirrt. Das ist ein Urteilsspruch. Es kann Code lesbarer machen, aber nur für einfache Ausdrücke. Der Versuch, es immer zu benutzen, ist genauso bedrohlich wie es unermüdlich zu vermeiden.
Abel
3
Eigentlich ist es der bedingte Operator. Eine nahezu doppelte Frage lautet stackoverflow.com/questions/725973/… .
Daniel Daranas
Ich habe manchmal verwendet, x = x if x else yaber dann danach gefragt und mit anderen Hilfe festgestellt, dass es sich wirklich nur auf x = x oder y reduziert ( stackoverflow.com/questions/18199381/self-referencing-ternary/… )
Scruffy
4
Fragen wie diese sollten nicht als nicht konstruktiv angesehen werden.
Ungeheuer

Antworten:

243

Verwenden Sie es nur für einfache Ausdrücke :

int a = (b > 10) ? c : d;

Verketten oder verschachteln Sie keine ternären Operatoren, da diese schwer zu lesen und verwirrend sind:

int a = b > 10 ? c < 20 ? 50 : 80 : e == 2 ? 4 : 8;

Wenn Sie einen ternären Operator verwenden, sollten Sie den Code so formatieren, dass die Lesbarkeit verbessert wird:

int a = (b > 10) ? some_value                 
                 : another_value;
Marcospereira
quelle
80
Stimmen Sie den ersten Aussagen voll und ganz zu, aber stimmen Sie Ihrem Beispiel einer "verbesserten Lesbarkeit" überhaupt nicht zu. Wenn Sie mehrzeilig sind, warum nicht einfach eine if-Anweisung verwenden?
Joe Phillips
3
nur weil, wenn sonst für einfache Entscheidungen etwas ausführlicher ist: int a = 0; wenn (b> 10) a = some_value; sonst a = ein anderer_Wert; Was bevorzugen Sie?
Marcospereira
44
@ d03boy: Weil if-Anweisung genau das ist, eine Anweisung, und nicht funktioniert, wenn alles, was Sie wollen, ein Ausdruck ist.
Falstro
2
@roe in einigen Sprachen, wenn Ausdruck ist (z. B. in Scala), val x = if(true) 0 else 1ist also vollkommen legal
om-nom-nom
5
@ om-nom-nom In diesem Fall würde dies eher zu einem if-Ausdruck als zu einer if-Anweisung führen und ist im Wesentlichen dasselbe wie der Operator ?: -.
Falstro
140

Dies erschwert das Debuggen etwas, da Sie nicht für jeden der Unterausdrücke Haltepunkte setzen können. Ich benutze es selten.

David Segonds
quelle
44
Das ist das beste Argument gegen den ternären Operator, den ich je gehört habe. Ich kaufe das Argument "nicht lesbar" nicht (es klingt für mich so, als wären die Leute zu faul, um sich daran zu gewöhnen), aber das hat tatsächlich Substanz.
EpsilonVector
80

Ich liebe sie, besonders in typsicheren Sprachen.

Ich sehe nicht wie das:

int count = (condition) ? 1 : 0;

ist schwieriger als das:

int count;

if (condition)
{
  count = 1;
} 
else
{
  count = 0;
}

bearbeiten -

Ich würde argumentieren, dass ternäre Operatoren alles weniger komplex und ordentlicher machen als die Alternative.

Ian P.
quelle
5
Die ternäre Initialisierung ist in D oder C ++ noch nützlicher, wenn die Variable konstant ist. zB const int count = ...;
deft_code
Nun, Sie stellen sich if/elsemit den nicht benötigten Zahnspangen dort irgendwie falsch dar .
Bobobobo
1
Auch in diesem Fall, wenn es so conditionist bool , könnten Sie es einfach tun int count = condition;
Bobobobo
1
@ Bobobobo dies if/elsemit geschweiften Klammern ist, wie die Mehrheit der Programmierer das ternäre umschreiben wird.
Andre Figueiredo
1
@ Bobobobo wenn / sonst ohne Klammern nur um Ärger bittet. Es ist viel zu einfach für jemanden, eine Zeile hinzuzufügen, aber vergessen Sie, dass dann geschweifte Klammern erforderlich sind, um das zu tun, was sie erwarten (führen Sie die zusätzliche Zeile als Teil eines Blocks aus): stackoverflow.com/a/381274/377225
George Marian
43

Verkettet geht es mir gut mit - verschachtelt, nicht so sehr.

Ich neige dazu, sie eher in C zu verwenden, einfach b / c, sie sind eine if-Anweisung, die Wert hat, so dass unnötige Wiederholungen oder Variablen vermieden werden:

x = (y < 100) ? "dog" :
    (y < 150) ? "cat" :
    (y < 300) ? "bar" : "baz";

eher, als

     if (y < 100) { x = "dog"; } 
else if (y < 150) { x = "cat"; }
else if (y < 300) { x = "bar"; } 
else              { x = "baz"; }

Bei solchen Aufgaben finde ich, dass es weniger umgestaltet und klarer ist.

Wenn ich dagegen in Rubin arbeite, verwende ich eher, if...else...endweil es auch ein Ausdruck ist.

x =   if (y < 100) then "dog"
    elif (y < 150) then "cat"
    elif (y < 300) then "bar"
    else                "baz"
    end

(obwohl ich zugegebenermaßen für etwas so Einfaches sowieso nur den ternären Operator verwenden könnte).

Rampion
quelle
2
Ich mag dein erstes Beispiel - ich hatte vorher nicht daran gedacht, sie so zu verketten. Danke für das Teilen. =)
Erik Forbes
5
+1 Ich habe tatsächlich vor kurzem damit begonnen. Ich mache es sogar, um switch-Anweisungen zu ersetzen.
Davy8
1
Exzellentes Beispiel @rampion.
ylluminate
39

Der ternäre ?:Operator ist lediglich ein funktionales Äquivalent des Verfahrensif Konstrukts. Solange Sie keine verschachtelten ?:Ausdrücke verwenden, gelten hier die Argumente für / gegen die funktionale Darstellung einer Operation. Das Verschachteln von ternären Operationen kann jedoch zu Code führen, der geradezu verwirrend ist (Übung für den Leser: Versuchen Sie, einen Parser zu schreiben, der verschachtelte ternäre Bedingungen verarbeitet, und Sie werden deren Komplexität zu schätzen wissen).

Es gibt jedoch viele Situationen, in denen eine konservative Verwendung des ?:Operators zu Code führen kann, der tatsächlich leichter zu lesen ist als sonst. Beispielsweise:

int compareTo(Object object) {
    if((isLessThan(object) && reverseOrder) || (isGreaterThan(object) && !reverseOrder)) {
       return 1;
    if((isLessThan(object) && !reverseOrder) || (isGreaterThan(object) && reverseOrder)) {
       return -1;
    else
      return 0;              
}

Vergleichen Sie das jetzt damit:

int compareTo(Object object) {
    if(isLessThan(object))
        return reverseOrder ? 1 : -1;         
    else(isGreaterThan(object))
        return reverseOrder ? -1 : 1;
    else        
       return 0;              
}

Da der Code kompakter ist, gibt es weniger syntaktisches Rauschen, und wenn der ternäre Operator mit Bedacht verwendet wird ( dh nur in Bezug auf die Eigenschaft reverseOrder ), ist das Endergebnis nicht besonders knapp.

Ryan Delucchi
quelle
Ich würde immer noch befürworten, Auszeichnungen für jede if / then / else-Konstruktion zu verwenden, die nicht ternär ist, so dass Ihrem zweiten Beispiel ein paar imho fehlen.
Kris
Ja, es ist funktionsfähig. Es ist wie eine winzige Funktion, die ein einziges boolesches Argument hat und jeden gewünschten Typ zurückgibt ! Eigentlich ein ordentlicher Operator.
Bobobobo
24

Es ist wirklich eine Frage des Stils; Die unbewussten Regeln, denen ich folge, sind:

  • Bewerten Sie nur 1 Ausdruck - also foo = (bar > baz) ? true : false , aber NICHTfoo = (bar > baz && lotto && someArray.Contains(someValue)) ? true : false
  • Wenn ich es für die Anzeigelogik verwende, z <%= (foo) ? "Yes" : "No" %>
  • Verwenden Sie es nur wirklich für die Zuordnung; Fließ niemals Logik (also niemals(foo) ? FooIsTrue(foo) : FooIsALie(foo) ) Flusslogik im Ternären ist selbst eine Lüge, ignorieren Sie diesen letzten Punkt.

Ich mag es, weil es prägnant und elegant für einfache Zuweisungsoperationen ist.

Keith Williams
quelle
gute Richtlinien und schöne Beispiele!
Nickf
Ich denke, die meisten Sprachen lassen Sie es nicht für die Flusslogik verwenden, also konnten Sie es nicht tun (foo)? Richtig (foo): Falsch (foo); es sei denn, es war eine Aufgabe.
Henry B
Ups, ja du hast recht, mein schlechtes.
Keith Williams
21
Ihre beiden ersten Beispiele sind wirklich schlecht. Die Ergebnisse von Vergleichen sind bereits boolesche Werte, sodass Ihre ternären Operatoren nutzlos sind und nur den Code komplizieren.
Trillian
1
@Trillian +1 Ja, hätte mit einer anderen Aufgabe gehen sollen. foo = (bar > baz);ist viel einfacher
Eric
18

Wie so viele Meinungsfragen lautet die Antwort unweigerlich: Es kommt darauf an

Für so etwas wie:

return x ? "Yes" : "No";

Ich denke, das ist viel prägnanter (und für mich schneller zu analysieren) als:

if (x) {
    return "Yes";
} else {
    return "No";
}

Wenn Ihr bedingter Ausdruck komplex ist, ist die ternäre Operation keine gute Wahl. Etwas wie:

x && y && z >= 10 && s.Length == 0 || !foo

ist kein guter Kandidat für den ternären Operator.

Abgesehen davon, wenn Sie ein C-Programmierer sind, hat GCC tatsächlich eine Erweiterung , mit der Sie den if-true-Teil des Ternärs wie folgt ausschließen können:

/* 'y' is a char * */
const char *x = y ? : "Not set";

Welche gesetzt xzu der yAnnahme ynicht NULL. Gutes Zeug.

Sean Bright
quelle
Ein leichtes Syntax- und Grammatikproblem wurde behoben, Sean :-) Das Fehlen von y im letzten Codebit und "x zu y zuweisen" bedeutet "y = x", also habe ich "x zu y setzen".
Paxdiablo
@Pax: Danke! Ich habe die Syntaxänderung rückgängig gemacht, da ich darauf hinweisen wollte, dass bei GCC-Erweiterungen der if-true-Teil des Ternärs nicht benötigt wird.
Sean Bright
Entschuldigung, habe diesen Absatz nicht gesehen. Ich weiß nicht, dass ich mit solchen Dingen einverstanden bin, da es den Leuten erlaubt, Code zu schreiben, der nicht mit einem ISO-Standard-Compiler kompiliert werden kann. Dennoch, wenn GCC der letzte Mann ist, der steht, spielt das keine Rolle :-)
paxdiablo
Es ist sicher Voodoo ... Und wer benutzt GCC nicht? : D
Sean Bright
14

In meinen Augen ist es nur dann sinnvoll, den ternären Operator zu verwenden, wenn ein Ausdruck benötigt wird.

In anderen Fällen scheint der ternäre Operator die Klarheit zu verringern.

John Mulder
quelle
Das Problem ist, dass 99% der Sprache sind. Ein Ausdruck kann durch eine Funktion ersetzt werden. Wenn Sie den ternären Operator vermeiden, wird diese Lösung sogar bevorzugt.
PierreBdR
11

Durch das Maß der zyklomatischen Komplexität sind die Verwendung von ifAnweisungen oder der ternäre Operator gleichwertig. Nach dieser Maßnahme lautet die Antwort also nein , die Komplexität wäre genau die gleiche wie zuvor.

Durch andere Maßnahmen wie Lesbarkeit, Wartbarkeit und DRY (Don't-Repeat-Yourself) kann sich eine Auswahl als besser als die andere erweisen.

Greg Hewgill
quelle
10

Ich verwende es ziemlich oft an Orten, an denen ich gezwungen bin, in einem Konstruktor zu arbeiten - zum Beispiel in den neuen .NET 3.5 LINQ to XML-Konstrukten -, um Standardwerte zu definieren, wenn ein optionaler Parameter null ist.

Erfundenes Beispiel:

var e = new XElement("Something",
    param == null ? new XElement("Value", "Default")
                  : new XElement("Value", param.ToString())
);

oder (danke Asterit)

var e = new XElement("Something",
    new XElement("Value",
        param == null ? "Default"
                      : param.ToString()
    )
);

Unabhängig davon, ob Sie den ternären Operator verwenden oder nicht, ist es wichtig, dass Ihr Code lesbar ist. Jedes Konstrukt kann unlesbar gemacht werden.

Erik Forbes
quelle
Oder ... var e = neues XElement ("Etwas", neues XElement ("Wert", param == null? "Standard": param.toString ()));
Asterit
2
Ich mag es, dass Sie es aus Gründen der Lesbarkeit formatieren, so viele nicht.
Bruceatk
Was nützt von Menschen lesbarer Quellcode, wenn er nicht von Menschen gelesen werden kann? =)
Erik Forbes
9

Ich verwende den ternären Operator, wo immer ich kann, es sei denn, der Code ist dadurch extrem schwer zu lesen, aber das ist normalerweise nur ein Hinweis darauf, dass mein Code ein wenig umgestaltet werden könnte.

Es verwirrt mich immer wieder, wie manche Leute denken, der ternäre Operator sei ein "verstecktes" Merkmal oder etwas mysteriös. Es ist eines der ersten Dinge, die ich gelernt habe, als ich mit dem Programmieren in C angefangen habe, und ich glaube nicht, dass es die Lesbarkeit beeinträchtigt. Es ist ein natürlicher Teil der Sprache.

ilitirit
quelle
1
Ich bin völlig einverstanden. Daran ist nichts verborgen oder knifflig.
mmattax
2
Dies kann zu Lesbarkeitsproblemen führen, insbesondere wenn diese verschachtelt sind.
David Thornley
Ich denke, " extrem schwer zu lesen" ist etwas zu freizügig, aber insgesamt stimme ich Ihnen zu. Es ist nichts Schwieriges oder Mystisches daran.
EpsilonVector
8

(Hack des Tages)

#define IF(x) x ?
#define ELSE :

Dann können Sie if-then-else als Ausdruck verwenden:

int b = IF(condition1)    res1
        ELSE IF(condition2)  res2
        ELSE IF(conditions3) res3
        ELSE res4;
John John
quelle
7

Ich stimme jmulder zu: Es sollte nicht anstelle von a verwendet werden if, aber es hat seinen Platz für den Rückgabeausdruck oder innerhalb eines Ausdrucks:

echo "Result: " + n + " meter" + (n != 1 ? "s" : "");
return a == null ? "null" : a;

Ersteres ist nur ein Beispiel, es sollte eine bessere i18n-Unterstützung des Plural verwendet werden!

PhiLho
quelle
Das erste Ternär ist falsch - Sie haben ein: Wo ist das? sollte gehen: (n! = 1 ? "s": "")
Erik Forbes
Ja, danke, dass Sie darauf hingewiesen haben! Fest.
PhiLho
6

Wenn Sie den ternären Operator für eine einfache bedingte Zuweisung verwenden, ist dies meiner Meinung nach in Ordnung. Ich habe gesehen, dass es (ab) verwendet wird, um den Programmfluss zu steuern, ohne überhaupt eine Zuweisung vorzunehmen, und ich denke, das sollte vermieden werden. Verwenden Sie in diesen Fällen eine if-Anweisung.

Bill die Eidechse
quelle
5

Ich denke, der ternäre Operator sollte bei Bedarf verwendet werden. Es ist offensichtlich eine sehr subjektive Wahl, aber ich finde, dass ein einfacher Ausdruck (insbesondere als Rückgabeausdruck) viel klarer ist als ein vollständiger Test. Beispiel in C / C ++:

return (a>0)?a:0;

Verglichen mit:

if(a>0) return a;
else return 0;

Sie haben auch den Fall, dass die Lösung zwischen dem ternären Operator und dem Erstellen einer Funktion liegt. Zum Beispiel in Python:

l = [ i if i > 0 else 0 for i in lst ]

Die Alternative ist:

def cap(value):
    if value > 0:
        return value
    return 0
l = [ cap(i) for i in lst ]

Es wird genug benötigt, um in Python (als Beispiel) eine solche Redewendung regelmäßig zu sehen:

l = [ ((i>0 and [i]) or [0])[0] for i in lst ]

Diese Zeile verwendet die Eigenschaften der logischen Operatoren in Python: Sie sind faul und geben den zuletzt berechneten Wert zurück, wenn er dem Endzustand entspricht.

PierreBdR
quelle
3
Diese letzte Zeile tut meinem Gehirn weh ...
Erik Forbes
5

Ich mag sie. Ich weiß nicht warum, aber ich fühle mich sehr cool, wenn ich den ternären Ausdruck verwende.

JimDaniel
quelle
5

Ich habe solche Bestien gesehen wie (es war tatsächlich viel schlimmer, da es ValidDate war und auch Monat und Tag überprüft wurde, aber ich konnte mir nicht die Mühe machen, mich an das Ganze zu erinnern):

isLeapYear =
    ((yyyy % 400) == 0)
    ? 1
    : ((yyyy % 100) == 0)
        ? 0
        : ((yyyy % 4) == 0)
            ? 1
            : 0;

wo eindeutig eine Reihe von if-Anweisungen besser gewesen wäre (obwohl diese immer noch besser ist als die Makroversion, die ich einmal gesehen habe).

Ich habe nichts dagegen für kleine Dinge wie:

reportedAge = (isFemale && (Age >= 21)) ? 21 + (Age - 21) / 3 : Age;

oder sogar etwas knifflige Dinge wie:

printf ("Deleted %d file%s\n", n, (n == 1) ? "" : "s");
paxdiablo
quelle
Wie kann man eine Reihe von isolierenden Aussagen sagen, wenn Aussagen besser lesbar wären? Ich habe dein "Biest" ganz gut gelesen . reportedAgeist das Beispiel, das einige Überlegungen erfordert - wahrscheinlich, weil es eher ein besonderer Fall ist als herauszufindenisThisYearALeapYear
Axeman
4

Nun, die Syntax dafür ist schrecklich. Ich finde funktionale Wenns sehr nützlich und mache Code oft lesbarer.

Ich würde vorschlagen, ein Makro zu erstellen, um es besser lesbar zu machen, aber ich bin sicher, dass jemand einen schrecklichen Randfall entwickeln kann (wie es bei CPP immer der Fall ist).

Marcin
quelle
Viele BASIC-Implementierungen und -Varianten verfügen über eine IF-Funktion, die den ternären Operator ersetzt. Ich habe eine Reihe von Codebasen gesehen, die in C als Makro definiert sind.
Sparr
Nun, ich dachte an funktionale Programmiersprachen, aber ja.
Marcin
"Ein Makro erstellen, um es besser lesbar zu machen", du bist ein ziemlicher Witzbold!
NiXar
4

Ich verwende gerne den Operator im Debug-Code, um Fehlerwerte zu drucken, damit ich sie nicht ständig nachschlagen muss. Normalerweise mache ich das für Debug-Drucke, die nicht mehr bleiben, wenn ich mit der Entwicklung fertig bin.

int result = do_something();
if( result != 0 )
{
  debug_printf("Error while doing something, code %x (%s)\n", result,
                result == 7 ? "ERROR_YES" :
                result == 8 ? "ERROR_NO" :
                result == 9 ? "ERROR_FILE_NOT_FOUND" :
                "Unknown");
}
indiv
quelle
4

Ich benutze den ternären Operator fast nie, denn wenn ich ihn benutze, denke ich immer viel mehr nach, als ich später tun muss, wenn ich versuche, ihn zu warten.

Ich mag es, Ausführlichkeit zu vermeiden, aber wenn es den Code viel einfacher macht, werde ich mich für die Ausführlichkeit entscheiden.

Erwägen:

String name = firstName;

if (middleName != null) {
    name += " " + middleName;
}

name += " " + lastName;

Das ist ein bisschen ausführlich, aber ich finde es viel lesbarer als:

String name = firstName + (middleName == null ? "" : " " + middleName)
    + " " + lastName;

oder:

String name = firstName;
name += (middleName == null ? "" : " " + middleName);
name += " " + lastName;

Es scheint einfach zu viele Informationen auf zu wenig Platz zu komprimieren, ohne klar zu machen, was los ist. Jedes Mal, wenn ich sehe, dass ternäre Operatoren verwendet werden, habe ich immer eine Alternative gefunden, die viel einfacher zu lesen schien. Andererseits ist dies eine äußerst subjektive Meinung. Wenn Sie und Ihre Kollegen ternäre Operatoren als sehr lesbar empfinden, entscheiden Sie sich dafür.

Mike Stone
quelle
1
Das ist aber nicht genau das Gleiche. Im zweiten Beispiel komprimieren Sie alle drei Anweisungen in einer Zeile. Dies verringert die Lesbarkeit, nicht den ternären Operator.
ilitirit
Fairerweise habe ich aktualisiert, um Ihren Kommentar aufzunehmen, aber es fühlt sich für mich immer noch unübersichtlich an ... aber auch hier ist es subjektiv ... Ich sage nicht, dass ternär nicht lesbar ist, ich sage, dass es für mich nicht lesbar ist (99) % der Zeit)
Mike Stone
3

Nur wenn:

$ var = (simple> test? simple_result_1: simple_result_2);

KUSS.

Jared Farrish
quelle
3

Ich benutze normalerweise in solchen Dingen:

before:

if(isheader)
    drawtext(x,y,WHITE,string);
else
    drawtext(x,y,BLUE,string);

after:

    drawtext(x,y,isheader==true?WHITE:BLUE,string);
KPexEA
quelle
Natürlich würden Sie in den meisten Sprachen auch nicht den "== true" -Teil dieses Ternärs benötigen.
Michael Haren
Mir ist klar, dass, obwohl ich dazu neige, es nur einzufügen, um den Code besser lesbar zu machen, da der Compiler ihn auf die gleiche Weise optimieren sollte wie ohne == true sowieso
KPexEA
in keiner Sprache können Sie möglicherweise "== true"
niXar
Es fiel mir schwer zu entscheiden, ob ich abstimmen sollte oder nicht. Das Beispiel ist schön, aber das == TRUE ist etwas, das ich im Code anderer Leute nicht sehen kann.
Peter Perháč
3

Wie andere betont haben, eignen sie sich gut für kurze, einfache Bedingungen. Ich mag sie besonders für Standardeinstellungen (ähnlich wie || und / oder Verwendung in Javascript und Python), z

int repCount = pRepCountIn ? *pRepCountIn : defaultRepCount;

Eine weitere häufige Verwendung ist das Initialisieren einer Referenz in C ++. Da Referenzen in derselben Anweisung deklariert und initialisiert werden müssen, können Sie keine if-Anweisung verwenden.

SomeType& ref = pInput ? *pInput : somethingElse;
maccullt
quelle
2
Erstaunlich, dass dies die erste Erwähnung der Initialisierung von Referenzen ist. Dies ist einer der wenigen Orte, an denen "if" nicht anstelle von?: Verwendet werden kann. (Ich denke, weil dies keine C ++ - spezifische Frage ist ...) Aus dem gleichen Grund sind sie auch in Konstruktorinitialisierungslisten nützlich.
j_random_hacker
2

Ich behandle ternäre Operatoren sehr wie GOTO. Sie haben ihren Platz, aber sie sollten normalerweise vermieden werden, um den Code verständlicher zu machen.

Dan Walker
quelle
2

Ich habe kürzlich eine Variation von ternären Operatoren gesehen (na ja, irgendwie), die die Standardvariante "() ?:" Einen Inbegriff von Klarheit erscheinen lassen:

var Result = [CaseIfFalse, CaseIfTrue][(boolean expression)]

oder, um ein konkreteres Beispiel zu geben:

var Name = ['Jane', 'John'][Gender == 'm'];

Wohlgemerkt, dies ist Javascript, so dass solche Dinge in anderen Sprachen (zum Glück) möglicherweise nicht möglich sind.

pilsetnieks
quelle
1
Wow, das ist schrecklich! Stellen Sie sich vor, Sie nisten ein paar davon zusammen! Das einzig vage Nützliche, was ich daran sehen kann, ist, wenn Sie eine Funktion hatten, die ein Array mit zwei Elementen zurückgab: var Name = getNames () [Gender == 'm']; ... aber das ist noch WENIGER lesbar!
Nickf
2

Für einfache Fälle verwende ich es gerne. Tatsächlich ist es viel einfacher, beispielsweise als Parameter für Funktionen oder ähnliches zu lesen / zu codieren. Auch um die neue Zeile zu vermeiden, behalte ich gerne alle meine if / else.

Es wäre ein großes NEIN-NEIN in meinem Buch.

Also, weiter, für ein einzelnes, wenn / sonst werde ich den ternären Operator verwenden. In anderen Fällen ein reguläres if / else if / else (oder Schalter)

Rodrigo Gómez
quelle
2

Ich mag Groovys Sonderfall des ternären Operators, genannt Elvis-Operator:?:

expr ?: default

Dieser Code wird als Ausdruck ausgewertet, wenn er nicht null ist, und als Standard, wenn dies der Fall ist. Technisch gesehen ist es kein ternärer Operator, aber es hängt definitiv damit zusammen und spart viel Zeit / Eingabe.

Steve Losh
quelle
Ja, ich liebe das auch - es ist ??in C #, dem Null-Koaleszenz-Operator: stackoverflow.com/questions/278703/…
Jarrod Dixon
2

Für einfache Aufgaben wie das Zuweisen eines unterschiedlichen Werts je nach Bedingung sind sie großartig. Ich würde sie nicht verwenden, wenn es je nach Bedingung längere Ausdrücke gibt.

Svet
quelle
2

So viele Antworten haben gesagt, es kommt darauf an . Ich finde, wenn der ternäre Vergleich bei einem schnellen Scan des Codes nicht sichtbar ist, sollte er nicht verwendet werden.

Als Nebenproblem könnte ich auch bemerken, dass seine Existenz tatsächlich eine Anomalie ist, da in C Vergleichstests eine Aussage sind. In Icon ist das ifKonstrukt (wie die meisten Icon) tatsächlich ein Ausdruck. So können Sie Dinge tun wie:

x[if y > 5 then 5 else y] := "Y" 

... was ich viel lesbarer finde als ein ternery Vergleichsoperator. :-)

Vor kurzem gab es eine Diskussion über die Möglichkeit, den ?:Operator zu Icon hinzuzufügen , aber mehrere Leute wiesen zutreffend darauf hin, dass es aufgrund des Weges absolut keine Notwendigkeit gabif .

Das heißt, wenn Sie dies in C (oder einer der anderen Sprachen mit dem Ternery-Operator) tun könnten, würden Sie den Ternery-Operator überhaupt nicht benötigen.

staticsan
quelle
2

Wenn Sie und Ihre Arbeitskollegen verstehen, was sie tun, und sie nicht in großen Gruppen erstellt werden, machen sie den Code meiner Meinung nach weniger komplex und leichter zu lesen, weil es einfach weniger Code gibt.

Ich denke, ternäre Operatoren erschweren das Verständnis von Code nur, wenn Sie mehr als 3 oder 4 in einer Zeile haben. Die meisten Menschen erinnern sich nicht daran, dass sie Vorrang haben, und wenn Sie einen Stapel davon haben, wird das Lesen des Codes zu einem Albtraum.

Alex
quelle