Kiedyś w pracy dyskutowaliśmy o stosowaniu operatora warunkowego (conditional ternary operator) ?:
oraz instrukcji if...else
. I właśnie wpadłam w internetach na kod, w którym były one używane wymiennie. To zmusiło mnie trochę do tego, aby poruszyć ten temat na blogu.
Operator warunkowy (Conditional ternary operator)
condition ? exprTrue : exprFalse
Często ten operator jest wykorzystywany do skracania instrukcji if...else
. Powyższy kod można „przetłumaczyć” na:
if (condition) {
exprTrue
} else {
exprFalse
}
Na pierwszy rzut oka skrót za pomocą operatora wydaje się super sprawą. Czy aby na pewno?
Operator ?:
służy do przypisywania lub zwracania wartości, dlatego używamy go z returnami. Nie służy do kontrolowania flow.
Operator ?:
możemy stosować wtedy, kiedy zwracamy jakąś wartość lub przypisujemy ją do zmiennej.
Dla całej reszty innych przypadków – nie.
Dlaczego?
- Bo tak mówi definicja operatora
?:
- Nie każdy tak dobrze rozumie kod, jak developer, który go pisze. Łatwo jest patrzeć na proste przykłady, jednak w kodzie złożonego projektu zrozumienie „co autor miał na myśli” może być skomplikowanym procesem. A jak sami dobrze wiecie – w realnym świecie dosyć często trzeba rozkminiać obcy kod. Łatając bugi, robiąc code review, zwyczajnie komuś pomagając, i tak dalej…
- Kontrolując flow aplikacji często trzeba kontrolować wiele warunków. Jeśli decydujesz się na używanie operatora
?:
w tym przypadku, musisz zauważyć, że ta praktyka prowadzi do zagnieżdżeń i nieczytelnego kodu. - Jeśli chcesz korzystać z operatora
?:
w kontroli aplikacji tylko dla prostych warunków, a do złożonych już nie – to z kolei prowadzi do niespójnego kodu.