Вітання! Сьогоднішня лекція буде не дуже великою, але абсолютно точно корисною :) Ми поговоримо про так званий тернарний оператор . "Тернарний" у перекладі означає "потрійний". Це альтернатива умовному оператору
if-else
, який тобі вже знайомий. Наведемо приклад. Припустимо, якась людина вирішила піти у кіно на фільм із рейтингом 18+. Охоронець перевіряє його вік на вході: якщо він проходить за віком – дозволяє пройти до зали, якщо ні – відправляє додому. Створимо клас Man
і перевіримо це за допомогою 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 = "Все гаразд, проходьте!";
} else {
securityAnswer = "Цей фільм не підходить для вашого віку!";
}
System.out.println(securityAnswer);
}
}
Виведення в консоль:
"Все в порядке, проходите!"
Якщо вибрати висновок у консоль, наша перевірка виглядає так:
if (man.getAge() >= 18) {
securityAnswer = "Все гаразд, проходьте!";
} else {
securityAnswer = "Цей фільм не підходить для вашого віку!";
}
Тут, по суті, працює проста логіка: перевіряється одна умова (вік = 18). Залежно від цього змінну securityAnswer
присвоюється один із двох рядків з відповіддю охоронця. Такі ситуації, "одна умова - два можливі результати", зустрічаються в програмуванні дуже часто. Тому для них створабо цей тернарний оператор. З його допомогою ми можемо спростити нашу перевірку до одного рядка коду:
public static void main(String[] args) {
Man man = new Man(22);
String securityAnswer = (man.getAge() >= 18) ? "Все гаразд, проходьте!" : "Цей фільм не підходить для вашого віку!";
System.out.println(securityAnswer);
}
Так і виглядає робота цього оператора. Тернарним (потрійним) його називають тому, що в його роботі беруть участь 3 компоненти:
- Одна умова (
man.getAge() >= 18
) - Два можливі результати ( "Все в порядку, проходьте!" і "Цей фільм не підходить для вашого віку!" )
man.getAge() >= 18 ?
"Вік людини більше або дорівнює 18?" Далі слідує перший результат. Він спрацьовує у разі, якщо умова повертає true
, тобто є істинною:
String securityAnswer = man.getAge() >= 18 ? "Все гаразд, проходьте!"
Вік людини більше чи дорівнює 18? Якщо так - присвоїти змінній securityAnswer
значення "Все в порядку, проходьте!" . Далі слідує оператор “ :
”, після якого записується другий результат. Він спрацьовує у разі, якщо умова повертає false
, тобто є хибним:
String securityAnswer = man.getAge() >= 18 ? "Все гаразд, проходьте!" : "Цей фільм не підходить для вашого віку!";
Вік людини більше чи дорівнює 18? Якщо так - присвоїти змінній securityAnswer
значення "Все в порядку, проходьте!" . Якщо ні - присвоїти змінної securityAnswer
значення "Цей фільм не підходить для вашого віку!" Отак і виглядає загальна логіка тернарного оператора. умова? результат 1: результат 2 До речі, дужки навколо умови ставити не обов'язково: ми зробабо це для більшої читальності. Спрацює і без них:
public static void main(String[] args) {
Man man = new Man(22);
String securityAnswer = man.getAge() >= 18 ? "Все гаразд, проходьте!" : "Цей фільм не підходить для вашого віку!";
System.out.println(securityAnswer);
}
Що ж використовувати: if-else
, або тернарний оператор? З погляду продуктивності особливої різниці немає. Точніше, може вона є, але незначна. Тут питання стосується швидше читання твого коду. Він дуже важливий у програмуванні: код, який ти пишеш, має не тільки коректно працювати, а й легко читатись. Адже він може перейти “у спадок” до інших програмістів, твоїх колег! І якщо він буде важким для розуміння, це ускладнить і їхню роботу, і твою – саме до тебе вони бігатимуть за поясненнями кожні 5 хвабон. Загальна рекомендація може звучати так: якщо умова проста та легко перевіряється, можна без шкоди використовувати тернарний оператор. Таким чином ти скоротиш обсяг коду та кількість перевірокif-else
, яких там і так може бути чимало. А от якщо умова є складною та багатоступінчастою — краще використовувати if-else
. Наприклад, у цьому випадку використовувати тернарний оператор буде поганою ідеєю:
String securityAnswer = (man.getAge() >= 18 && (man.hasTicket() || man.hasCoupon()) && !man.hasChild()) ? "Проходьте!" : "Ви не можете пройти!";
Так і не зрозумієш, що тут відбувається! Код став дуже складним для читання. А все через складні умови:
- Якщо людині більше або дорівнює 18 років + у неї є квиток (або має купон на безкоштовне відвідування) + з нею немає маленьких дітей - тоді вона може пройти.
- Якщо хоч одна з частин умови повертає false — тоді не може.
if-else
. Так, наш код став би більшим у розмірах, але він був би в рази більш читаним. І ніхто з колег не схопиться за голову, якщо такий код дістанеться йому у спадок :) Насамкінець можу порекомендувати тобі книгу. Ми торкнулися лекції теми читання коду. Їй присвячена книга "Чистий код" Роберта Мартіна, що стала класикою. У ній зібрані кращі практики та рекомендації для програмістів, які дозволять тобі писати не тільки працюючий, але й код, що легко читається. Огляд цієї книги є JavaRush.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ