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?
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.
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ść:
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.
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.
Również w tym przypadku, jeśli conditiontak, boolmoż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:
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:
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.
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.
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.
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.
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ść):
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;
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.
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.
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.
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 .
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.
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).
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
Tylko kiedy:
$var = (simple > test ? simple_result_1 : simple_result_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).
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.
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.
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.
x = x if x else y
ale 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/ ... )Odpowiedzi:
Używaj go tylko do prostych wyrażeń :
Nie łącz ani nie zagnieżdżaj operatorów trójskładnikowych, ponieważ są one trudne do odczytania i mylące:
Ponadto, używając operatora trójargumentowego, rozważ formatowanie kodu w sposób poprawiający czytelność:
źródło
val x = if(true) 0 else 1
jest całkowicie legalneTo 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.
źródło
Uwielbiam je, zwłaszcza w językach bezpiecznych dla typów.
Nie rozumiem, jak to:
jest trudniejsze niż to:
Twierdzę, że operatory trójskładnikowe sprawiają, że wszystko jest mniej złożone i bardziej uporządkowane niż alternatywa.
źródło
const int count = ...;
if/else
te niepotrzebne szelki.condition
tak,bool
możesz po prostu zrobićint count = condition;
if/else
z nawiasami klamrowymi to sposób, w jaki większość programistów przepisuje trójskładnik ..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:
zamiast
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...end
ponieważ jest to również wyrażenie.(Chociaż, co prawda, w przypadku czegoś tak prostego mógłbym i tak użyć operatora trójskładnikowego).
źródło
Trójskładnikowy
?:
operator tylko funkcjonalny odpowiednik procesowegoif
konstrukcji. 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:Teraz porównaj to z tym:
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.
źródło
Tak naprawdę to kwestia stylu; podświadome zasady, którymi się kieruję, to:
foo = (bar > baz) ? true : false
, ale NIEfoo = (bar > baz && lotto && someArray.Contains(someValue)) ? true : false
<%= (foo) ? "Yes" : "No" %>
Naprawdę używaj go tylko do przydziału; nigdy nie płynie logika (więc nigdyLogika przepływu w trójskładniku sama w sobie jest kłamstwem, zignoruj ten ostatni punkt.(foo) ? FooIsTrue(foo) : FooIsALie(foo)
)Podoba mi się, ponieważ jest zwięzły i elegancki do prostych operacji przypisania.
źródło
foo = (bar > baz);
jest znacznie prostszereturn bar <= baz ? false ! lotto ? false : someArray.Contains(someValue )
Podobnie jak w przypadku wielu pytań opinii, odpowiedź jest nieuchronna: to zależy
Na przykład:
Myślę, że jest to dużo bardziej zwięzłe (i szybsze dla mnie do przeanalizowania) niż:
Jeśli twoje wyrażenie warunkowe jest złożone, operacja trójskładnikowa nie jest dobrym wyborem. Coś jak:
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:
Który będzie ustawiony
x
nay
założeniuy
nie jestNULL
. Dobry towar.źródło
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ść.
źródło
Miarą złożoności cyklicznej jest użycie
if
instrukcji 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.
źródło
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:
lub (dzięki asterite)
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.
źródło
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.
źródło
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:To pierwsze jest tylko przykładem i należy zastosować lepszą internacjonalizację i lokalizację liczby mnogiej!
źródło
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.
źródło
(Hack dnia)
Następnie możesz zrobić if-then-else jako wyrażenie:
źródło
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 ++:
W porównaniu do:
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:
Alternatywą jest:
Wystarczy, że w Pythonie (na przykład) taki idiom można było zobaczyć regularnie:
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.
źródło
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ść):
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:
lub nawet nieco skomplikowane rzeczy, takie jak:
źródło
reportedAge
jest przykładem, który wymaga trochę zastanowienia - prawdopodobnie dlatego, że jest to bardziej konkretny przypadek niż zastanawianie sięisThisYearALeapYear
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.
źródło
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ć:
To trochę rozwlekłe, ale uważam, że jest o wiele bardziej czytelne niż:
Lub:
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.
źródło
Lubię ich. Nie wiem dlaczego, ale czuję się bardzo fajnie, kiedy używam tego trójskładnikowego wyrażenia.
źródło
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.
źródło
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 ++).
źródło
Zwykle używam go do takich rzeczy:
źródło
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
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 .
źródło
Podoba mi się specjalny przypadek Groovy'ego z operatorem trójskładnikowym, zwanym operatorem Elvisa:?:
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.
źródło
??
w C #, null coalesce operator: stackoverflow.com/questions/278703/ ...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:
lub, żeby podać bardziej konkretny przykład:
Pamiętaj, że to JavaScript, więc takie rzeczy mogą nie być możliwe w innych językach (na szczęście).
źródło
Tylko kiedy:
KISS .
źródło
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).
źródło
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.
źródło
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.
źródło
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
if
konstrukt (jak większość ikon) jest rzeczywiście wyrazem. Możesz więc robić takie rzeczy, jak:... 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.
źródło