不會,就練。練多了,就會了。
一個 Solution 是不是你想出來的、一項技術你究竟熟不熟,可以一時騙過別人,但總有一天得拿真實成果驗證。TDD(Test-Driven Development,測試驅動開發)也是一樣,光看不練是練不起來的。本章透過一個公開的練習題,做一次 TDD 實彈演習。
Magneto Effect#
如果你常用繪圖軟體或畫 UML 流程圖的工具,應該體驗過一個功能:在已存在的點附近按一下,不用按得太準,滑鼠會自動「滑」到原來的點上,就像被磁鐵吸過去一樣。Magneto Effect 這個練習題就是要實作這個工具。
舉例來說:
- 畫面上已有一個錨點 (50, 50)。
- 假設磁力作用範圍是 5。
- 滑鼠在 (49, 50) 被按下時,因為落在錨點影響範圍內,就被吸到 (50, 50)。
- 如果同時有多個錨點都在範圍內,就吸到「最近」的那個。
列測項#
開始寫程式前,先列一份測項清單,作為待會兒實作的目標物。安排這份清單時,有幾個原則:
- 從簡單情境開始,再一步步加入複雜度。
- 可以先處理介面等細節,再導入主要的運算邏輯。
- 注意測項彼此的依賴關係。
- 中途若發現要新增、修改或調換順序,就大方調整。
假設磁力作用範圍是 5,可整理出以下測項:
| 錨點 | 滑鼠原位置 | 滑鼠新位置 | 測試功能 |
|---|---|---|---|
| - | (49, 50) | (49, 50) | 定介面、沒有錨點 |
| (50, 50) | (49, 50) | (50, 50) | 距離夠近 |
| (0, 0) | (49, 50) | (49, 50) | 距離很遠 |
| (50, 50)、(0, 0) | (49, 50) | (50, 50) | 兩個錨點,一個在附近 |
| (50, 49)、(50, 50) | (49, 50) | (50, 50) | 兩個錨點,都在附近 |
有了這份清單,後續就能按部就班,每完成一項就走完一輪「紅燈(Red) ➡️ 綠燈(Green) ➡️ 重構(Refactor)」,逐步把功能長出來。
演示#
題目本身不算難,但 TDD 過程中每一步都會比較細碎。原文作者選擇用未經剪接的影片完整呈現整個流程,包含中間卡關與除錯的真實情境,讀者可以到原文觀看。覺得語速偏慢的話,可以用 1.5 倍速服用。
結論#
透過這個小題目,我們可以對 TDD 的實際運作多一些感覺。但只看不夠,要享受 TDD 帶來的好處,必須累積一定份量的練習。
作者不建議一開始就拿工作中的專案來練 TDD,尤其「絕對不要」在上班時間練習。
理由是:寫工作的程式有時間壓力,壓力一來,你會難以堅持還沒掌握訣竅的新方法,會更傾向回到原本熟悉的寫法,於是又練不到。效率不彰的練習不如不練。比較好的做法是:
- 找一段下班時間。
- 上網挑一個和工作無關的小題目,例如 Code Wars 上的練習。
- 安心地用 TDD 的節奏走完整個流程。
天才與庸才的差別,不在基因,不在天分,而在刻意練習。
原文出處#
- 原書/iThome:https://ithelp.ithome.com.tw/articles/10267462