Frage

Ich bin persönlich ein Verfechter des ternären Operators: ()? :; Ich erkennen, dass es seinen Platz hat, aber ich habe über viele Programmierer kommen, die völlig gegen jemals mit ihm sind, und einige, die es oft zu verwenden.

Was sind Ihre Gefühle auf sie? Welche interessanten Code haben Sie es gesehen mit?

War es hilfreich?

Lösung

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

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

Ketten Sie nicht oder Nest ternäre Operatoren, wie es schwer zu lesen und verwirrend:

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

Darüber hinaus, wenn ternären Operator verwenden, sollten Sie den Code in einer Weise, die Formatierung, die Lesbarkeit zu verbessern:

int a = (b > 10) ? some_value                 
                 : another_value;

Andere Tipps

Es macht das Debuggen etwas schwieriger, da Sie keine Haltepunkte auf jedem der Unterausdrücke platzieren können. Ich benutze es selten.

Ich liebe sie, vor allem in typsicheren Sprachen.

Ich sehe nicht, wie folgt aus:

int count = (condition) ? 1 : 0;

ist noch härter als das:

int count;

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

Bearbeiten -

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

Chained Ich bin gut mit -. Verschachtelten, nicht so sehr

Ich neige dazu, sie einfach in C mehr zu verwenden, b / c sie eine if-Anweisung sind, der Wert hat, so schneidet sie auf unnötige Wiederholungen oder Variablen:

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

statt

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

In Zuweisungen wie diese, ich finde es ist weniger zu Refactoring und klarer.

Wenn ich in Ruby auf der anderen Seite arbeite, bin ich eher if...else...end zu verwenden, weil es ein Ausdruck ist zu.

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

(obwohl zugegebenermaßen etwas dieses einfache, ich könnte nur den ternären Operator verwenden sowieso).

Der ternäre ?: Operator ist lediglich ein funktionelles Äquivalent der prozeduralen if konstruieren. Also, solange Sie keine verschachtelten ?: Ausdrücke verwenden, die Argumente für / gegen die funktionale Darstellung eines Betriebs gilt auch hier. Aber Verschachtelung ternäre Operationen können in Code zur Folge hat, die geradezu verwirrend. (Übung für den Leser: versuchen, einen Parser zu schreiben, die verschachtelten ternären conditionals behandelt und Sie werden erkennen, ihre Komplexität)

Aber es gibt viele Situationen, in denen konservative Nutzung des ?: Operators im Code zur Folge haben kann, dass tatsächlich ist leichter als sonst zu lesen. Zum Beispiel:

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;              
}

Jetzt vergleichen Sie das mit diesem:

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

Wie der Code ist kompakter ist es weniger syntaktische Rauschen und durch den ternären Operator umsichtig verwenden (dh nur im Zusammenhang mit der Folgeumgekehrt Eigenschaft) das Endergebnis ist nicht besonders kurz und bündig.

Es ist eine Frage des Stils, wirklich; die unbewussten Regeln Ich neige dazu, zu folgen, sind:

  • bewerten Nur 1 Ausdruck - so foo = (bar > baz) ? true : false, aber nicht foo = (bar > baz && lotto && someArray.Contains(someValue)) ? true : false
  • Wenn ich es für Anzeigelogik bin mit, z.B. <%= (foo) ? "Yes" : "No" %>
  • Nur es wirklich für die Zuordnung verwenden; nie Logik fließen (so nie (foo) ? FooIsTrue(foo) : FooIsALie(foo)) Ablauflogik in dreiteiligen selbst eine Lüge, ignorieren, dass letzten Punkt.

Ich mag es, weil es präzise und elegant für die einfache Zuordnung Operationen ist.

Wie so viele Meinung Fragen, die Antwort ist unvermeidlich: es hängt

Für so etwas wie:

return x ? "Yes" : "No";

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

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

Nun, wenn Ihr bedingter Ausdruck komplex ist, dann ist der ternäre Betrieb ist keine gute Wahl. So etwas wie:

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

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

Als Nebenwirkung, wenn Sie ein C-Programmierer sind, GCC hat eigentlich eine Erweiterung , dass Sie das, wenn wahre Teil des ternären, wie dies ausschließen können:

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

Welche x gesetzt werden y y unter der Annahme nicht NULL ist. Good stuff.

In meinem Kopf, macht es nur Sinn, den ternären Operator in Fällen zu verwenden, wo ein Ausdruck benötigt wird.

In anderen Fällen scheint es, wie der ternäre Operator Klarheit ab.

Durch die Maßnahme zyklomatische Komplexität , die Verwendung von if Aussagen oder der ternäre Operator ist gleichwertig . Also durch diese Maßnahme ist die Antwort Nein , würde die Komplexität genau die gleiche wie zuvor.

Durch andere Maßnahmen wie Lesbarkeit, Wartbarkeit und DRY (Einmalige Repeat-Yourself), entweder Wahl erweist besser als die andere.

Ich benutze es ziemlich oft an Orten, wo ich erzwungener bin in einem Konstruktor arbeiten - zum Beispiel der neue .NET 3.5 LINQ to XML-Konstrukte -. Standardwert zu definieren, wenn ein optionaler Parameter ist null

konstruiertes Beispiel:

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

oder (dank Asterite)

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

Egal, ob Sie den ternären Operator verwenden oder nicht, sicherstellen, dass Ihr Code lesbar ist, ist die wichtige Sache. Jedes Konstrukt kann unlesbar gemacht werden.

Ich verwende den ternären Operator, wo immer ich kann, es sei denn, es der Code extrem schwer zu lesen macht, aber dann in der Regel das ist nur ein Hinweis, dass mein Code ein wenig Refactoring verwenden könnte.

Es verwirrt mich immer, wie einige Leute denken, der ternäre Operator eine „versteckte“ Funktion ist oder ist etwas mysteriös. Es ist eines der ersten Dinge, die ich gelernt, wenn ich Programmierung in C beginnen, und ich glaube nicht, dass die Lesbarkeit bei allen abnimmt. Es ist ein natürlicher Bestandteil der Sprache.

Ich bin mit jmulder: es sollte nicht anstelle einem if verwendet werden, aber es hat seinen Platz für die Rückkehr Ausdruck oder in einem Ausdruck:

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

Das erstere ist nur ein Beispiel, eine bessere i18n Unterstützung von mehreren verwendet werden sollte!

(Hack des Tages)

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

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

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

Wenn Sie den ternären Operator für eine einfache bedingte Zuweisung verwenden ich denke, es ist in Ordnung. Ich habe es (ab) gesehen verwendeten Programmfluss zu steuern, ohne auch nur einen Auftrag zu machen, und ich denke, dass vermieden werden sollte. Verwenden Sie eine if-Anweisung in diesen Fällen.

Ich denke, der ternäre Operator verwendet werden soll, wenn nötig. Es ist natürlich eine sehr subjektive Auswahl, aber ich finde, dass ein einfacher Ausdruck (speziell als Rück Ausdruck) ist viel klarer als eine vollständige Prüfung. Beispiel in C / C ++:

return (a>0)?a:0;

Im Vergleich zu:

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

Sie haben auch den Fall, wo die Lösung zwischen dem ternären Operator ist und eine Funktion zu schaffen. 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 ist notwendig, genug, dass in Python (als Beispiel), wie ein Idiom regelmäßig zu sehen:

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

Diese Zeile verwendet Eigenschaften der logischen Operatoren in Python. Sie sind faul und gibt den letzten Wert berechnet, wenn es gleich den Endzustand ist

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

Ich habe solche Tiere gesehen wie (es war eigentlich viel schlimmer, da es isValidDate und geprüft Monat und Tag auch war, aber ich konnte nicht gestört werden versuchen, die ganze Sache zu erinnern):

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

Dabei gilt, klar, eine Reihe von if-Anweisungen wäre besser gewesen (obwohl dieser ist immer noch besser als die Makro-Version einmal sah ich).

Ich habe nichts dagegen es für kleine Dinge wie:

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

oder sogar etwas heikle Dinge wie:

printf ("Deleted %d file%s\n", n, (n == 1) ? "" : "s");

Ich mag den Operator im Debug-Code mit Fehlerwerte drucken, damit ich sie nicht die ganze Zeit schauen müssen auf. Normalerweise mache ich das für Debug-Druck, die nicht gehen zu bleiben, wenn ich fertig bin zu entwickeln.

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");
}

ich so gut wie nie den ternären Operator verwenden, weil, wenn ich es verwenden, es macht mich immer viel mehr denken, als ich später, wenn ich versuche, es zu halten.

Ich mag Ausführlichkeit zu vermeiden, aber wenn es den Code viel leichter zu holen macht, werde ich für die Ausführlichkeit gehen.

Bedenken Sie:

String name = firstName;

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

name += " " + lastName;

Nun, das ist ein bisschen ausführlicher, aber ich finde es viel besser lesbar als:

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

oder:

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

Es scheint einfach zu viel Informationen in zu wenig Platz zu komprimieren, ohne deutlich zu machen, was los ist. Jedesmal, wenn ich sehe ternärer Operator verwendet, ich habe immer eine Alternative, die viel einfacher schien zu lesen ... dann wieder, das ist eine sehr subjektive Meinung, so dass, wenn Sie und Ihre Kollegen finden ternäre sehr gut lesbar, geht für sie.

Nun, die Syntax ist es schrecklich. Ich finde funktionelle ifs sehr nützlich, und oft macht Code besser lesbar.

Ich würde vorschlagen, ein Makro zu machen, um es besser lesbar zu machen, aber ich bin sicher, dass jemand mit einem schrecklichen Rande Fall kommen kann (da es immer mit CPP ist).

Nur wenn:

$ var = (simple> Test simple_result_1: simple_result_2);

KISS.

Ich verwenden in der Regel in Dinge wie diese:

before:

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

after:

    drawtext(x,y,isheader==true?WHITE:BLUE,string);

Wie andere haben darauf hingewiesen, sie sind nett für kurze, einfache Bedingungen. Besonders gut gefällt mir, sie für ihre Vorgaben (Art wie die || und oder Verwendung in JavaScript und Python), z.

int repCount = pRepCountIn ? *pRepCountIn : defaultRepCount;

Eine weitere gebräuchliche Anwendung ist eine Referenz in C ++ zu initialisieren. Da Referenzen in derselben Anweisung deklariert werden und initialisiert haben, können Sie nicht eine if-Anweisung verwenden.

SomeType& ref = pInput ? *pInput : somethingElse;

Ich behandle ternäre Operatoren viel wie GOTO. Sie haben ihren Platz, aber sie sind etwas, was Sie in der Regel zu vermeiden, sollte der Code leichter verständlich zu machen.

Vor kurzem sehe ich eine Variation ternäre Operatoren (na ja, eine Art), die den Standard „(?):“ Make-Variante scheint ein Muster an Klarheit zu sein:

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

oder ein konkretes Beispiel zu geben:

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

Wohlgemerkt, dies ist Javascript, so Dinge wie, dass sie nicht in anderen Sprachen möglich sein könnten (zum Glück).

Für eine einfache, wenn Fälle Ich mag es zu benutzen. Eigentlich ist es viel einfacher zu lesen / code zum Beispiel als Parameter für Funktionen oder solchen Sachen. Auch die neue Linie zu vermeiden, ich behalten möchte mit all meiner if / else.

Neseting wäre es ein großer NO-NO in meinem Buch sein.

Also, wieder aufzunehmen, für eine einzelne if / else werde ich den ternären Operator verwenden. In anderen Fällen regelmäßig ein if / else if / else (oder Schalter)

Ich mag Groovy Spezialfall des ternären Operator, der Elvis Operator genannt:?:

expr ?: default

Dieser Code ausgewertet expr, wenn es nicht null ist, und Standard, wenn es ist. Technisch gesehen ist es nicht wirklich ein ternärer Operator, aber es ist auf jeden Fall mit sich bringen und spart viel Zeit / Eingabe.

Für einfache Aufgaben wie einen anderen Wert zuweisen in Abhängigkeit von einer Bedingung, dass sie groß sind. Ich würde sie nicht verwenden, wenn es längere Ausdrücke unter der Bedingung tho abhängig.

Eine so viele Antworten gesagt haben, es hängt . Ich finde, dass, wenn der ternäre Vergleich in einem schnellen Scan auf den Code nicht sichtbar ist, dann sollte es nicht verwendet werden.

Als Neben Problem, könnte ich auch zur Kenntnis, dass seine Existenz ist eigentlich ein bisschen ein anomoly aufgrund der Tatsache, dass in C, Vergleichstests eine Aussage ist. In Icon ist das if Konstrukt (wie die meisten von Icon) tatsächlich ein Ausdruck. So was Sie tun können Dinge wie:

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

... die ich viel besser lesbar als ein ternery Vergleichsoperator finden. : -)

Es gab eine Diskussion vor kurzem über die Möglichkeit, die ?: Betreiber des Hinzufügens Icon, aber einige Leute zu Recht darauf hingewiesen, dass es absolut wegen der Art und Weise if Arbeiten nicht notwendig war.

Was bedeutet, dass, wenn Sie, dass in C (oder eine der anderen Sprachen, die die ternery Betreiber haben) tun könnten, dann würden Sie nicht, in der Tat, müssen die ternery Betreiber überhaupt.

Wenn Sie und Ihre Kollegen verstehen, was sie tun, und sie sind nicht in massiven Gruppen erstellt Ich denke, sie machen den Code weniger komplex und leichter zu lesen, weil es einfach ist weniger Code.

Das einzige Mal, denke ich, ternäre Operatoren machen Code schwerer zu verstehen ist, wenn Sie mehr als 3 oder 4 in einer Zeile haben. Die meisten Leute mich nicht erinnern, dass sie Recht Based Vorrang sind und wenn Sie einen Stapel von ihnen macht es den Code ein Alptraum zu lesen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top