Enums เป็นประเภทที่ จำกัด เพียงแค่ชื่อที่กำหนดเอง Enum อาจมีเพียงหนึ่งค่าเช่นเดียวกับvoid
ที่มีอยู่เท่านั้นnull
(บางภาษาเรียกสิ่งนี้unit
และใช้ชื่อvoid
สำหรับ enum ที่ไม่มีองค์ประกอบ!) มันอาจจะมีสองค่าเช่นbool
ที่มีและfalse
true
มันอาจจะมีสามเช่นcolourChannel
มีred
, และgreen
blue
และอื่น ๆ
หากสอง enums มีค่าเท่ากันแสดงว่าเป็น "isomorphic"; เช่นถ้าเราเปลี่ยนชื่อทั้งหมดอย่างเป็นระบบจากนั้นเราสามารถใช้ชื่ออื่นแทนและโปรแกรมของเราจะไม่ทำงานแตกต่างกัน โดยเฉพาะอย่างยิ่งการทดสอบของเราจะไม่ทำงานแตกต่างกัน!
ตัวอย่างเช่นresult
มีwin
/ lose
/ draw
เป็น isomorphic ข้างต้นcolourChannel
เนื่องจากเราสามารถแทนที่เช่นcolourChannel
กับresult
, red
กับwin
, green
ด้วยlose
และblue
ด้วยdraw
และตราบใดที่เราทำได้ทุกที่ (ผลิตและผู้บริโภค parsers และ serialisers รายการฐานข้อมูลไฟล์บันทึก ฯลฯ ) จากนั้นจะไม่มีการเปลี่ยนแปลงในโปรแกรมของเรา " colourChannel
การทดสอบ" ที่เราเขียนจะยังคงผ่านแม้ว่าจะไม่มีcolourChannel
อีกต่อไป!
นอกจากนี้หาก enum มีค่ามากกว่าหนึ่งค่าเราสามารถจัดเรียงค่าเหล่านั้นใหม่เพื่อรับ enum ใหม่ที่มีจำนวนค่าเท่ากัน เนื่องจากจำนวนของค่าไม่เปลี่ยนแปลงการจัดเรียงใหม่คือ isomorphic กับเก่าและด้วยเหตุนี้เราสามารถสลับชื่อทั้งหมดและการทดสอบของเราจะยังคงผ่าน (โปรดทราบว่าเราไม่สามารถเพียงแค่เปลี่ยนคำจำกัดความเราต้อง ยังคงสลับใช้ไซต์ทั้งหมดเช่นกัน)
สิ่งที่หมายถึงนี้ก็คือว่าเท่าที่เป็นเครื่องที่เป็นห่วง enums มี "ชื่อที่แตกต่าง" และไม่มีอะไรอื่น สิ่งเดียวที่เราสามารถทำได้ด้วย enum คือการแยกสาขาว่าค่าสองค่านั้นเหมือนกัน (เช่นred
/ red
) หรือแตกต่างกัน (เช่นred
/ blue
) นั่นคือสิ่งเดียวที่ 'การทดสอบหน่วย' สามารถทำได้เช่น
( red == red ) || throw TestFailure;
(green == green) || throw TestFailure;
( blue == blue ) || throw TestFailure;
( red != green) || throw TestFailure;
( red != blue ) || throw TestFailure;
...
ในฐานะที่เป็น @ jesm00 พูดว่าการทดสอบดังกล่าวกำลังตรวจสอบการใช้ภาษามากกว่าโปรแกรมของคุณ การทดสอบเหล่านี้ไม่ใช่ความคิดที่ดี: แม้ว่าคุณจะไม่เชื่อถือการใช้ภาษาคุณควรทดสอบจากภายนอกเนื่องจากไม่สามารถเชื่อถือได้ในการรันการทดสอบอย่างถูกต้อง!
นั่นคือทฤษฎี แล้วการฝึกฝนล่ะ? ปัญหาหลักของคุณลักษณะนี้คือโปรแกรม 'โลกแห่งความจริง' ไม่ค่อยมีอยู่ในตัวเอง: เรามีรุ่นดั้งเดิม, การปรับใช้แบบรีโมต / ฝังตัว, ข้อมูลประวัติ, การสำรองข้อมูล, ฐานข้อมูลสดเป็นต้นดังนั้นเราจึงไม่สามารถ 'เปลี่ยน' ได้จริงๆ การเกิดขึ้นของชื่อทั้งหมดโดยไม่พลาดการใช้งานบางอย่าง
แต่สิ่งเหล่านี้ไม่ใช่ 'ความรับผิดชอบ' ของ enum เอง: การเปลี่ยน enum อาจทำให้การสื่อสารกับระบบรีโมตหยุดชะงัก แต่ในทางกลับกันเราอาจแก้ไขปัญหาดังกล่าวได้โดยการเปลี่ยน enum!
ในสถานการณ์เช่น enum เป็นปลาชนิดหนึ่งสีแดง: สิ่งที่ถ้าระบบหนึ่งต้องการให้มันเป็นนี้ทางและอื่น ๆ ต้องการให้เป็นที่วิธี? มันเป็นทั้งสองอย่างไม่ว่าเราจะเขียนแบบทดสอบกี่ครั้งก็ตาม! ผู้ร้ายที่แท้จริงที่นี่คืออินเทอร์เฟซอินพุต / เอาต์พุตซึ่งควรสร้าง / ใช้รูปแบบที่กำหนดไว้อย่างดีแทนที่จะเป็น "สิ่งที่จำนวนเต็มเลือกตีความ" ดังนั้นทางออกที่แท้จริงคือการทดสอบอินเทอร์เฟซ i / o : ด้วยการทดสอบหน่วยเพื่อตรวจสอบว่าเป็นการแยก / พิมพ์รูปแบบที่คาดหวังและด้วยการทดสอบการรวมเพื่อตรวจสอบว่าอีกด้านหนึ่งเป็นที่ยอมรับของรูปแบบ
เราอาจยังสงสัยว่า Enum นั้น 'ออกกำลังกายอย่างละเอียดเพียงพอ' หรือไม่ แต่ในกรณีนี้ Enum จะเป็นปลาเฮอริ่งอีกครั้ง สิ่งที่เรากำลังกังวลเกี่ยวกับการเป็นจริงชุดทดสอบตัวเอง เราสามารถสร้างความมั่นใจได้ที่นี่ด้วยสองวิธี:
- การครอบคลุมรหัสสามารถบอกเราได้ว่าความหลากหลายของค่า enum ที่มาจากชุดทดสอบนั้นเพียงพอที่จะกระตุ้นให้สาขาต่าง ๆ ในรหัสนั้น ถ้าไม่เราสามารถเพิ่มการทดสอบที่เรียกสาขาที่ไม่ได้เปิดหรือสร้างความหลากหลายที่กว้างขึ้นของการทดสอบที่มีอยู่
- การตรวจสอบคุณสมบัติสามารถบอกเราได้ว่ามีความหลากหลายของสาขาในรหัสเพียงพอที่จะจัดการกับความเป็นไปได้ของรันไทม์หรือไม่ ตัวอย่างเช่นหากโค้ดจัดการเท่านั้น
red
และเราทดสอบด้วยred
เท่านั้นเราจะมีความครอบคลุม 100% ตัวตรวจสอบคุณสมบัติจะ (พยายาม) สร้างตัวอย่างให้กับการยืนยันของเราเช่นการสร้างgreen
และblue
ค่าที่เราลืมทดสอบ
- การทดสอบการกลายพันธุ์สามารถบอกเราได้ว่าการยืนยันของเราตรวจสอบ enum จริง ๆเพียงแค่ติดตามกิ่งไม้และไม่สนใจความแตกต่าง