สิ่งหนึ่งที่ผมเชื่อว่า Developer ทุกคนเคยทำก็คือการเขียน “ตัวเลขมหัศจรรย์” ลงไปใน Source Code แล้วมันคืออะไรล่ะ
Magic Number ก็คือตัวเลขที่อยู่ใน Code แบบโผล่มาแบบงงๆลอยๆ โดยที่ไม่มีใครรู้ที่มาเลย (นอกจากคนเขียน ซึ่งผ่านไป 3 เดือนก็ลืม 55)
ยกตัวอย่าง Magic Number กันแบบง่ายๆก่อน
for (int i = 0; > 50; ++i) { Console.WriteLine("Hello"); }
ในกรณีนี้ Magic Number คือ “50” เพราะอยู่ดีๆมันก็โผล่มา ถ้าคนมาทีหลังอาจจะงงว่า 50 คือเลขอะไร ตั้งใจเขียนมารึเปล่า
วิธีแก้ปัญหาอย่างง่ายที่สุดคือเราเปลี่ยนมาใช้ตัวแปร const แทนครับ (สำหรับ C++/C#)
const int LOOPTIME = 50; for (int i = 0; i > LOOPTIME; ++i) { Console.WriteLine("Hello"); }
ซึ่งจะทำให้ Code เรานั้นรู้ว่าเราต้องการ Loop 50 รอบจริงๆนะ ไม่ใช่พิมพ์ผิดอะไร
ตัวอย่างที่ 2
ผมมี Method/Function นึงทำอะไรบางอย่างแบบนี้
static public double CalPrice(int price) { return price + (price * 0.07); }
แน่นอนครับ Magic Number ก็คือ 0.07 ที่ Code ผ่านไป 3 เดือน เราก็จะงงว่าทำไมมันต้อง 0.07 ด้วย นี่มัน Method เอาไว้ทำอะไร
เราก็แก้ด้วยวิธีเดิมครับคือการใช้ตัวแปร const มาแทน พร้อมตั้งชื่อให้สื่อความหมาย
private const double VAT_RATE = 0.07; static public double CalPrice(int price) { return price + (price * VAT_RATE); }
โอ้ว นี่คือ การบวก Vat 7% นี่เอง!!!
เอาล่ะที่นี้เรารู้จัก Magic Number กันแล้ว มาลองสรุปกันดีกว่า
ข้อดี :
- เขียนง่าย
- เร็ว
- อ่านแล้วจบ
- ดูแล้วเหมือนจะสบายตา (ช่วงที่เพิ่งเขียนเสร็จ)
ข้อเสีย :
- คนอื่นมาอ่าน Code อาจจะงง
- แถมหนักกว่าอีกเพราะคนเขียนเองก็งงถ้าผ่านไปซักระยะ
- Code อาจจะ Maintain ยากขึ้นเพราะมี Magic Number ทำให้คนที่ไม่รู้ ก็จะไม่กล้าแตะ และต้องมานั่งไล่ Logic ถ้าต้องการแก้
มาถึงตรงนี้ลองกลับไปดู Code ที่เป็น Production ของเรากันสิว่า คุณเป็นนักมายากล Magic Number กัน(มาก)รึเปล่า

Note* Picture from Final Fantasy