Hei! Dagens leksjon blir ikke veldig lang, men den vil definitivt være nyttig :) Vi skal snakke om den såkalte ternære operatøren . Ternær operatør - 1Ternær betyr " sammensatt av tre deler ". Det er et alternativ til if-elsekontrollflyterklæringen som du allerede har møtt. La oss gi et eksempel. Anta at noen bestemte seg for å gå til en R-vurdert film (under 17 krever en ledsagende forelder eller voksen foresatt). Vaktmesteren sjekker alderen sin ved døren: hvis han bestod alderskontrollen, får han gå inn; hvis ikke blir han sendt hjem. La oss erklære en Personklasse og sjekke dette ved å bruke en if-elseuttalelse:

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);

   }
}
Konsoll utgang:

"Everything is in order. Come in!"
Hvis vi fjerner konsollutgangen, ser sjekken vår slik ut:

if (person.getAge() >= 18) {
           usherResponse = "Everything is in order. Come in!";
       } else {
           usherResponse = "This film is not suitable for your age!";
       }
Logikken er veldig enkel her: en betingelse kontrolleres (alder >= 18) Basert på resultatet usherResponsetildeles variabelen en av to strenger med vaktmesterens respons. Slike situasjoner ("én tilstand - to mulige utfall") er ekstremt vanlige i programmering. Og det er derfor den ternære operatøren ble opprettet. Vi kan bruke den til å forenkle sjekken vår til en enkelt kodelinje:

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);

}
Slik fungerer denne operatøren. Det kalles den ternære operatøren, fordi den involverer 3 komponenter:
  • Én betingelse ( person.getAge() > 18)
  • To mulige utfall ( "Alt er i orden. Kom inn!" og "Denne filmen passer ikke for din alder!" )
Først skriver vi betingelsen, etterfulgt av et spørsmålstegn.

person.getAge() > 18 ?
"Er denne personens alder over 18?" Så skriver vi den første verdien . Denne verdien brukes hvis betingelsen evalueres tiltrue :

String usherResponse = person.getAge() > 18 ? "Everything is in order. Come in!"
Er denne personens alder over 18? Hvis ja, sett usherResponse variabelen til "Alt er i orden. Kom inn!" Deretter kommer " :" symbolet og den andre verdien . Denne verdien brukes hvis betingelsen evalueres tilfalse :

String usherResponse = person.getAge() > 18 ? "Everything is in order. Come in!" : "This film is not suitable for your age!";
Er denne personens alder over 18? Hvis ja, sett usherResponse variabelen til "Alt er i orden. Kom inn!" . Hvis ikke, sett usherResponse variabelen til "Denne filmen passer ikke for din alder!" Generelt, her er hvordan den ternære operatørens logikk ser ut. betingelse ? utfall 1 : utfall 2 Ternær operatør - 2 Parentesene rundt tilstanden er forresten ikke påkrevd: vi la dem til for større lesbarhet. Det fungerer også uten dem:

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);

}
Så hva bør du bruke? En if-elseerklæring eller den ternære operatøren? Når det gjelder ytelse, er det ingen forskjell. Mer nøyaktig, kanskje det er det, men det er ubetydelig. Den største vurderingen her er lesbarheten til koden din. Koden du skriver må ikke bare fungere riktig, men også være lett å lese . Tross alt kan det være "arvet" av andre programmerere, kollegene dine! Hvis det er vanskelig å forstå, vil det komplisere arbeidet deres, og ditt (de kommer løpende til deg for å få forklaringer hvert 5. minutt). Den generelle anbefalingen er denne: hvis tilstanden er enkel og lett verifisert, kan du bruke den ternære operatøren uten skade. Dette lar deg redusere mengden kode og antallif-elseuttalelser (og det kan allerede være mange av dem). Men hvis tilstanden er kompleks og involverer flere trinn, er det bedre å bruke en if-elseuttalelse. For eksempel vil det å bruke en ternær operatør være en dårlig idé i dette tilfellet:

String usherResponse = (person.getAge() > 18 && (person.hasTicket() || person.hasCoupon()) && !person.hasChild()) ? "Come in!" : "You can't come in!";
Det er ikke umiddelbart tydelig hva som skjer her! Koden har blitt veldig vanskelig å lese. Og alt på grunn av den komplekse tilstanden:
  • Hvis noen er eldre enn 18 år, har billett (eller frikort) og ikke har små barn, kan han komme inn.
  • Hvis selv en del av tilstanden er falsk, kan han ikke det.
Her er det klart bedre å bruke if-else. Ja, koden vår vil være større, men den vil være mye mer lesbar. Og kollegene dine vil ikke møte håndflaten hvis de arver denne koden :) Til slutt kan jeg anbefale en god for deg. Vi kom inn på kodelesbarhet under leksjonen. Robert Martins bok "Clean Code", som har blitt en klassiker, er dedikert til dette temaet. Ternær operatør - 4Den samler beste praksis og anbefalinger for programmerere, som vil hjelpe deg å skrive kode som ikke bare er funksjonell, men også lett lesbar.