CodeGym /จาวาบล็อก /สุ่ม /ตัวดำเนินการแบบไตรภาค
John Squirrels
ระดับ
San Francisco

ตัวดำเนินการแบบไตรภาค

เผยแพร่ในกลุ่ม
สวัสดี! บทเรียนวันนี้จะไม่ยาวมาก แต่จะมีประโยชน์อย่างแน่นอน :) เราจะพูดถึงสิ่งที่เรียกว่าตัวดำเนินการที่ประกอบไปด้วย ternary . ตัวดำเนินการแบบไตรภาค - 1Ternaryหมายถึง " ประกอบด้วยสามส่วน " เป็นทางเลือกแทนif-elseคำสั่งโฟลว์การควบคุมที่คุณพบแล้ว ลองยกตัวอย่าง สมมติว่ามีคนตัดสินใจไปดูหนังเรต R (เด็กอายุต่ำกว่า 17 ปีต้องมีพ่อแม่หรือผู้ปกครองที่เป็นผู้ใหญ่มาด้วย) ผู้นำตรวจสอบอายุของเขาที่ประตู: ถ้าเขาผ่านการตรวจสอบอายุ, เขาได้รับอนุญาตให้เข้าไป; ถ้าไม่เช่นนั้นเขาจะถูกส่งกลับบ้าน มาประกาศ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!";
       }
ตรรกะง่ายมากที่นี่: มีการตรวจสอบเงื่อนไขหนึ่งข้อ (อายุ >= 18) จากผลลัพธ์ ตัวแปรusherResponseถูกกำหนดหนึ่งในสองสตริงด้วยการตอบสนองของอัชเชอร์ สถานการณ์ดังกล่าว ("หนึ่งเงื่อนไข - สองผลลัพธ์ที่เป็นไปได้") เป็นเรื่องปกติมากในการเขียนโปรแกรม และนั่นคือสาเหตุที่สร้างตัวดำเนินการแบบไตรภาคขึ้นมา เราสามารถใช้เพื่อทำให้เช็คของเราง่ายขึ้นเป็นโค้ดบรรทัดเดียว:

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

}
นี่คือวิธีการทำงานของโอเปอเรเตอร์นี้ เรียกว่าตัวดำเนินการแบบไตรภาค เนื่องจากประกอบด้วย 3 องค์ประกอบ:
  • หนึ่งเงื่อนไข ( person.getAge() > 18)
  • ผลลัพธ์ที่เป็นไปได้สองอย่าง ( "ทุกอย่างเรียบร้อย เข้ามาเลย!"และ"ภาพยนตร์เรื่องนี้ไม่เหมาะกับวัยของคุณ!" )
อันดับแรก เราเขียนเงื่อนไขตามด้วยเครื่องหมายคำถาม

person.getAge() > 18 ?
"บุคคลนี้อายุมากกว่า 18 ปีหรือไม่" จากนั้นเราเขียนค่าแรก . ค่านี้ใช้หากเงื่อนไขประเมินเป็นtrue :

String usherResponse = person.getAge() > 18 ? "Everything is in order. Come in!"
บุคคลนี้อายุมากกว่า 18 ปีหรือไม่ ถ้าใช่ ให้ตั้ง usherResponse ค่าตัวแปรเป็น"Everything is in order. Come in!" ถัดมาเป็นสัญลักษณ์ " :" และค่าที่สอง ค่านี้ใช้หากเงื่อนไขประเมินเป็นfalse :

String usherResponse = person.getAge() > 18 ? "Everything is in order. Come in!" : "This film is not suitable for your age!";
บุคคลนี้อายุมากกว่า 18 ปีหรือไม่ ถ้าใช่ ให้ตั้ง usherResponse ค่าตัวแปรเป็น"Everything is in order. Come in!" . ถ้าไม่ ให้ตั้งค่า usherResponse ตัวแปรเป็น"ภาพยนตร์เรื่องนี้ไม่เหมาะกับอายุของคุณ!" โดยทั่วไป นี่คือลักษณะของตรรกะของตัวดำเนินการแบบไตรภาค เงื่อนไข ? ผลลัพธ์ 1 : ผลลัพธ์ 2 ตัวดำเนินการแบบไตรภาค - 2ยังไงก็ตาม ไม่จำเป็นต้องใส่วงเล็บรอบเงื่อนไข: เราเพิ่มเข้าไปเพื่อให้อ่านง่ายขึ้น นอกจากนี้ยังใช้งานได้หากไม่มี:

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

}
คุณควรใช้อะไร คำif-elseสั่งหรือตัวดำเนินการที่ประกอบไปด้วย? ในแง่ของประสิทธิภาพไม่มีความแตกต่างกัน แม่นยำยิ่งขึ้น อาจมี แต่ไม่มีนัยสำคัญ การพิจารณาที่ใหญ่ที่สุดในที่นี้คือการอ่านรหัสของคุณ โค้ดที่คุณเขียนไม่เพียงแต่ต้องทำงานได้อย่างถูกต้องเท่านั้น แต่ยังต้องอ่านง่าย อีกด้วย ท้ายที่สุด มันอาจจะ "สืบทอด" มาจากโปรแกรมเมอร์คนอื่นๆ เพื่อนร่วมงานของคุณก็ได้! หากเข้าใจยาก จะทำให้งานของพวกเขาและของคุณซับซ้อน (พวกเขาจะวิ่งมาหาคุณเพื่อขอคำอธิบายทุกๆ 5 นาที) คำแนะนำทั่วไปคือ: หากเงื่อนไขนั้นเรียบง่ายและตรวจสอบได้ง่าย คุณสามารถใช้ตัวดำเนินการ ternary ได้โดยไม่เป็นอันตราย สิ่งนี้ช่วยให้คุณลดจำนวนรหัสและจำนวนif-else(และอาจมีจำนวนมากอยู่แล้ว) แต่ถ้าเงื่อนไขซับซ้อนและมีหลายขั้นตอน ควรใช้if-elseคำสั่ง ตัวอย่างเช่น การใช้ตัวดำเนินการ ternary จะเป็นความคิดที่ไม่ดีในกรณีนี้:

String usherResponse = (person.getAge() > 18 && (person.hasTicket() || person.hasCoupon()) && !person.hasChild()) ? "Come in!" : "You can't come in!";
ไม่ชัดเจนทันทีว่าเกิดอะไรขึ้นที่นี่! โค้ดอ่านยากมาก และทั้งหมดเป็นเพราะเงื่อนไขที่ซับซ้อน:
  • ถ้าใครอายุมากกว่า 18 ปี มีตั๋ว (หรือบัตรผ่านฟรี) และไม่มีเด็กเล็ก ก็สามารถเข้ามาได้
  • หากเงื่อนไขส่วนหนึ่งเป็นเท็จ เขาก็ทำไม่ได้
นี่มันดีกว่าการใช้อย่างif-elseชัดเจน ใช่ รหัสของเราจะใหญ่ขึ้น แต่จะสามารถอ่านได้มากขึ้น และเพื่อนร่วมงานของคุณจะไม่หน้ามือเป็นหลังมือหากพวกเขาสืบทอดรหัสนี้ :) สุดท้ายนี้ ผมสามารถแนะนำสิ่งดีๆ ให้กับคุณได้ เราพูดถึงความสามารถในการอ่านโค้ดในระหว่างบทเรียน หนังสือ "Clean Code" ของ Robert Martin ซึ่งกลายเป็นหนังสือคลาสสิกมีไว้สำหรับหัวข้อนี้ ตัวดำเนินการแบบไตรภาค - 4มันรวบรวมแนวทางปฏิบัติที่ดีที่สุดและคำแนะนำสำหรับโปรแกรมเมอร์ ซึ่งจะช่วยให้คุณเขียนโค้ดที่ไม่เพียงใช้งานได้ แต่ยังอ่านง่ายอีกด้วย
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION