ทำความเข้าใจเกี่ยวกับ Magic Numbers
ในการเขียนโค้ด: ทำไมมันจึงอาจเป็นปัญหา
ในโลกของการโปรแกรม ความชัดเจนและการจัดการโค้ดมีความสำคัญมาก อย่างไรก็ตาม หนึ่งในกับดักที่พบบ่อยที่นักพัฒนาหลายคนพบคือ magic numbers ที่มีชื่อเสียง แต่จริง ๆ แล้ว magic numbers คืออะไร และทำไมนักโปรแกรมที่มีประสบการณ์จึงแนะนำให้หลีกเลี่ยงการใช้งาน? บล็อกโพสต์นี้จะขุดลึกเข้าไปในแนวคิดเกี่ยวกับ magic numbers และสำรวจปัญหาที่อาจเกิดขึ้นจากการปฏิบัติในการเขียนโค้ด
Magic Numbers คืออะไร?
Magic number หมายถึงค่าตัวเลขที่ถูกนำมาใช้โดยตรงในโค้ดโดยไม่มีคำอธิบาย ซึ่งอาจส่งผลเสียเพราะขาดบริบทรอบๆ และอาจทำให้โค้ดอ่านยากและบำรุงรักษายากขึ้น ตัวอย่างเช่น พิจารณาชิ้นโค้ดต่อไปนี้จาก Java:
public class Foo {
public void setPassword(String password) {
// อย่าทำแบบนี้
if (password.length() > 7) {
throw new InvalidArgumentException("password");
}
}
}
ที่นี่ หมายเลข 7
ถูกใช้โดยตรงในการกำหนดข้อจำกัดในความยาวของรหัสผ่าน วิธีการนี้อาจกลายเป็นปัญหาสำหรับหลายเหตุผล:
- ขาดความชัดเจน: ผู้อ่านอาจไม่เข้าใจว่าทำไมถึงเลือกหมายเลขเฉพาะนี้
- การบำรุงรักษายาก: หากข้อจำกัดเปลี่ยนแปลงไป จะต้องมีการอัปเดตในหลายสถานที่
ปัญหาจากการใช้ Magic Numbers
นักโปรแกรมจำนวนมากโต้แย้งว่าควรหลีกเลี่ยงการใช้ magic numbers เนื่องจากเหตุผลดังต่อไปนี้:
- ปัญหาความสามารถในการอ่าน: นักพัฒนาที่มาทีหลัง (หรือแม้แต่ตัวคุณเองในอนาคต) อาจมีปัญหาในการแปลความหมายของหมายเลข
- เสี่ยงต่อข้อผิดพลาด: การใช้งาน magic number ในหลายสถานที่อาจนำไปสู่ความไม่ตรงกันหากการเปลี่ยนแปลงไม่ถูกนำไปใช้ในทุกที่
- ความท้าทายในการรีแฟคเตอร์: เมื่อจำเป็นต้องแก้ไขค่า มันสามารถก่อให้เกิดบั๊กและความไม่สอดคล้องกันได้หากคุณพลาดกรณีหนึ่งในระหว่างการอัปเดต
วิธีที่ดีกว่า: การรีแฟคเตอร์ Magic Numbers
เพื่อจัดการกับปัญหา magic number ควรปฏิบัติตามแนวทางที่ดีที่สุดในการแทนที่พวกมันด้วยค่าคงที่ที่มีชื่อ สิ่งนี้จะช่วยปรับปรุงความสามารถในการอ่านและการบำรุงรักษาของโค้ด มาทำการรีแฟคเตอร์ตัวอย่างก่อนหน้านี้เพื่อให้มีความชัดเจนมากขึ้น:
public class Foo {
public static final int MAX_PASSWORD_SIZE = 7;
public void setPassword(String password) {
if (password.length() > MAX_PASSWORD_SIZE) {
throw new InvalidArgumentException("password");
}
}
}
ประโยชน์ของการใช้ค่าคงที่ที่มีชื่อ
- ความสามารถในการอ่านที่ดีขึ้น: ใครก็สามารถเห็นว่า
MAX_PASSWORD_SIZE
หมายถึงความยาวรหัสผ่านสูงสุด ทำให้เจตนาชัดเจนโดยไม่ต้องดำน้ำไปอ่านเอกสาร - การบำรุงรักษาง่ายขึ้น: หากคุณต้องการเปลี่ยนความยาวของรหัสผ่าน คุณเพียงแค่ต้องอัปเดตค่าคงที่ นี่จะช่วยป้องกันความเสี่ยงในการพลาดกรณีหนึ่ง ๆ ทำให้เกิดความสอดคล้องในโค้ดของคุณ
เครื่องมือที่ช่วย
เครื่องมือพัฒนาหลายตัวสามารถช่วยในการระบุ magic numbers เครื่องมืออย่าง FindBugs และ PMD สามารถวิเคราะห์โค้ดของคุณและแนะนำโอกาสในการรีแฟคเตอร์เพื่อลบ magic numbers การใช้เครื่องมือเหล่านี้สามารถช่วยปรับปรุงคุณภาพของโค้ดและประสบการณ์การพัฒนาของคุณโดยรวม
บทสรุป
Magic numbers อาจนำไปสู่โค้ดที่อ่านยากและบำรุงรักษายาก โดยการใช้ค่าคงที่ที่มีชื่อแทน คุณสามารถปรับปรุงความชัดเจนและลดข้อผิดพลาดในโค้ดของคุณ ในฐานะแนวทางปฏิบัติที่ดีที่สุด ควรตั้งเป้าหมายในการเขียนโค้ดที่เข้าใจได้ซึ่งสามารถปรับตัวเข้ากับการเปลี่ยนแปลงได้ง่าย ครั้งต่อไปที่คุณต้องพิมพ์หมายเลขโดยตรงในโค้ดของคุณ ให้คิดสักครู่และพิจารณาการรีแฟคเตอร์เพื่อผลลัพธ์ที่ดีกว่าในระยะยาว
โดยการแก้ไขปัญหาเกี่ยวกับ magic numbers คุณจะไม่เพียงแค่ยกระดับคุณภาพของโค้ดของคุณ แต่ยังมีส่วนร่วมในการสร้างโค้ดที่มีความทนทานและบำรุงรักษาง่ายขึ้นด้วย