โพสต์สั้น ๆ มีไว้สำหรับแฟน ๆ ทุกคนของ Star Wars และ Java / JavaRush เพื่อเป็นเกียรติแก่วันครบรอบ 40 ปีของการเปิดตัว Episode V ของ star saga! บางครั้งคุณสามารถพบสิ่งที่น่าสนใจมากมายบนอินเทอร์เน็ต และเมื่อวันก่อนฉันได้พบกับการฝึกเขียนโปรแกรมที่ค่อนข้างตลกตั้งแต่แรกเห็นที่เรียกว่าเงื่อนไขของ Yoda กล่าวโดยสรุป เงื่อนไข Yoda (รวมถึงสัญลักษณ์ Yoda) คือรูปแบบการเขียนโปรแกรมที่นิพจน์การเปรียบเทียบที่คุ้นเคยสองส่วนในคำสั่งแบบมีเงื่อนไขจะถูกกลับรายการ:
เก้าหกส่วนของ Saga แบบมาราธอน เราก็นั่งลงโดยไม่ได้นอนเพื่อเขียนโค้ดสำหรับโปรเจ็กต์สัตว์เลี้ยงของเราและเขียนข้อความต่อไปนี้:
if (5 == a) {
// do something
}
สไตล์นี้สามารถใช้ได้กับภาษาที่มีไวยากรณ์คล้าย C ซึ่งส่วนใหญ่มักใช้ในสำนวนด้วย if
และwhile
if (0 == variable) {
// do something
}
while (false == endingCondition) {
// do something
}
เหตุใดจึงต้องเลื่อนนิพจน์คงที่ไปทางด้านซ้ายของตัวดำเนินการเปรียบเทียบ สมมติว่าสถานการณ์สมมติซึ่งหลังจากการดูทั้งvoid checkNumber(int a)
{
if (a = 13) // Здесь-то и появляется так называемый unexpected behavior!
{
printf("Number is 13");
}
}
ในกรณีนี้ ทุก ครั้ง ที่คุณรันโปรแกรม คุณจะได้รับสตริงNumber is 13"
โดยไม่คำนึงถึงอาร์กิวเมนต์ที่ส่งа
ไปยังเมธอด checkNumber(int a)
นี่ไม่ใช่สิ่งที่เราคาดหวัง! ข้อผิดพลาดเชิงตรรกะสามารถเกิดขึ้นได้ค่อนข้างบ่อยในหมู่โปรแกรมเมอร์มือใหม่ (เชื่อฉันเถอะฉันรู้) แต่ในขั้นตอนการคอมไพล์ โค้ดเช่น 13 = a จะทำให้เกิดข้อผิดพลาด ซึ่งเราจะไม่มองข้ามอย่างแน่นอน เนื่องจากค่าจำนวนเต็มเป็นค่าคงที่ ดังนั้นจึงไม่สามารถเปลี่ยนแปลงได้ (เปลี่ยนเป็น "a")
การใช้เงื่อนไขของ Yoda มีทั้งข้อดีและข้อเสีย
ด้านแสง:
-
ป้องกันการมอบหมายให้กับตัวแปรเมื่อเป้าหมายของเราคือการเปรียบเทียบ
-
แก้ไขปัญหา "Null Behavior" ที่ไม่ปลอดภัย (
NullPointerException
) // ตัวอย่างจาก Wikipedia
หากไม่มีโยดา:
String myString = null;
if (myString.equals("foobar")) { /* ... */ }
// This causes a NullPointerException in Java
กับโยดา:
String myString = null;
if ( "foobar".equals(myString) ) { // Результат - Ложь
/* не выполняется */
}
ด้านมืด:
- ความสามารถในการอ่านโค้ดสำหรับผู้ที่จะดูโค้ดของคุณมีความซับซ้อนมากขึ้น ทำให้ภาระในการรับรู้โค้ดเพิ่มมากขึ้น
- ขอบเขตแคบ ใช้เฉพาะการเปรียบเทียบความเท่าเทียมกันหรือการเปรียบเทียบกับค่าคงที่ ตรวจสอบค่าว่าง
- คอมไพเลอร์หลายราย "เห็น" ข้อผิดพลาดประเภทนี้แล้วและเตือนล่วงหน้าเกี่ยวกับข้อผิดพลาดที่อาจเกิดขึ้น
GO TO FULL VERSION