CodeGym /Java Blog /Willekeurig /Ternaire operator
John Squirrels
Niveau 41
San Francisco

Ternaire operator

Gepubliceerd in de groep Willekeurig
Hoi! De les van vandaag zal niet erg lang zijn, maar hij zal zeker nuttig zijn :) We gaan het hebben over de zogenaamde ternaire operator . Ternaire operator - 1Ternair betekent " bestaande uit drie delen ". Het is een alternatief voor de if-elsecontrolestroomverklaring die u al hebt ontmoet. Laten we een voorbeeld geven. Stel dat iemand besluit om naar een film met een R-rating te gaan (jonger dan 17 jaar is een begeleidende ouder of volwassen voogd vereist). De bode controleert zijn leeftijd aan de deur: als hij door de leeftijdscontrole is gekomen, mag hij naar binnen; zo niet, dan wordt hij naar huis gestuurd. Laten we een Personklasse declareren en dit controleren met een if-elsestatement:

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

   }
}
Console-uitvoer:

"Everything is in order. Come in!"
Als we de console-uitvoer verwijderen, ziet onze controle er als volgt uit:

if (person.getAge() >= 18) {
           usherResponse = "Everything is in order. Come in!";
       } else {
           usherResponse = "This film is not suitable for your age!";
       }
De logica is hier heel eenvoudig: één voorwaarde wordt gecontroleerd (leeftijd >= 18) Op basis van het resultaat usherResponsekrijgt de variabele een van de twee strings toegewezen met het antwoord van de bode. Dergelijke situaties ("één voorwaarde - twee mogelijke uitkomsten") komen zeer vaak voor bij programmeren. En daarom is de ternaire operator gemaakt. We kunnen het gebruiken om onze controle te vereenvoudigen tot een enkele regel 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);

}
Hier is hoe deze operator werkt. Het wordt de ternaire operator genoemd, omdat het om 3 componenten gaat:
  • Een voorwaarde ( person.getAge() > 18)
  • Twee mogelijke uitkomsten ( "Alles is in orde. Kom binnen!" en "Deze film is niet geschikt voor jouw leeftijd!" )
Eerst schrijven we de voorwaarde, gevolgd door een vraagteken.

person.getAge() > 18 ?
"Is deze persoon ouder dan 18?" Dan schrijven we de eerste waarde . Deze waarde wordt gebruikt als de voorwaarde resulteert intrue :

String usherResponse = person.getAge() > 18 ? "Everything is in order. Come in!"
Is deze persoon ouder dan 18 jaar? Zo ja, stel de usherResponse variabele in op "Alles is in orde. Kom binnen!" Vervolgens komt het :symbool " " en de tweede waarde . Deze waarde wordt gebruikt als de voorwaarde resulteert infalse :

String usherResponse = person.getAge() > 18 ? "Everything is in order. Come in!" : "This film is not suitable for your age!";
Is deze persoon ouder dan 18 jaar? Zo ja, stel de usherResponse variabele in op "Alles is in orde. Kom binnen!" . Zo niet, stel dan de usherResponse variabele in op "Deze film is niet geschikt voor jouw leeftijd!" In het algemeen ziet de logica van de ternaire operator er zo uit. voorwaarde ? uitkomst 1 : uitkomst 2 Ternaire operator - 2 Overigens zijn de haakjes rond de voorwaarde niet verplicht: we hebben ze toegevoegd voor een betere leesbaarheid. Het werkt ook zonder hen:

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

}
Dus wat moet je gebruiken? Een if-elseverklaring of de ternaire operator? Qua prestaties is er geen verschil. Om preciezer te zijn, misschien wel, maar het is onbeduidend. De grootste overweging hier is de leesbaarheid van uw code. De code die je schrijft moet niet alleen goed werken, maar ook goed leesbaar zijn . Het kan tenslotte worden "overgeërfd" door andere programmeurs, uw collega's! Als het moeilijk te begrijpen is, zal het hun werk bemoeilijken, en dat van jou (ze komen om de 5 minuten naar je toe rennen voor uitleg). De algemene aanbeveling is deze: als de voorwaarde eenvoudig en gemakkelijk te verifiëren is, kunt u de ternaire operator zonder schade gebruiken. Hiermee kunt u de hoeveelheid code en het aantalif-elseverklaringen (en dat zijn er misschien al veel). Maar als de voorwaarde complex is en uit meerdere stappen bestaat, is het beter om een if-else​​statement te gebruiken. Het gebruik van een ternaire operator zou in dit geval bijvoorbeeld een slecht idee zijn:

String usherResponse = (person.getAge() > 18 && (person.hasTicket() || person.hasCoupon()) && !person.hasChild()) ? "Come in!" : "You can't come in!";
Het is niet meteen duidelijk wat hier gebeurt! De code is erg moeilijk leesbaar geworden. En dat allemaal vanwege de complexe toestand:
  • Als iemand ouder is dan 18 jaar, een kaartje (of een vrijkaart) heeft en geen jonge kinderen heeft, mag hij binnenkomen.
  • Als ook maar één deel van de voorwaarde onwaar is, dan kan hij dat niet.
Hier is het duidelijk beter om te gebruiken if-else. Ja, onze code zal groter zijn, maar het zal een stuk leesbaarder zijn. En je collega's zullen geen gezicht hebben als ze deze code erven :) Tot slot kan ik je een goede aanraden. We hebben tijdens de les de leesbaarheid van codes besproken. Het boek "Clean Code" van Robert Martin, dat een klassieker is geworden, is aan dit onderwerp gewijd. Ternaire operator - 4Het brengt best practices en aanbevelingen voor programmeurs samen, waarmee u code kunt schrijven die niet alleen functioneel is, maar ook gemakkelijk leesbaar.
Opmerkingen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION