JavaRush /จาวาบล็อก /Random-TH /ตัวดำเนินการแบบไตรภาคใน 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 ปี + มีตั๋ว (หรือมีคูปองสำหรับเข้าชมฟรี) + ไม่มีเด็กเล็กมาด้วย - พวกเขาก็ผ่านได้
  • ถ้าอย่างน้อยส่วนหนึ่งของเงื่อนไขคืนค่าเท็จ ก็จะไม่สามารถ
นี่คือที่ที่มันจะดีกว่าที่จะใช้อย่างif-elseชัดเจน ใช่ โค้ดของเราอาจมีขนาดใหญ่กว่าแต่ก็สามารถอ่านได้มากกว่าหลายเท่า และไม่มีเพื่อนร่วมงานของคุณคนใดที่จะเงยหน้าขึ้นมองหากพวกเขาสืบทอดรหัสดังกล่าว :) สุดท้ายนี้ ฉันขอแนะนำหนังสือเล่มนี้ให้กับคุณได้ ในการบรรยาย เราได้กล่าวถึงหัวข้อเรื่องความสามารถในการอ่านโค้ด หนังสือคลาสสิก “Clean Code” โดย Robert Martin จัดทำขึ้นเพื่อเธอโดยเฉพาะ ตัวดำเนินการแบบไตรภาค - 3ประกอบด้วยแนวปฏิบัติที่ดีที่สุดและคำแนะนำสำหรับโปรแกรมเมอร์ที่จะช่วยให้คุณเขียนไม่เพียงแต่ใช้งานได้จริง แต่ยังอ่านโค้ดได้ง่ายอีกด้วย มี รีวิวหนังสือเล่มนี้บน JavaRush
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION