здрасти Днешният урок няма да е много дълъг, но със сигурност ще бъде полезен :) Ще говорим за така наречения троичен оператор . Тернарен означава „ съставен от три части “. Това е алтернатива на
if-else
израза за контролен поток, който вече сте срещали. Да дадем пример. Да предположим, че някой е решил да отиде на филм с рейтинг R (под 17 години се изисква придружаващ родител or възрастен настойник). Портиерът проверява възрастта му на вратата: ако е преминал проверката на възрастта, той има право да влезе; ако не, той се изпраща у дома. Нека декларираме Person
клас и проверим това с помощта на if-else
израз:
public class Person {
private int age;
public Person(int age) {
this.age = age;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public static void main(String[] args) {
Person person = new Person(22);
String usherResponse;
if (person.getAge() >= 18) {
usherResponse = "Everything is in order. Come in!";
} else {
usherResponse = "This film is not suitable for your age!";
}
System.out.println(usherResponse);
}
}
Конзолен изход:
"Everything is in order. Come in!"
Ако премахнем изхода от конзолата, нашата проверка изглежда така:
if (person.getAge() >= 18) {
usherResponse = "Everything is in order. Come in!";
} else {
usherResponse = "This film is not suitable for your age!";
}
Логиката тук е много проста: проверява се едно condition (възраст >= 18) Въз основа на резултата на променливата usherResponse
се присвоява един от два низа с отговора на разпоредителя. Такива ситуации („едно condition – два възможни изхода“) са изключително често срещани в програмирането. И затова е създаден троичният оператор. Можем да го използваме, за да опростим нашата проверка до един ред code:
public static void main(String[] args) {
Person person = new Person(22);
String usherResponse = (person.getAge() > 18) ? "Everything is in order. Come in!" : "This film is not suitable for your age!";
System.out.println(usherResponse);
}
Ето How работи този оператор. Нарича се троичен оператор, защото включва 3 компонента:
- Едно condition (
person.getAge() > 18
) - Два възможни изхода ( „Всичко е наред. Заповядайте!“ и „Този филм не е подходящ за вашата възраст!“ )
person.getAge() > 18 ?
„Повече от 18 години ли е този човек?“ След това записваме първата стойност . Тази стойност се използва, ако conditionто се оценява наtrue
:
String usherResponse = person.getAge() > 18 ? "Everything is in order. Come in!"
Възрастта на този човек повече от 18 ли е? Ако да, задайте usherResponse
променливата на "Всичко е наред. Влезте!" Следва :
символът " " и втората стойност . Тази стойност се използва, ако conditionто се оценява наfalse
:
String usherResponse = person.getAge() > 18 ? "Everything is in order. Come in!" : "This film is not suitable for your age!";
Възрастта на този човек повече от 18 ли е? Ако да, задайте usherResponse
променливата на "Всичко е наред. Влезте!" . Ако не, задайте usherResponse
променливата на "Този филм не е подходящ за вашата възраст!" Най-общо ето How изглежда логиката на троичния оператор. condition? резултат 1 : резултат 2 Между другото, скобите около conditionто не са задължителни: добавихме ги за по-голяма четливост. Работи и без тях:
public static void main(String[] args) {
Person person = new Person(22);
String usherResponse = person.getAge() > 18 ? "Everything is in order. Come in!" : "This film is not suitable for your age!";
System.out.println(usherResponse);
}
И така, Howво трябва да използвате? Изявление if-else
or троичен оператор? По отношение на производителността няма разлика. По-точно, може би има, но е незначително. Най-голямото внимание тук е четливостта на вашия code. Кодът, който пишете, трябва не само да работи правилно, но и да бъде лесен за четене . В крайна сметка може да е "наследен" от други програмисти, ваши колеги! Ако е трудно за разбиране, това ще усложни тяхната и вашата работа (те ще дотичат при вас за обяснения на всеки 5 minutesи). Общата препоръка е следната: ако conditionто е просто и лесно се проверява, можете да използвате троичния оператор без вреда. Това ви позволява да намалите количеството code и броя наif-else
твърдения (и може вече да има много от тях). Но ако conditionто е сложно и включва множество стъпки, по-добре е да използвате if-else
изявление. Например използването на троичен оператор би било лоша идея в този случай:
String usherResponse = (person.getAge() > 18 && (person.hasTicket() || person.hasCoupon()) && !person.hasChild()) ? "Come in!" : "You can't come in!";
Не е веднага ясно Howво се случва тук! Кодът стана много труден за четене. И всичко това заради сложното състояние:
- Ако някой е над 18 години, има билет (or безплатен пропуск) и няма малки деца, може да влезе.
- Ако дори една част от conditionто е невярна, тогава той не може.
if-else
. Да, нашият code ще бъде по-голям, но ще бъде много по-четим. И вашите колеги няма да се сблъскат с длан, ако наследят този code :) И накрая, мога да ви препоръчам нещо добро. По време на урока засегнахме четимостта на codeа. На тази тема е посветена превърналата се в класика книга на Робърт Мартин "Чист code". Той обединява най-добрите практики и препоръки за програмисти, които ще ви помогнат да пишете code, който е не само функционален, но и лесен за четене.
GO TO FULL VERSION