Group Blog
 
All Blogs
 
ข้อควรจำในการใช้ 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 น. 0 comments
Counter : 1294 Pageviews.

ชื่อ : * blog นี้ comment ได้เฉพาะสมาชิก
Comment :
  *ส่วน comment ไม่สามารถใช้ javascript และ style sheet
 

Mariel
Location :


[Profile ทั้งหมด]

ให้ทิปเจ้าของ Blog [?]
ฝากข้อความหลังไมค์
Rss Feed
Smember
ผู้ติดตามบล็อก : 1 คน [?]




Friends' blogs
[Add Mariel's blog to your web]
Links
 

 Pantip.com | PantipMarket.com | Pantown.com | © 2004 BlogGang.com allrights reserved.