Screen Shot 2558-06-01 at 12.52.02 PM
ในปัจจุบัน แนวคิด TDD (Test-Driven Development) นั้น
ถูกนำมาใช้เยอะขึ้น แต่ปัญหาที่ตามมาก็คือ
ปกติเพียงเขียน code มันก็ยากอยู่แล้ว
ยังต้องมาเขียน test ด้วย มันก็งานเป็นสองเท่าเลยนะสิ !!

ยังไม่พอนะ
เมื่อทำการแก้ไข ก็ต้องแก้ไขทั้ง code และ test
ชีวิตมันเข้าขั้นวิกฤติอย่างมากมาย

แต่ปัญหาหนึ่งที่พบมากก็คือ
การไม่ดู code ของ test ให้มันดี และ เข้าใจง่าย
ซึ่งทำให้เกิดสิ่งที่เรียกว่า Test Smell
หรือปัญหาของ test นั่นเอง

หนึ่งใน Test Smell เกี่ยวกับเรื่อง readability
นั่นก็คือ Magic number
มาดูกันว่าเป็นอย่างไร ?

Test Smell คืออะไร

มันคือปัญหาที่เกิดใน code ของ test
ส่งผลให้ developer อ่าน test ยาก
ส่งผลให้ developer ต้องใช้เวลาในการทำความเข้าใจ test นาน
ส่งผลให้ developer ดูแลรักษา test ยาก
ส่งผลให้ developer ไม่เชื่อมั่นใน test
และส่งผลอีกมากมาย …

ปัญหาเรื่อง Magic number ใน test เป็นอย่างไร ?

ปกติใน code ของเรานั้น เรื่อง magic number
มันก็คือ ตัวเลขอะไรก็ไม่รู้ที่อยู่ใน code ของเรา
เมื่อทำการอ่าน code แล้วจะต้องมานั่งตีความว่ามันคืออะไร
เช่น flag = 1

คำถามคือ 1 มันคืออะไร ?
และมักจะได้คำตอบในทำนองที่ว่า
น่าจะ … ลองไปไล่ code … หรือ ถาม … ดูสิ
ซึ่งเราจะพบเจอมากๆ ใน code !!

ใน test ก็เช่นกัน …

อาจจะไม่เห็นภาพ มาดูตัวอย่างดีกว่า

คำถาม
คุณเห็น Magic number ไหม ?
คำตอบ
10 คืออะไร ? หมายถึงอะไร ?
12 คืออะไร ? หมายถึงอะไร ?

ทำอย่างไรดีล่ะ ให้ test ชุดนี้มันอ่านง่ายขึ้น ?
ก่อนอื่นเราต้องถามตัวเองก่อนว่า test นี้ต้องการจะทดสอบอะไร
หรือต้องหาคำอธิบายให้ได้ว่า พฤติกรรมคืออะไร
มาเริ่มกันเลย
สิ่งที่เราต้องการทดสอบคือ
10 คือ จำนวน pin ที่ทำได้
12 คือ จำนวนครั้งในการโยน
รวมๆ กันก็คือ ทำ stike12 ครั้ง หรือ perfect game นั่นเอง
ซึ่งจะได้คะแนนสูงสุด คือ 300 คะแนน

แต่เมื่อกลับมาดู test แล้ว
มันไม่ได้สื่อความหมายในแบบที่เราต้องการเลยใช่ไหม ?
นั่นแสดงว่า เราต้องทำการแก้ไข test แล้วนะ …

วิธีการที่ง่ายที่สุด

คือ การแทนที่ magic number ด้วยค่าคงที่ (constant variable)
เพื่อทำให้อ่านเข้าใจมากยิ่งขึ้น
ดังตัวอย่าง

แต่ถ้ามีหลายๆ test ต้องใช้งานทั้งสองส่วนล่ะ
การใช้ค่าคงที่เยอะๆ คงไม่เหมาะสมนัก
ดังนั้น เราจึงมีอีกแนวทางคือ การสร้างเป็น method ขึ้นมาใน test ดังนี้

จากตัวอย่าง
ทำการสร้าง method pins และ times ขึ้นมา
เพื่อให้ test อื่นๆ นำไปใช้งานได้ง่าย
ซึ่งสามารถกำหนดจำนวน pin และ จำนวนครั้งได้อีกอีกด้วย

โดยสรุปแล้ว

Magic number มันคือ ตัวเลขที่อยู่ใน code
มันไม่สามารถสื่อสารอะไรออกมาได้เลย
ว่าตัวมันเองคืออะไร อย่างไร
ดังนั้น สิ่งที่ developer ต้องทำ คือ ลด ละ เลิก

แนวทางการแก้ไขที่ง่ายสุดๆ คือ
การเปลี่ยน magic number มาอยู่ในรูปแบบของ
local variable ซะ พร้อมชื่อที่อธิบายตัวมันเองได้
หรือก็สร้างค่าคงที่ขึ้นมา ด้วยชื่อดีๆ อีกนั่นแหละ
หรือทำเป็น method ดังตัวอย่างข้างต้น

Developer บางคนถูกสอนมาว่า
จะต้องเขียน code ที่ทำงานได้เร็วสุดๆ
จะต้องเขียน code ให้สั้นที่สุด
มันเป็นแนวทางที่ไม่ผิดเลย

แต่สิ่งที่พบเจอคือ เมื่อต้องกลับมาแก้ไข code เหล่านั้น
กลับพบว่า มันอ่านทำความเข้าใจยากมากๆ
ซึ่งนั่นคือ ปัญหาใช่หรือไม่…
หนึ่งในนั้นคือ magic number

ดังนั้น ควรต้องสร้างสมดุลของ code ให้เกิดขึ้นมาด้วยนะครับ

ส่วน Test smell เรื่องอื่นๆ จะนำมามาเขียนใน blog ต่อๆ ไปครับ

Reference Website
http://langrsoft.com/jeff/2010/03/goofy-tdd-construct/