JavaRush /בלוג Java /Random-HE /מפעיל טרנרי ב-Java

מפעיל טרנרי ב-Java

פורסם בקבוצה
שלום! ההרצאה של היום לא תהיה ארוכה במיוחד, אבל בהחלט שימושית :) נדבר על מה שנקרא אופרטור טריני . מפעיל טריני - 1"טרנרי" פירושו "משולש". זוהי חלופה לאופרטור המותנה 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 = "It's all right, come in!";
       } else {
           securityAnswer = "This movie is not suitable for your age!";
       }

       System.out.println(securityAnswer);

   }
}
פלט מסוף:

"Все в порядке, проходите!"
אם נסיר את הפלט לקונסולה, הבדיקה שלנו תיראה כך:
if (man.getAge() >= 18) {
           securityAnswer = "It's all right, come in!";
       } else {
           securityAnswer = "This movie is not suitable for your age!";
       }
כאן, למעשה, היגיון פשוט עובד: תנאי אחד נבדק (גיל >= 18). בהתאם לכך, securityAnswerאחת משתי מיתרים עם תגובת השומר מוקצית למשתנה. מצבים כאלה, "תנאי אחד - שתי תוצאות אפשריות", מתרחשים לעתים קרובות מאוד בתכנות. לכן, אותו אופרטור שליש נוצר עבורם. בעזרתו נוכל לפשט את האימות שלנו לשורת קוד אחת:
public static void main(String[] args) {

   Man man = new Man(22);

   String securityAnswer = (man.getAge() >= 18) ? "It's all right, come in!" : "This movie is not suitable for your age!";

   System.out.println(securityAnswer);

}
כך נראית העבודה של המפעיל הזה. זה נקרא טריפלי (משולש) מכיוון ש-3 מרכיבים לוקחים חלק בעבודתו:
  • תנאי אחד ( man.getAge() >= 18)
  • שתי תוצאות אפשריות ( "זה בסדר, תמשיך הלאה!" ו"הסרט הזה לא מתאים לגילך!" )
ראשית, נכתב תנאי בקוד, ואחריו סימן שאלה.
man.getAge() >= 18 ?
"האם גילו של האדם גדול או שווה ל-18?" להלן התוצאה הראשונה. זה מופעל אם התנאי חוזר true, כלומר, הוא נכון:
String securityAnswer = man.getAge() >= 18 ? "It's all right, come in!"
האם גילו של האדם גדול מ-18 או שווה לו? אם כן, הקצה למשתנה securityAnswer את הערך "הכל בסדר, היכנס!" . אחריו מופיע :האופרטור " ", ולאחר מכן נכתבת התוצאה השנייה. הוא נדלק אם התנאי חוזר false, כלומר הוא שקר:
String securityAnswer = man.getAge() >= 18 ? "It's all right, come in!" : "This movie is not suitable for your age!";
האם גילו של האדם גדול מ-18 או שווה לו? אם כן, הקצה למשתנה securityAnswer את הערך "הכל בסדר, היכנס!" . אם לא, הקצה למשתנה securityAnswer את הערך "הסרט הזה לא מתאים לגילך!" כך נראה ההיגיון הכללי של האופרטור השלישוני. מצב? תוצאה 1 : תוצאה 2 מפעיל טריני - 2דרך אגב, אין צורך לשים סוגריים סביב התנאי: עשינו זאת לקריאות רבה יותר. זה יעבוד בלעדיהם:
public static void main(String[] args) {

   Man man = new Man(22);

   String securityAnswer = man.getAge() >= 18 ? "It's all right, come in!" : "This movie is not suitable for your age!";

   System.out.println(securityAnswer);

}
במה עליך להשתמש: if-else, או באופרטור השלישוני? מבחינת ביצועים אין הרבה הבדל. ליתר דיוק, זה אולי קיים, אבל זה לא משמעותי. כאן השאלה מתייחסת דווקא לקריאות הקוד שלך. זה חשוב ביותר בתכנות: הקוד שאתה כותב חייב לא רק לעבוד נכון, אלא גם להיות קל לקריאה. אחרי הכל, זה יכול לעבור בירושה למתכנתים אחרים, הקולגות שלך! ואם קשה להבין, זה יסבך גם את העבודה שלהם וגם את שלך - הם ירוצו אלייך להסברים כל 5 דקות. המלצה כללית עשויה להישמע כך: אם המצב פשוט וקל לבדיקה, אתה יכול להשתמש באופרטור הטרינרי ללא נזק. כך תצמצמו את כמות הקוד ואת מספר הצ'קים if-else, שאולי כבר יש הרבה מהם. אבל אם המצב מורכב ורב-שלבי, עדיף להשתמש if-else. לדוגמה, במקרה זה יהיה רעיון רע להשתמש באופרטור הטרינרי:
String securityAnswer = (man.getAge() >= 18 && (man.hasTicket() || man.hasCoupon()) && !man.hasChild())  ? "Come in!" : "You can not pass!";
אז לא תבינו מיד מה קורה כאן! הקוד הפך לקשה מאוד לקריאה. והכל בגלל מצב קשה:
  • אם אדם מעל או שווה לגיל 18 + יש לו כרטיס (או יש לו קופון כניסה חינם) + אין איתו ילדים קטנים - אז הם יכולים לעבור.
  • אם לפחות חלק אחד של התנאי מחזיר false, אז הוא לא יכול.
זה המקום שבו ברור יהיה עדיף להשתמש if-else. כן, הקוד שלנו יהיה גדול יותר בגודלו, אבל הוא יהיה קריא פי כמה. ואף אחד מהקולגות שלך לא יחזיק את ראשו אם הם יירשו קוד כזה :) לבסוף, אני יכול להמליץ ​​לך על הספר. בהרצאה נגענו בנושא קריאות הקוד. הספר הקלאסי "קוד נקי" מאת רוברט מרטין מוקדש לה. מפעיל טריני - 3הוא מכיל שיטות עבודה מומלצות והמלצות למתכנתים שיאפשרו לך לכתוב לא רק קוד עובד, אלא גם קל לקריאה. יש ביקורת על הספר הזה ב-JavaRush.
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION