Takeaway ที่จากนี้คือการล้มเหลวอย่างรวดเร็ว
เราไม่มีรหัสและไม่มีตัวอย่างคำนำหน้าหลายคำที่ไม่ใช่คำนำหน้าของสาขาทดสอบตามรหัส สิ่งที่เรามีคือ:
- 089 - 100 => สาขาทดสอบ
- 10B, 10C => สาขาทดสอบ
- <088 => กิ่งจริงอาจ
- > 100 => กิ่งจริงอาจ
ความจริงที่ว่ารหัสช่วยให้ตัวเลขและสตริงเป็นมากกว่าแปลกเล็กน้อย แน่นอนว่า 10B และ 10C สามารถพิจารณาได้ว่าเป็นเลขฐานสิบหก แต่หากคำนำหน้าทั้งหมดถือว่าเป็นเลขฐานสิบ 10B และ 10C จะอยู่นอกช่วงทดสอบและจะถือว่าเป็นสาขาจริง
นี่อาจหมายความว่าคำนำหน้าจะถูกเก็บไว้เป็นสตริง แต่ถือว่าเป็นตัวเลขในบางกรณี นี่คือรหัสที่ง่ายที่สุดที่ฉันสามารถนึกได้ว่าจะเลียนแบบพฤติกรรมนี้ (โดยใช้ C # เพื่อวัตถุประสงค์ในการอธิบาย):
bool IsTest(string strPrefix) {
int iPrefix;
if(int.TryParse(strPrefix, out iPrefix))
return iPrefix >= 89 && iPrefix <= 100;
return true; //here is the problem
}
ในภาษาอังกฤษถ้าสตริงเป็นตัวเลขและอยู่ระหว่าง 89 และ 100 ก็คือการทดสอบ หากไม่ใช่ตัวเลขก็เป็นการทดสอบ มิฉะนั้นจะไม่ได้ทดสอบ
หากรหัสเป็นไปตามรูปแบบนี้จะไม่มีการทดสอบหน่วยใด ๆ ในตอนนี้ที่มีการนำรหัสไปใช้ นี่คือตัวอย่างการทดสอบหน่วย:
assert.isFalse(IsTest("088"))
assert.isTrue(IsTest("089"))
assert.isTrue(IsTest("095"))
assert.isTrue(IsTest("100"))
assert.isFalse(IsTest("101"))
assert.isTrue(IsTest("10B")) // <--- business rule change
การทดสอบหน่วยแสดงว่า "10B" ควรถือว่าเป็นสาขาทดสอบ User @ gnasher729 ด้านบนบอกว่ากฎทางธุรกิจเปลี่ยนไปและนั่นคือสิ่งที่การยืนยันครั้งสุดท้ายข้างต้นแสดงให้เห็น ในบางจุดที่ยืนยันควรเปลี่ยนเป็นisFalse
แต่ไม่ได้เกิดขึ้น การทดสอบหน่วยเริ่มต้นที่การพัฒนา - และเวลาสร้าง แต่หลังจากนั้นไม่นาน
บทเรียนที่นี่คืออะไร รหัสต้องการวิธีส่งสัญญาณว่าได้รับอินพุตที่ไม่คาดคิด นี่เป็นอีกทางเลือกหนึ่งในการเขียนโค้ดนี้ซึ่งเน้นว่ามันคาดว่าคำนำหน้าจะเป็นตัวเลข:
// Alternative A
bool TryGetIsTest(string strPrefix, out bool isTest) {
int iPrefix;
if(int.TryParse(strPrefix, out iPrefix)) {
isTest = iPrefix >= 89 && iPrefix <= 100;
return true;
}
isTest = true; //this is just some value that won't be read
return false;
}
สำหรับผู้ที่ไม่ทราบ C # ค่าส่งคืนจะระบุว่ารหัสนั้นสามารถแยกคำนำหน้าจากสตริงที่กำหนดหรือไม่ หากค่าส่งคืนเป็นจริงรหัสการโทรสามารถใช้ตัวแปร isTest out เพื่อตรวจสอบว่าคำนำหน้าสาขาเป็นคำนำหน้าทดสอบหรือไม่ หากค่าส่งคืนเป็นเท็จรหัสการโทรควรรายงานว่าไม่คาดว่าจะมีส่วนนำหน้าที่กำหนดไว้และตัวแปร isTest out ไม่มีความหมายและควรละเว้น
หากคุณมีข้อยกเว้นคุณสามารถทำได้ดังนี้:
// Alternative B
bool IsTest(string strPrefix) {
int iPrefix = int.Parse(strPrefix);
return iPrefix >= 89 && iPrefix <= 100;
}
ทางเลือกนี้ตรงไปตรงมามากขึ้น ในกรณีนี้รหัสการโทรจำเป็นต้องได้รับการยกเว้น ไม่ว่าในกรณีใดรหัสควรมีวิธีการรายงานไปยังผู้โทรว่าไม่คาดว่า strPrefix ที่ไม่สามารถแปลงเป็นจำนวนเต็มได้ ด้วยวิธีนี้รหัสล้มเหลวอย่างรวดเร็วและธนาคารสามารถค้นหาปัญหาได้อย่างรวดเร็วโดยไม่ต้องลำบากใจกับ ก.ล.ต.