Trójskładnikowy czy nie trójskładnikowy? [Zamknięte]


188

Osobiście jestem zwolennikiem operatora trójskładnikowego: ()? :; Zdaję sobie sprawę, że ma swoje miejsce, ale spotkałem wielu programistów, którzy są całkowicie przeciwni jego używaniu, a także takich, którzy używają go zbyt często.

Co o tym myślisz? Jaki interesujący kod widziałeś przy jego użyciu?


8
Używaj go, gdy jest czysty, unikaj, gdy się myli. To wezwanie do sądu. Może uczynić kod bardziej czytelnym, ale tylko dla prostych wyrażeń. Próba używania go zawsze jest tak samo groźna, jak nieustanne unikanie go.
Abel

4
W rzeczywistości jest to operator warunkowy. Pytanie bliskie duplikatu to stackoverflow.com/questions/725973/… .
Daniel Daranas,

Czasami używałem, x = x if x else yale potem zapytałem o to i z pomocą innych zdałem sobie sprawę, że tak naprawdę redukuje się do x = x lub y ( stackoverflow.com/questions/18199381/self-referencing-ternary/ ... )
Niechlujny

Operator trójskładnikowy może być używany w miejscach, w których konstrukcja if..else nie może, na przykład w instrukcjach return, oraz jako argumenty funkcji. To samo można osiągnąć bez użycia trójskładnikowego, ale skutkuje to dłuższym kodem i większymi plikami wykonywalnymi.
Arif Burhan

Odpowiedzi:


246

Używaj go tylko do prostych wyrażeń :

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

Nie łącz ani nie zagnieżdżaj operatorów trójskładnikowych, ponieważ są one trudne do odczytania i mylące:

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

Ponadto, używając operatora trójargumentowego, rozważ formatowanie kodu w sposób poprawiający czytelność:

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

84
Całkowicie zgadzam się z kilkoma pierwszymi stwierdzeniami, ale całkowicie nie zgadzam się z twoim przykładem „lepszej czytelności”. Jeśli wybierasz się na wiele linii, dlaczego nie użyć po prostu instrukcji if?
Joe Phillips

3
tylko dlatego, że if else jest bardziej rozwlekłym dla prostych decyzji: int a = 0; if (b> 10) a = jakaś_wartość; else a = inna_wartość; Co wolisz?
marcospereira

45
@ d03boy: Ponieważ instrukcja-if jest po prostu instrukcją i nie będzie działać, gdy wszystko, czego chcesz, to wyrażenie.
falstro

2
@roe w niektórych językach, jeśli jest wyrażeniem (np. w Scali), więc val x = if(true) 0 else 1jest całkowicie legalne
om-nom-nom

5
Przykład @ om-nom-nom, który sprawiłby, że byłby on wyrażeniem if, a nie instrukcją if, i jest zasadniczo tym samym, co operator?: -.
falstro

143

To sprawia, że ​​debugowanie jest nieco trudniejsze, ponieważ nie można umieścić punktów przerwania w każdym z wyrażeń podrzędnych. Rzadko go używam.


47
To najlepszy argument przeciwko operatorowi trójskładnikowemu, jaki kiedykolwiek słyszałem. Nie kupuję argumentu „nieczytelny” (wydaje mi się, że ludzie są zbyt leniwi, by się do niego przyzwyczaić), ale w rzeczywistości ma on sens.
EpsilonVector

Jeśli robisz coś wewnątrz trójskładnika, który wymaga debugowania, prawdopodobnie jest używany nieprawidłowo. Ternaries powinny być do prostego IMO przypisania. Jeśli musisz przejść przez trójskładnik, a późniejsze dostrzeżenie wartości zadania nie wystarczy, trójskładnik NIE jest twoim rzeczywistym problemem. To złożoność operacji. W tym miejscu zrób to oświadczenie if.
Julian

80

Uwielbiam je, zwłaszcza w językach bezpiecznych dla typów.

Nie rozumiem, jak to:

int count = (condition) ? 1 : 0;

jest trudniejsze niż to:

int count;

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

Twierdzę, że operatory trójskładnikowe sprawiają, że wszystko jest mniej złożone i bardziej uporządkowane niż alternatywa.


6
Inicjalizacja trójskładnikowa jest jeszcze bardziej przydatna w D lub C ++, gdy zmienna jest stała. np. const int count = ...;
deft_code

Cóż, trochę błędnie przedstawiasz if/elsete niepotrzebne szelki.
bobobobo

1
Również w tym przypadku, jeśli conditiontak, bool możesz po prostu zrobić int count = condition;
bobobobo

1
@bobobobo to if/elsez nawiasami klamrowymi to sposób, w jaki większość programistów przepisuje trójskładnik ..
Andre Figueiredo

2
@bobobobo if / else bez nawiasów klamrowych prosi o kłopoty. Dodanie linii jest zbyt łatwe, ale zapomnij, że wtedy będą potrzebować nawiasów klamrowych, aby zrobić to, czego oczekują (wykonaj dodatkową linię jako część bloku): stackoverflow.com/a/381274/377225
George Marian

45

Jestem przykuty - zagnieżdżony, nie tak bardzo.

Zwykle używam ich częściej w C po prostu dlatego, że są instrukcjami if , które mają wartość, więc ograniczają niepotrzebne powtórzenia lub zmienne:

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

zamiast

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

Uważam, że w takich zadaniach jest mniej do refaktoryzacji i jest jaśniejszy.

Z drugiej strony, kiedy pracuję z rubinem, częściej używam, if...else...endponieważ jest to również wyrażenie.

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

(Chociaż, co prawda, w przypadku czegoś tak prostego mógłbym i tak użyć operatora trójskładnikowego).


40

Trójskładnikowy ?: operator tylko funkcjonalny odpowiednik procesowego ifkonstrukcji. Tak długo, jak nie używasz ?:wyrażeń zagnieżdżonych , argumenty za / przeciw reprezentacji funkcjonalnej dowolnej operacji mają tutaj zastosowanie. Ale zagnieżdżanie operacji trójskładnikowych może spowodować, że kod jest wręcz zagmatwany (ćwiczenie dla czytelnika: spróbuj napisać parser, który będzie obsługiwał zagnieżdżone trójskładnikowe warunkowe, a docenisz ich złożoność).

Ale jest wiele sytuacji, w których konserwatywne użycie ?: operatora może spowodować, że kod będzie w rzeczywistości łatwiejszy do odczytania niż w innym przypadku. Na przykład:

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

Teraz porównaj to z tym:

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

Ponieważ kod jest bardziej zwarty, występuje mniej szumu składniowego, a dzięki rozsądnemu użyciu operatora trójskładnikowego (to jest tylko w odniesieniu do właściwości reverseOrder ), wynik końcowy nie jest szczególnie zwięzły.


Nadal zalecałbym używanie pochwał na każdej konstrukcji typu if / then / else, która nie jest trójskładnikowa, więc w drugim przykładzie brakuje kilku elementów imho.
Kris

Tak, jest funkcjonalny. To jak mała funkcja, która ma pojedynczy argument logiczny i zwraca dowolny typ! Właściwie zgrabny operator.
bobobobo

24

Tak naprawdę to kwestia stylu; podświadome zasady, którymi się kieruję, to:

  • Oceniaj tylko 1 wyrażenie - tak foo = (bar > baz) ? true : false, ale NIEfoo = (bar > baz && lotto && someArray.Contains(someValue)) ? true : false
  • Jeśli używam go do logiki wyświetlania, np <%= (foo) ? "Yes" : "No" %>
  • Naprawdę używaj go tylko do przydziału; nigdy nie płynie logika (więc nigdy (foo) ? FooIsTrue(foo) : FooIsALie(foo)) Logika przepływu w trójskładniku sama w sobie jest kłamstwem, zignoruj ​​ten ostatni punkt.

Podoba mi się, ponieważ jest zwięzły i elegancki do prostych operacji przypisania.


W C # można go używać do sterowania przepływem, jeśli przypisujesz delegata z poziomu trójargumentowego, a następnie wywołujesz go później. Cóż, to rodzaj kontroli przepływu ...
Erik Forbes,

23
Twoje dwa pierwsze przykłady są naprawdę złe. Wyniki porównań są już wartościami logicznymi, więc operatory trójskładnikowe są bezużyteczne i tylko komplikują kod.
Trillian

1
@Trillian +1 Tak, powinienem był przejść z innym zadaniem. foo = (bar > baz);jest znacznie prostsze
Eric

W przypadku powrotu boolowskiego z kilkoma klauzulami, lubię rozbić wymagania na mniejsze bity przy użyciu trójskładnikowego warunku, tak jak podczas refaktoryzacji przy użyciu wczesnych zwrotów w celu uproszczenia kodu. return bar <= baz ? false ! lotto ? false : someArray.Contains(someValue )
daotoad

18

Podobnie jak w przypadku wielu pytań opinii, odpowiedź jest nieuchronna: to zależy

Na przykład:

return x ? "Yes" : "No";

Myślę, że jest to dużo bardziej zwięzłe (i szybsze dla mnie do przeanalizowania) niż:

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

Jeśli twoje wyrażenie warunkowe jest złożone, operacja trójskładnikowa nie jest dobrym wyborem. Coś jak:

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

nie jest dobrym kandydatem na operatora trójskładnikowego.

Nawiasem mówiąc, jeśli jesteś programistą C, GCC ma w rzeczywistości rozszerzenie, które pozwala wykluczyć część trójskładnikową jeśli-prawda, na przykład:

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

Który będzie ustawiony xna yzałożeniu ynie jest NULL. Dobry towar.


Naprawiono drobną składnię i problem gramatyczny, Sean :-) Brak y z ostatniego bitu kodu i „przypisz x do y” oznacza „y = x”, więc przechodzę do „ustaw x na y”.
paxdiablo

@Pax: Dzięki! Cofnąłem zmianę składni, ponieważ próbowałem wskazać, że z rozszerzeniami GCC nie potrzebujesz części trójskładnikowej, jeśli-prawda.
Sean Bright

Przepraszam, nie widziałem tego akapitu. Nie wiem jednak, że zgadzam się z tego rodzaju rzeczami, ponieważ pozwala to ludziom pisać kod, który nie będzie się kompilował za pomocą kompilatora zgodnego ze standardem ISO. Mimo to, gdy GCC jest ostatnim stojącym człowiekiem, to nie ma znaczenia :-)
paxdiablo

To na pewno voodoo ... A kto nie używa GCC? : D
Sean Bright

13

Moim zdaniem sensowne jest używanie operatora trójskładnikowego tylko w przypadkach, gdy potrzebne jest wyrażenie.

W innych przypadkach wydaje się, że operator trójskładnikowy zmniejsza przejrzystość.


problem polega na tym, że 99% języka, wyrażenie można zastąpić funkcją ... a ppl unikający operatora trójskładnikowego będzie nawet preferował to rozwiązanie.
PierreBdR

11

Miarą złożoności cyklicznej jest użycie ifinstrukcji lub operatora trójskładnikowego. Tak więc, biorąc pod uwagę tę miarę, odpowiedź brzmi nie , złożoność byłaby dokładnie taka sama jak poprzednio.

Dzięki innym miarom, takim jak czytelność, łatwość konserwacji i SUCHA (nie powtarzaj się), każdy wybór może okazać się lepszy od drugiego.


10

Używam go dość często w miejscach, w których jestem ograniczony do pracy w konstruktorze - na przykład w nowych konstrukcjach .NET 3.5 LINQ to XML - do definiowania wartości domyślnych, gdy opcjonalny parametr ma wartość null.

Wymyślony przykład:

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

lub (dzięki asterite)

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

Niezależnie od tego, czy używasz operatora trójskładnikowego, czy nie, ważne jest, aby upewnić się, że kod jest czytelny. Każda konstrukcja może stać się nieczytelna.


Lub ... var e = new XElement ("Something", new XElement ("value", param == null? "Default": param.toString ()));
asterite

9

Używam operatora trójskładnikowego, gdzie tylko mogę, chyba że sprawia, że ​​kod jest wyjątkowo trudny do odczytania, ale wtedy zwykle jest to tylko wskazówka, że ​​mój kod może wymagać trochę refaktoryzacji.

Zawsze mnie zastanawia, jak niektórzy ludzie myślą, że operator trójskładnikowy jest „ukrytą” funkcją lub jest nieco tajemniczy. To jedna z pierwszych rzeczy, których nauczyłem się, kiedy zaczynam programować w C i nie sądzę, żeby to w ogóle zmniejszało czytelność. To naturalna część języka.


2
Może powodować problemy z czytelnością, zwłaszcza gdy jest zagnieżdżona.
David Thornley

Myślę, że „ niezwykle trudne do odczytania” jest trochę zbyt pobłażliwe, ale ogólnie zgadzam się z tobą. Nie ma w tym nic trudnego ani mistycznego.
EpsilonVector

7

Zgadzam się z jmulder: nie należy go używać zamiast a if, ale ma swoje miejsce na wyrażenie zwrotne lub wewnątrz wyrażenia:

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

To pierwsze jest tylko przykładem i należy zastosować lepszą internacjonalizację i lokalizację liczby mnogiej!


6

Jeśli używasz operatora trójskładnikowego do prostego przypisania warunkowego, myślę, że jest w porządku. Widziałem to (ab) używane do kontrolowania przepływu programu nawet bez dokonywania przypisań i myślę, że należy tego unikać. W takich przypadkach użyj instrukcji if.


6

(Hack dnia)

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

Następnie możesz zrobić if-then-else jako wyrażenie:

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

1
to nie odpowiada na pytanie
Bruno Alexandre Rosa

5

Myślę, że operator trójskładnikowy powinien być używany w razie potrzeby. Jest to oczywiście bardzo subiektywny wybór, ale uważam, że proste wyrażenie (szczególnie jako wyrażenie zwrotne) jest znacznie jaśniejsze niż pełny test. Przykład w C / C ++:

return (a>0)?a:0;

W porównaniu do:

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

Masz również przypadek, w którym rozwiązanie znajduje się między operatorem trójskładnikowym a utworzeniem funkcji. Na przykład w Pythonie:

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

Alternatywą jest:

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

Wystarczy, że w Pythonie (na przykład) taki idiom można było zobaczyć regularnie:

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

ta linia wykorzystuje właściwości operatorów logicznych w Pythonie: są one leniwe i zwraca ostatnią obliczoną wartość, jeśli jest równa stanowi ostatecznemu.


5

Widziałem takie bestie jak (w rzeczywistości było znacznie gorzej, ponieważ była to data Validate i sprawdzałem również miesiąc i dzień, ale nie przeszkadzało mi to zapamiętać całość):

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

gdzie, po prostu, seria instrukcji „jeśli” byłaby lepsza (chociaż ta jest wciąż lepsza niż wersja makro, którą kiedyś widziałem).

Nie przeszkadzają mi takie małe rzeczy, jak:

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

lub nawet nieco skomplikowane rzeczy, takie jak:

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

Jak możesz powiedzieć serię wyodrębniania, jeśli stwierdzenia byłyby bardziej czytelne? Dobrze przeczytałem twoją „bestię” . reportedAgejest przykładem, który wymaga trochę zastanowienia - prawdopodobnie dlatego, że jest to bardziej konkretny przypadek niż zastanawianie sięisThisYearALeapYear
Axeman

4

Lubię używać operatora w kodzie debugowania do drukowania wartości błędów, więc nie muszę ich cały czas sprawdzać. Zwykle robię to w celu debugowania wydruków, które nie pozostaną po zakończeniu programowania.

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


Jak działa pierwszeństwo operatora / zwarcie w tym przypadku?
Peter Mortensen

4

Prawie nigdy nie używam operatora trójskładnikowego, ponieważ zawsze to robię używam, zawsze sprawia, że ​​myślę o wiele więcej niż później, kiedy próbuję go utrzymać.

Lubię unikać gadatliwości, ale kiedy znacznie ułatwi to odczytanie kodu, zdecyduję się na szczegółowość.

Rozważać:

String name = firstName;

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

name += " " + lastName;

To trochę rozwlekłe, ale uważam, że jest o wiele bardziej czytelne niż:

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

Lub:

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

Po prostu wydaje się, że kompresuje zbyt dużo informacji w zbyt małej przestrzeni, nie wyjaśniając, co się dzieje. Za każdym razem, gdy widziałem używany operator trójskładnikowy, zawsze znajdowałem alternatywę, która wydawała się znacznie łatwiejsza do odczytania ... z drugiej strony jest to niezwykle subiektywna opinia, więc jeśli ty i twoi koledzy uznacie trójskładnik za bardzo czytelny, idźcie na to.


1
To jednak nie jest dokładnie to samo. W drugim przykładzie kompresujesz wszystkie trzy instrukcje w jedną linię. To właśnie zmniejsza czytelność, a nie operator trójskładnikowy.
ilitirit

W porządku, zaktualizowałem, aby uwzględnić twój komentarz, ale nadal wydaje mi się, że jest on dla mnie zagracony ... ale znowu, to subiektywne ... Nie mówię, że trójskładnik jest nieczytelny, mówię, że nie jest dla mnie czytelny (99 % czasu)
Mike Stone

4

Lubię ich. Nie wiem dlaczego, ale czuję się bardzo fajnie, kiedy używam tego trójskładnikowego wyrażenia.


3

Operatorów trójskładnikowych traktuję bardzo podobnie jak GOTO. Mają swoje miejsce, ale są czymś, czego zwykle należy unikać, aby kod był łatwiejszy do zrozumienia.


3

Cóż, składnia tego jest okropna. Uważam, że funkcjonalne instrukcje if są bardzo przydatne i często sprawiają, że kod jest bardziej czytelny.

Sugerowałbym zrobienie makra, aby było bardziej czytelne, ale jestem pewien, że ktoś może wymyślić okropny przypadek skrajny (jak zawsze jest w C ++).


wiele implementacji i wariantów języka BASIC ma funkcję IF, która zastępuje operator trójskładnikowy. Widziałem wiele baz kodów z tym zdefiniowanym jako makro w C.
Sparr

Cóż, myślałem o funkcjonalnych językach programowania, ale tak.
Marcin

„Robiąc makro, aby było bardziej czytelne”, jesteś żartownisiem!
niXar

3

Zwykle używam go do takich rzeczy:

before:

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

after:

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

Oczywiście w większości języków nie potrzebujesz również części „== true” tej trójki.
Michael Haren

Zdaję sobie z tego sprawę, chociaż zwykle umieszczam to tylko po to, aby kod był bardziej czytelny, ponieważ kompilator powinien zoptymalizować go do tego samego, co bez == true i tak
KPexEA

w żadnym języku nie potrzebujesz "== true"
niXar

Trudno mi było zdecydować, czy głosować za, czy nie. Przykład jest fajny, ale == TRUE jest czymś, czego nie mogę znieść w kodzie innych osób.
Peter Perháč

3

Jak zauważyli inni, są dobre na krótkie, proste warunki. Szczególnie lubię je za wartości domyślne (takie jak || i lub użycie w JavaScript i Pythonie), np

int repCount = pRepCountIn ? *pRepCountIn : defaultRepCount;

Innym typowym zastosowaniem jest zainicjowanie odwołania w C ++. Ponieważ odwołania muszą być zadeklarowane i zainicjowane w tej samej instrukcji, nie można użyć instrukcji if .

SomeType& ref = pInput ? *pInput : somethingElse;

2
Niesamowite, że jest to pierwsza wzmianka o inicjalizacji odniesień, co jest jednym z niewielu miejsc, w których nie można użyć „if” zamiast?:. (Myślę, że to nie jest pytanie specyficzne dla C ++ ...) Są one również przydatne w listach inicjalizacyjnych konstruktorów, z tego samego powodu.
j_random_hacker,

2

Podoba mi się specjalny przypadek Groovy'ego z operatorem trójskładnikowym, zwanym operatorem Elvisa:?:

expr ?: default

Ten kod oblicza wyrażenie, jeśli nie jest null, i domyślnie, jeśli tak jest. Technicznie nie jest to tak naprawdę operator trójskładnikowy, ale zdecydowanie jest z nim powiązany i oszczędza dużo czasu / pisania.


Tak, to też mi się podoba - jest ??w C #, null coalesce operator: stackoverflow.com/questions/278703/ ...
Jarrod Dixon

2

Niedawno widziałem odmianę operatorów trójskładnikowych (cóż, w pewnym sensie), które sprawiają, że standardowy wariant "()?:" Wydaje się być wzorem jasności:

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

lub, żeby podać bardziej konkretny przykład:

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

Pamiętaj, że to JavaScript, więc takie rzeczy mogą nie być możliwe w innych językach (na szczęście).


1
wow, to okropne! wyobraź sobie zagnieżdżanie kilku z nich razem! Jedyną niewyraźnie użyteczną rzeczą, jaką widzę, jest funkcja, która zwraca 2-elementową tablicę: var Name = getNames () [Gender == 'm']; ... ale to jeszcze MNIEJ czytelne!
nickf


2

W prostych przypadkach lubię go używać. W rzeczywistości znacznie łatwiej jest czytać / kodować, na przykład jako parametry funkcji lub podobnych rzeczy. Również, aby uniknąć nowej linii, którą lubię trzymać ze wszystkimi moimi if / else.

Zagnieżdżanie go byłoby wielkim nie-nie w mojej książce.

Tak więc, wznawiając, dla pojedynczego if / else użyję operatora trójskładnikowego. W innych przypadkach zwykłe if / else if / else (lub switch).


2

W przypadku prostych zadań, takich jak przypisywanie różnych wartości w zależności od warunku, są świetne. Nie użyłbym ich jednak, gdy istnieją dłuższe wyrażenia w zależności od warunku.


2

Jeśli ty i twoi współpracownicy rozumiecie, co robią, i nie są tworzeni w dużych grupach, myślę, że dzięki temu kod jest mniej złożony i łatwiejszy do odczytania, ponieważ jest po prostu mniej kodu.

Myślę, że operatory trójskładnikowe sprawiają, że kod jest trudniejszy do zrozumienia tylko wtedy, gdy masz więcej niż trzy lub foyr w jednym wierszu. Większość ludzi nie pamięta, że ​​mają właściwe pierwszeństwo, a kiedy masz ich stos, czytanie kodu staje się koszmarem.


2

Jak mówi wiele odpowiedzi, to zależy . Uważam, że jeśli porównanie trójskładnikowe nie jest widoczne w szybkim skanowaniu kodu, to nie powinno być używane.

Na marginesie mogę również zauważyć, że samo jego istnienie jest właściwie trochę anomalią, ponieważ w C testowanie porównawcze jest stwierdzeniem. W Icon The ifkonstrukt (jak większość ikon) jest rzeczywiście wyrazem. Możesz więc robić takie rzeczy, jak:

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

... który uważam za znacznie bardziej czytelny niż trójskładnikowy operator porównania. :-)

Niedawno dyskutowano o możliwości dodania ?:operatora do Icon, ale kilka osób słusznie wskazało, że absolutnie nie ma takiej potrzeby ze względu na sposóbif działania .

Co oznacza, że ​​gdybyś mógł to zrobić w C (lub w jakimkolwiek innym języku, który ma operator trójskładnikowy), to w rzeczywistości nie potrzebowałbyś operatora trójskładnikowego.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.