ตัวเลขมหัศจรรย์ Magic Number

สิ่งหนึ่งที่ผมเชื่อว่า 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 กัน(มาก)รึเปล่า

piq_52779_400x400
I love Magic (but sorry not Magic Number!!) 

Note* Picture from Final Fantasy

 

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s