Cześć! Dzisiejszy wykład nie będzie bardzo długi, ale na pewno przydatny :) Porozmawiamy o tzw. operatorze trójskładnikowym . „Trójskładnikowy” oznacza „potrójny”. Jest to alternatywa dla operatora warunkowego
if-else
, który już znasz. Podajmy przykład. Załóżmy, że ktoś decyduje się pójść do kina na film z oceną 18+. Strażnik przy wejściu sprawdza jego wiek: jeśli spełnia wymagany wiek, wpuszcza go na salę, jeśli nie, odsyła go do domu. Stwórzmy klasę Man
i sprawdźmy ją za pomocą if-else
:
public class Man {
private int age;
public Man(int age) {
this.age = age;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public static void main(String[] args) {
Man man = new Man(22);
String securityAnswer;
if (man.getAge() >= 18) {
securityAnswer = – Wszystko w porządku, wejdź!;
} else {
securityAnswer = "Ten film nie jest odpowiedni dla twojego wieku!";
}
System.out.println(securityAnswer);
}
}
Wyjście konsoli:
"Все в порядке, проходите!"
Jeśli usuniemy dane wyjściowe do konsoli, nasz test będzie wyglądał następująco:
if (man.getAge() >= 18) {
securityAnswer = – Wszystko w porządku, wejdź!;
} else {
securityAnswer = "Ten film nie jest odpowiedni dla twojego wieku!";
}
Tutaj faktycznie działa prosta logika: sprawdzany jest jeden warunek (wiek >= 18). W zależności od tego securityAnswer
do zmiennej przypisywany jest jeden z dwóch ciągów znaków z odpowiedzią strażnika. Takie sytuacje „jeden warunek – dwa możliwe wyniki” zdarzają się bardzo często w programowaniu. Dlatego też stworzono dla nich ten sam operator trójskładnikowy. Dzięki niemu możemy uprościć naszą weryfikację do jednej linijki kodu:
public static void main(String[] args) {
Man man = new Man(22);
String securityAnswer = (man.getAge() >= 18) ? – Wszystko w porządku, wejdź! : "Ten film nie jest odpowiedni dla twojego wieku!";
System.out.println(securityAnswer);
}
Tak wygląda praca tego operatora. Nazywa się go potrójnym (potrójnym), ponieważ w jego pracy biorą udział 3 elementy:
- Jeden warunek (
man.getAge() >= 18
) - Dwa możliwe wyniki ( „W porządku, kontynuuj!” i „Ten film nie jest odpowiedni dla twojego wieku!” )
man.getAge() >= 18 ?
„Czy wiek danej osoby jest większy lub równy 18 lat?” Poniżej znajduje się pierwszy wynik. Uruchamia się, jeśli warunek powróci true
, to znaczy jest prawdziwy:
String securityAnswer = man.getAge() >= 18 ? – Wszystko w porządku, wejdź!
Czy wiek danej osoby jest większy lub równy 18 lat? Jeśli tak, przypisz zmiennej securityAnswer
wartość „Wszystko w porządku, proszę wejść!” . Po tym następuje :
operator „ ”, po którym zapisywany jest drugi wynik. Uruchamia się, jeśli warunek powróci false
, to znaczy jest fałszywy:
String securityAnswer = man.getAge() >= 18 ? – Wszystko w porządku, wejdź! : "Ten film nie jest odpowiedni dla twojego wieku!";
Czy wiek danej osoby jest większy lub równy 18 lat? Jeśli tak, przypisz zmiennej securityAnswer
wartość „Wszystko w porządku, proszę wejść!” . Jeżeli nie, przypisz zmiennej securityAnswer
wartość „Ten film nie jest odpowiedni dla Twojego wieku!” Tak wygląda ogólna logika operatora trójskładnikowego. stan : schorzenie ? wynik 1 : wynik 2 Nawiasem mówiąc, nie ma potrzeby umieszczania warunku w nawiasach: zrobiliśmy to dla większej czytelności. Obejdzie się bez nich:
public static void main(String[] args) {
Man man = new Man(22);
String securityAnswer = man.getAge() >= 18 ? – Wszystko w porządku, wejdź! : "Ten film nie jest odpowiedni dla twojego wieku!";
System.out.println(securityAnswer);
}
Czego powinieneś użyć: if-else
, lub operatora trójskładnikowego? Jeśli chodzi o wydajność, nie ma dużej różnicy. Dokładniej, może istnieć, ale jest nieistotny. Tutaj pytanie dotyczy raczej czytelności twojego kodu. W programowaniu jest to niezwykle ważne: pisany przez Ciebie kod musi nie tylko działać poprawnie, ale także być łatwy do odczytania. W końcu można go „odziedziczyć” innym programistom, Twoim współpracownikom! A jeśli będzie to trudne do zrozumienia, skomplikuje to zarówno ich, jak i Twoją pracę – będą biegać do Ciebie po wyjaśnienia co 5 minut. Ogólne zalecenie może brzmieć tak: jeśli warunek jest prosty i łatwy do sprawdzenia, możesz bez szkody używać operatora trójskładnikowego. W ten sposób zmniejszysz ilość kodu i liczbę kontroli if-else
, których może być już dużo. Jeśli jednak stan jest złożony i wieloetapowy, lepiej zastosować if-else
. Na przykład w tym przypadku złym pomysłem byłoby użycie operatora trójskładnikowego:
String securityAnswer = (man.getAge() >= 18 && (man.hasTicket() || man.hasCoupon()) && !man.hasChild()) ? "Wejdź!" : "Nie możesz przejść!";
Więc nie od razu zrozumiesz, co się tutaj dzieje! Kod stał się bardzo trudny do odczytania. A wszystko przez trudną sytuację:
- Jeżeli osoba ma ukończone 18 lat + posiada bilet (lub posiada kupon na bezpłatne wejście) + nie ma ze sobą małych dzieci - wówczas może przejść.
- Jeśli przynajmniej jedna część warunku zwróci wartość false, oznacza to, że nie jest to możliwe.
if-else
. Tak, nasz kod byłby większy, ale byłby wielokrotnie bardziej czytelny. I nikt z Twoich kolegów nie będzie się trzymał za głowę, jeśli odziedziczy taki kod :) Na koniec mogę polecić Ci książkę. Na wykładzie poruszyliśmy temat czytelności kodu. Jej dedykowana jest klasyczna książka „Czysty kod” Roberta Martina. Zawiera najlepsze praktyki i rekomendacje dla programistów, które pozwolą Ci napisać nie tylko działający, ale i łatwy do odczytania kod. Recenzja tej książki znajduje się na JavaRush.
GO TO FULL VERSION