สวัสดี! บทเรียนวันนี้จะไม่ยาวมาก แต่จะมีประโยชน์อย่างแน่นอน :) เราจะพูดถึงสิ่งที่เรียกว่าตัวดำเนินการที่ประกอบไปด้วย ternary .
Ternaryหมายถึง " ประกอบด้วยสามส่วน " เป็นทางเลือกแทน
ยังไงก็ตาม ไม่จำเป็นต้องใส่วงเล็บรอบเงื่อนไข: เราเพิ่มเข้าไปเพื่อให้อ่านง่ายขึ้น นอกจากนี้ยังใช้งานได้หากไม่มี:
มันรวบรวมแนวทางปฏิบัติที่ดีที่สุดและคำแนะนำสำหรับโปรแกรมเมอร์ ซึ่งจะช่วยให้คุณเขียนโค้ดที่ไม่เพียงใช้งานได้ แต่ยังอ่านง่ายอีกด้วย

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 
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 ซึ่งกลายเป็นหนังสือคลาสสิกมีไว้สำหรับหัวข้อนี้ 
GO TO FULL VERSION