ใช่
คุณควรใช้วงเล็บ ... คุณไม่ได้ควบคุมลำดับความสำคัญ ... ผู้พัฒนาคอมไพเลอร์ทำ นี่คือเรื่องราวที่เกิดขึ้นกับฉันเกี่ยวกับการไม่ใช้วงเล็บ เรื่องนี้ส่งผลกระทบต่อคนหลายร้อยคนในช่วงสองสัปดาห์
เหตุผลในโลกแห่งความจริง
ฉันสืบทอดแอปพลิเคชันเฟรมหลัก อยู่มาวันหนึ่งจากฟ้าใสมันหยุดทำงาน แค่นั้นแหละ ... มันหยุดแล้ว
งานของฉันคือทำให้มันทำงานเร็วที่สุด ซอร์สโค้ดยังไม่ได้รับการแก้ไขเป็นเวลาสองปี แต่ในทันใดมันก็หยุด ฉันพยายามที่จะรวบรวมรหัสและมันยากจนในบรรทัดที่ XX ฉันดูที่บรรทัด XX และฉันไม่สามารถบอกได้ว่าอะไรจะทำให้ตัวแบ่งบรรทัด XX ฉันขอรายละเอียดสเปคโดยละเอียดสำหรับแอปพลิเคชันนี้และไม่มีเลย บรรทัดที่ XX ไม่ใช่ตัวการ
ฉันพิมพ์รหัสและเริ่มตรวจสอบจากด้านบนลงล่าง ฉันเริ่มสร้างผังงานว่าเกิดอะไรขึ้น รหัสนั้นซับซ้อนมากจนฉันแทบจะไม่เข้าใจเลย ฉันยอมแพ้พยายามที่จะแผนภูมิมัน ฉันกลัวที่จะทำการเปลี่ยนแปลงโดยไม่ทราบว่าการเปลี่ยนแปลงนั้นจะส่งผลกระทบต่อส่วนที่เหลือของกระบวนการอย่างไรโดยเฉพาะอย่างยิ่งเมื่อฉันไม่มีรายละเอียดว่าแอปพลิเคชันทำอะไรหรืออยู่ที่ไหนในห่วงโซ่การพึ่งพา
ดังนั้นฉันตัดสินใจที่จะเริ่มต้นที่ด้านบนของซอร์สโค้ดและเพิ่ม whitespce และ line brakes เพื่อให้โค้ดอ่านง่ายขึ้น ฉันสังเกตเห็นว่าในบางกรณีจะมีเงื่อนไขที่รวมกันAND
และOR
และมันก็ไม่สามารถแยกแยะได้อย่างชัดเจนระหว่างข้อมูลที่ถูกAND
แก้ไขและข้อมูลใดที่ถูกOR
แก้ไข ดังนั้นฉันจึงเริ่มใส่วงเล็บไปรอบ ๆAND
และOR
เงื่อนไขเพื่อให้อ่านง่ายขึ้น
เมื่อฉันค่อยๆทำความสะอาดมันฉันจะช่วยงานของฉันเป็นระยะ ณ จุดหนึ่งฉันพยายามรวบรวมรหัสและสิ่งที่แปลกประหลาดเกิดขึ้น ข้อผิดพลาดเพิ่มขึ้นผ่านบรรทัดของรหัสต้นฉบับและตอนนี้ก็ลงต่อไป ดังนั้นฉันจึงแยกกันAND
และทำตามOR
เงื่อนไขด้วย parens เมื่อฉันทำความสะอาดเสร็จมันก็ทำงานได้ ไปรูป
จากนั้นฉันตัดสินใจไปที่ร้านค้าปฏิบัติการและถามพวกเขาว่าพวกเขาเพิ่งติดตั้งส่วนประกอบใหม่ใด ๆ บนเฟรมหลักหรือไม่ พวกเขาบอกว่าใช่เราเพิ่งอัพเกรดคอมไพเลอร์ hmmmm
ปรากฎว่าคอมไพเลอร์เก่าทำการประเมินนิพจน์จากซ้ายไปขวาโดยไม่คำนึงถึง คอมไพเลอร์เวอร์ชันใหม่ยังประเมินนิพจน์จากซ้ายไปขวา แต่โค้ดคลุมเครือซึ่งหมายถึงการผสมที่ไม่ชัดเจนของAND
และOR
ไม่สามารถแก้ไขได้
บทเรียนที่ฉันเรียนรู้จากสิ่งนี้ ... เสมอ, เสมอ, ใช้ parens เพื่อแยกAND
เงื่อนไขและOR
เงื่อนไขเมื่อใช้ร่วมกัน
ตัวอย่างแบบง่าย
IF Product = 191 OR Product = 193 AND Model = "ABC" OR Product = 201 OR Product = 202 AND Model = "DEF" ...
(รหัสที่ทิ้งกระจุยกระจายกับหลายสิ่งเหล่านี้)
นี่เป็นเวอร์ชั่นที่เรียบง่ายของสิ่งที่ฉันพบ มีเงื่อนไขอื่นที่มีคำสั่งตรรกะบูลีนเช่นกัน
ฉันจำได้ว่าการ chaging ไปที่:
IF ((Product = 191 OR Product = 193) AND Model = "ABC") OR ((Product = 201 OR Product = 202) AND Model = "DEF") ...
ฉันเขียนมันไม่ได้เพราะไม่มีรายละเอียด ผู้เขียนต้นฉบับหายไปนาน ฉันจำความกดดันได้ เรือบรรทุกสินค้าทั้งหมดติดอยู่ในพอร์ตและไม่สามารถโหลดได้เพราะโปรแกรมเล็ก ๆ นี้ไม่ทำงาน ไม่มีคำเตือน ไม่มีการเปลี่ยนแปลงรหัสต้นฉบับ ฉันเพิ่งถามการดำเนินงานเครือข่ายเฉพาะเมื่อพวกเขาแก้ไขอะไรหลังจากที่ฉันสังเกตเห็นว่าการเพิ่ม parens เปลี่ยนข้อผิดพลาด