magic-number
เชื่อว่านักพัฒนาหลายๆ คน เมื่อเริ่มพัฒนาระบบงาน
มักจะใช้เครื่องมือพวก CheckStyle และ FindBugs
เพื่อนำมาช่วยให้เรา

  • ตรวจสอบดูว่า code เรามันมีรูปแบบตามมาตรฐานที่ตกลงกันไว้หรือไม่
  • เป็นสิ่งบอกทางให้เราว่า ผิด หรือ ถูก
  • ช่วยวิเคราะห์ code ว่าส่วนไหนอาจจะเกิด bug ได้

สิ่งเหล่านี้ เราเรียกว่า Static Code Analysis
มีใครนำมาใช้บ้างนะ ?

ปัญหาที่เรามักเจอ

เมื่อเรานำเครื่องมือเหล่านี้มาใช้ตัวอย่างเช่น CheckStyle สำหรับตรวจสอบ Magic Number 
ซึ่ง Magic number มันคือ ตัวเลขที่เรามักใช้ใน code เป็นประจำ
เช่น -1, 0, 1 และ 2
โดยเรามักพบว่า มันคือปัญหาว่าตัวเลขแต่ละตัว มันหมายถึงอะไร ?

ส่วนการแก้ไขมันง่ายมากๆ คือ สร้างตัวแปรค่าคงที่ขึ้นมาสิ
และโชคไม่ดีเท่าไร ที่นักพัฒนามักจะทำแบบนี้

private static final int ZERO = 0;
private static final int ONE = 1;
private static final int TWO = 2;

หรือ

String name = result.getString(1);
String address = result.getString(1+2);
String country = result.getString(1+2+3);

หรือไม่เช่นนั้น ก็ทำการเขียน comment เข้าไปใน code
เพื่ออธิบายว่า Magic number เหล่านั้นหมายถึงอะไร

คำถาม
คุณคิดว่า การแก้ไขปัญหาแบบนี้มันช่วยเราหรือไม่ ?
คำตอบ
มันไม่ได้ช่วยให้อะไรดีขึ้นเลย ใช่ไหม ?
ถึงแม้ว่า CheckStyle มันจะบอกว่าไม่มี Magic Number แล้วก็ตาม

ดังนั้น สิ่งที่นักพัฒนาต้องทำก็คือ การตั้งชื่อตัวแปรให้เหมาะสม หรือ สื่อถึงการใช้งานจริง

ในบางกรณี มันคือ Magic number แต่ไม่ใช่ปัญหา

สิ่งที่ต้องระวังอีกก็คือ ถ้าดูแบบผ่านๆ เหมือนว่าจะเป็น Magic number นะ
แต่ว่าในความเป็นจริงมันไม่ใช่นะสิ !!
หรืออาจจะเป็น Magic number แต่มันไม่ได้แย่นะ

ตัวอย่างเช่น

double result = input * 100;
double sizeInMB = size / 1024;

ความหมายของตัวเลขที่ใช้ทั้ง 100 และ 1024 ยังคงชัดเจน คือ

  • 100 คือ การทำให้ข้อมูลเป็นเปอร์เซนต์
  • 1024 คือ การแปลงค่าของข้อมูลจาก KB ไปยัง MB

ดังนั้น เราไม่จำเป็นต้องแก้ไขปัญหาของ Magic number
ด้วยการ extract ออกไปเป็นตัวแปรก็ได้นะครับ
ถ้าตัวเลขนั้นมันสามารถสื่อสารออกไปได้ชัดเจน

ลองคิดดูเล่นๆ นะครับ ระหว่าง

int[] inputArray = new int[100];

กับ

int[] inputArray = new int[ MAX_SIZE_OF_EMPLOYEE ];

แบบไหนที่สามารถสื่อสารได้ชัดเจนมากกว่ากัน ?
แบบไหนที่ทำให้เรา และ คนอื่นๆ อ่านง่าย ?
แบบไหนที่ทำให้เราเข้าใจได้ง่ายขึ้น ?

เป้าหมายที่แท้จริงของการ extract
สิ่งที่เรียกว่า Magic number ออกมาเป็นตัวแปร หรือ ค่าคงที่
ก็เพื่อความเข้าใจของคนอ่าน code ล้วนๆ