Quantcast
Channel: cc :: somkiat
Viewing all articles
Browse latest Browse all 1997

วิธีการแก้ไขปัญหาตามแนวคิด Test-Driven Development (TDD)

$
0
0

empnuwexfdhu2ubpk20x

empnuwexfdhu2ubpk20x จากหนังสือ TDD by Example ทำการอธิบายวิธีการแก้ไขปัญหา เพื่อย้ายจากสถานะ RED ไปยัง GREEN ตาม life cycle ของ TDD ไว้ 3 วิธีการคือ
  • Obvious implementation
  • Fake it until you make it
  • Triangulation
ซึ่งการจะเลือกใช้วิธีการใดนั้น มันขึ้นอยู่กับความรู้ความเข้าใจต่อปัญหาของ developer มันขึ้นอยู่กับแนวทางในการแก้ไขปัญหาของ developer มันขึ้นอยู่กับความสามารถของ developer จึงทำการสรุปพร้อมตัวอย่างไว้นิดหน่อย เพื่อทำให้เราสามารถเดินไปข้างหน้าได้อย่างสม่ำเสมอ จนสามารถแก้ไขปัญหาต่าง ๆ ได้ มาเริ่มกันเลย

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
ถ้าเขียน code จะได้ดังนี้ เริ่มที่ case 1 เพื่อทำให้ผ่านก็ทำการ fake ผลการทำงานได้เลย [gist id="d91095c709f0db4d211dc3dcfb85947d" file="case01.java"] มาที่ case 2 เป็นการเปลี่ยนค่า input เพื่อใช้แก้ไขปัญหาเดิม เพียงแค่ต่างมุมมองเท่านั้นเอง ถ้าต้องการให้ผ่านทั้ง 2 case จึงเกิดการสร้างตัวแปร width ขึ้นมาเก็บค่า [gist id="d91095c709f0db4d211dc3dcfb85947d" file="case02.java"] มาที่ case 3 เป็นการบังคับให้เราต้องสร้างตัวแปร height ขึ้นมา ซึ่งทำให้เกิดวอธีการแก้ไขปัญหาจริง ๆ ขึ้นมา [gist id="d91095c709f0db4d211dc3dcfb85947d" file="case03.java"] เป็นวิธีการที่ดูเหมือนโง่ แต่ก็โง่จริง ๆ แต่สิ่งที่เราได้รับกลับมาคือ ได้รู้ลำดับขั้นตอนการแก้ไข รวมทั้งเหตุผลของการสร้างตัวแปรชนิดต่าง ๆ ขึ้นมา ซึ่งเหมาะมากสำหรับการแก้ไขปัญหาที่ซับซ้อน สังเกตุไหมว่า การแก้ไขปัญหาแบบที่ 3 เหมือนดังรูป triangulation

สุดท้ายแล้ว ในการแก้ไขปัญหาต่าง ๆ

ขอให้เริ่มแบบ step-by-step โดยเริ่มจาก test case ที่ง่ายสุด ๆ ก่อน จากนั้นก็ค่อย ๆ เพิ่มความซับซ้อนเข้ามา เพื่อทำให้เรามีกำลังใจในการแก้ไขปัญหา
แต่ปัญหาหลักของ developer คือ ไม่สามารถแยกปัญหาใหญ่ ๆ ออกเป็นปัญหาย่อย ๆ ได้นะสิ !!

Viewing all articles
Browse latest Browse all 1997

Trending Articles