สวัสดี! การบรรยายวันนี้จะไม่ยาวมาก แต่มีประโยชน์อย่างแน่นอน :) เราจะพูดถึงสิ่งที่เรียกว่าตัว ดำเนินการแบบไตรภาค “ไตรภาค” แปลว่า “สามเท่า” นี่เป็นอีกทางเลือกหนึ่งนอกเหนือจากตัวดำเนินการแบบมีเงื่อนไข
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 อย่างไรก็ตาม ไม่จำเป็นต้องใส่วงเล็บล้อมรอบเงื่อนไข เราทำเช่นนี้เพื่อให้อ่านง่ายขึ้น มันจะทำงานโดยไม่มีพวกเขา:
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 จัดทำขึ้นเพื่อเธอโดยเฉพาะ ประกอบด้วยแนวปฏิบัติที่ดีที่สุดและคำแนะนำสำหรับโปรแกรมเมอร์ที่จะช่วยให้คุณเขียนไม่เพียงแต่ใช้งานได้จริง แต่ยังอ่านโค้ดได้ง่ายอีกด้วย มี รีวิวหนังสือเล่มนี้บน JavaRush
GO TO FULL VERSION