ข้อควรจำในการใช้ Enumeration
Enumeration เป็นตัวแปรที่ทำให้ Code เราเข้าใจได้ง่ายขึ้นมาก แต่ถึงแม้ว่ามันจะสะดวกยังไง ก่อนใช้ Enumeration ควรจะมีการออกแบบและคิดให้ถี่ถ้วนด้วย ซึ่งการออกแบบที่ผมเคยผิดพลาดและคาดว่าน่าจะมีคนผิดพลาดบ่อยจะมีดังนี้ - ใช้ Enum แทนตัวเลขที่ติดกัน โดยปกติเรามักจะประกาศ Enum แต่ละตัวแทนค่าด้วยตัวเลขที่ติดกันเรียงลำดับลงไปเช่น UserRight = { None = 0, Admin = 1, User = 2, Guest = 3 } ซึ่งการออกแบบอย่างนี้จะทำให้มีปัญหาเมื่อในอนาคตเราต้องการแทรกข้อมูลระหว่างกลาง เช่นในตัวอย่างอนาคตถ้าระบบเรารองรับ SuperUser ขึ้นมา ซึ่งสิทธิ์ควรจะอยู่สูงกว่า User แต่ต่ำกว่า Admin ตามลำดับที่ถูก SuperUser ควรจะอยู่ระหว่าง Admin และ User แต่เนื่องจากเราประกาศให้ Admin เป็น 1 และ User เป็น 2 ไปแล้วจึงทำให้ SuperUser ต้องกลายเป็น 4,5 ไปโดยปริยาย ซึ่งตรงนี้ถ้าแค่เพิ่ม SuperUser อย่างเดียวก็ยังอ่านรู้เรื่อง แต่ถ้าในอนาคตเรามีสิทธิ์เป็น 20 กว่าแบบล่ะ จะกลายเป็นว่าสิทธิ์ของเราใน Enum จะเรียงลำดับแบบ "มั่ว" ขึ้นอยู่กับว่าสิทธิ์ไหนเกิดก่อนเกิดหลัง คิดดูละกันว่าในอนาคตผ่านไปอีกปี Enum ของเรากลายเป็น UserRight = { None=0, Admin=1, User=2, Guest=3, SuperUser=4, Manager=5, Trainee=6, Supervisor=7 .... } แล้วเอาเวลาเอา Enum ตัวนี้ทำเป็น XML, JSON เพื่อคุยกันล่ะ ลองนึกภาพว่าเรา Debug เว็บอยู่แล้วเห็น 5 โอว ต้องมาเปิดตารางดูกันมันส์เลยว่าคนๆ นี้สิทธิ์ประมาณไหน แทนที่เราจะกะคร่าวๆ ได้ว่าเห้ย 5 มันก็ต้องมีสิทธิ์เหนือกว่า 6 นิดนึงนะ วิธีการออกแบบที่ดีเราควรจะกำหนดให้ Enum แต่ละตัวมีช่องว่างระหว่างกันเพื่อรองรับเหตุการณ์ในอนาคตครับ เช่น UserRight = { None = 0, Admin = 100, User =200 } ถ้าวันหลังมี SuperUser ก็ให้เป็น 150 ซะก็หมดเรื่อง - Cast Enum ไปมาระหว่างกันตรงๆ โดยไม่ใช้ switch case โปรแกรมเมอร์มือใหม่อย่างผมเคยมักง่ายใช้ตัวเลขใน Enum มาแปรหากันตรงๆ เช่น ถ้าผมมี Enum 2 ตัว Language = { None, C#, Java }; Company={ None, Microsoft, Sun } ถ้าเนื่องจากเรารู้ว่าทั้งสองตัวมีสมาชิกเท่ากัน แล้วค่าก็เท่ากันด้วย ดังนั้นมือใหม่ (ผมเองก็เคย) ก็มักจะ Cast มันออกมาตรงๆ LanguageInstance = (Language) Company; การเขียนแบบนี้มันก็ทำงานได้แล้วดูรวดเร็วสะอาดด้วยแค่บรรทัดเดียวจบ แถมความหมายก็เข้าใจง่าย เหมือนจะเป็นอะไรที่ดีมากๆ แต่มันจะมีปัญหาเวลาเราแก้ค่า Enum ครับ อย่างวันดีคืนดีเกิดมีโปรแกรมเมอร์คนอื่นเข้ามาแก้ Enum Company เพิ่มบริษัทเข้าไปเยอะๆ ล่ะ บรรทัดนี้ก็จะ Error ทันที อันนี้ยังไม่เท่าไหร่ ที่ผมเจอคืออยู่ดีๆ มีคนมาเรียงลำดับ Enum ใหม่ (คนเรียงใหม่บอกเราเรียงไม่ดี ความหมายอ่านยาก) ทีนี้ล่ะเกิดการแปลความข้อมูลผิดพลาด ซึ่งกลายเป็นบั๊กฝังลึกลงโปรแกรมทีเดียว ซึ่งถ้าเกิดแบบนี้ขึ้นนี่เราไม่รู้ตัวบางทีอาจเป็นปีๆ เลยทีเดียว ลองนึกถึงแอพพลิเคชั่นแบบสอบถามที่ผู้ใช้กาข้อ 3 แต่ดันบันทึกลงฐานข้อมูลเป็นเลข 2 ดูละกันครับ บั๊กแบบนี้นี่แค่หาเจอก็ยากแล้ว ตามแก้ยิ่งยากกว่า สิ่งที่ควรทำคือ ให้ใช้ switch-case ในการแปรข้อมูลไปมาระหว่าง Enum ทุกครั้ง เพื่อป้องกันความผิดพลาดลักษณะนี้เสมอ แม้ว่า Enum จะมีค่าเหมือนกันก็ตาม เขียนยาวหน่อย แต่ปลอดภัยกว่าครับ
Create Date : 30 สิงหาคม 2555 | | |
Last Update : 30 สิงหาคม 2555 21:22:55 น. |
Counter : 1522 Pageviews. |
| |
|
|
|