จากหนังสือ TDD by Example ทำการอธิบายวิธีการแก้ไขปัญหา
เพื่อย้ายจากสถานะ RED ไปยัง GREEN ตาม life cycle ของ TDD ไว้ 3 วิธีการคือ
- Obvious implementation
- Fake it until you make it
- Triangulation
1. Obvious implementation
มันคือเขียน code สำหรับแก้ไขปัญหานั้นได้ทันที ดังนั้นผู้แก้ไขปัญหาจำเป็นต้องมีความรู้เกี่ยวกับปัญหาอย่างชัดเจน รู้ว่าจะแก้ไขปัญหาอย่างไร รู้ว่าต้องเขียน code อย่างไรเป็นอย่างดี ทำให้สามารถเขียน code เพื่อแก้ไขปัญหาได้ทันที เช่นการคำนวณหาพื้นที่สี่เหลี่ยม สามารถเขียน code ได้ดังนี้ เริ่มต้นจากการเขียน test ก่อนเสมอ [gist id="d91095c709f0db4d211dc3dcfb85947d" file="test_01.java"] ซึ่งถ้าเราใช้วิธีการแก้ไขปัญหาแบบแรก สามารถเขียน code ได้ดังนี้ [gist id="d91095c709f0db4d211dc3dcfb85947d" file="solution_01.java"] แต่ลองคิดดูสิว่า ถ้าปัญหาที่เราต้องการแก้ไขมันยากและซับซ้อนล่ะ ? การจะเขียน code ออกมาทีเดียวทั้งหมดไม่น่าจะเป็นเรื่องที่ดีแน่ ๆ เนื่องจากต้องใช้เวลาแก้ไขนานมาก ๆ ดังนั้นมาดูวิธีการต่อไป2. Fake it until you make it
ถ้าคุณรู้ปัญหา และ วิธีการแก้ไขปัญหา แต่ยังไม่มั่นใจในการเขียน code แนะนำให้ทำการ Fake ผลการทำงานก่อน เพื่อทำการการทดสอบผ่าน จากนั้นจึงหยุด และกลับมาดู code เพื่อวิเคราะห์ว่า ทำไมเราถึง fake คำตอบไว้ ? การ fake มีที่มาจากอะไรบ้าง ? มาดูตัวอย่างของการหาพื้นที่สี่เหลี่ยมเหมือนเดิม สามารถเขียน code ชุดแรกได้ดังนี้ [gist id="d91095c709f0db4d211dc3dcfb85947d" file="solution_021.java"] ผลก็คือทดสอบผ่านแน่นอน จากนั้นลองมาคิดหน่อยสิว่า สูตรการหาพื้นที่สี่เหลี่ยมคืออะไร ? มันคือกว้างคูณยาวใช่หรือไม่ ? ดังนั้นสามารถแก้ไข code ได้ดังนี้ [gist id="d91095c709f0db4d211dc3dcfb85947d" file="solution_022.java"] ผลก็คือทดสอบผ่านแน่นอน จากนั้นให้เริ่มแทนที่ค่าที่ Fake ขึ้นมาด้วยตัวแปรซะ จะทำให้ได้ code ที่สามารถแก้ไขปัญหาได้ แต่ถ้า developer ไม่รู้ว่าจะแก้ไขปัญหาอย่างไรล่ะ ? จะทำอย่างไรดี ?3. Triangulation
เป็นวิธีการที่ผมใช้บ่อยมาก ๆ สำหรับการแก้ไขปัญหาที่เรายังไม่รู้วิธีการจริง ๆ แต่ใช้ test case เป็นตัวช่วยนำทาง รวมเข้ากับข้อมูลในการทดสอบ จากตัวอย่างการหาพื้นที่สี่เหลี่ยม เราสามารถเริ่มด้วยข้อมูลต่าง ๆ เหล่านี้ได้- Case 1 : width = 0, height = 0 ผลที่ได้คือ 0
- Case 2 : width = 1, height = 1 ผลที่ได้คือ 1
- Case 3 : width = 1, height = 2 ผลที่ได้คือ 2
สุดท้ายแล้ว ในการแก้ไขปัญหาต่าง ๆ
ขอให้เริ่มแบบ step-by-step โดยเริ่มจาก test case ที่ง่ายสุด ๆ ก่อน จากนั้นก็ค่อย ๆ เพิ่มความซับซ้อนเข้ามา เพื่อทำให้เรามีกำลังใจในการแก้ไขปัญหาแต่ปัญหาหลักของ developer คือ ไม่สามารถแยกปัญหาใหญ่ ๆ ออกเป็นปัญหาย่อย ๆ ได้นะสิ !!