專案範例
接下來我們以一個商品紅配綠的活動範例,來瞭解 TDD 是如何實現的。為了便於理解,範例的設計將會簡化,也許會與業界實際案例有所差異。
需求規格
先來看看需求規格:
每項商品只能買一個。
當購物車加入一個紅標商品時,必須再加入一個綠標商品才可結帳。
一個紅標商品,必須只對應一個綠標商品,不可有兩個以上的紅標商品對應一個綠標商品,或是一個紅標商品對應兩個以上綠標商品的狀況。
最少要有一個紅標商品和一個綠標商品才可結帳。
當加入紅標商品和綠標商品時,購物車顯示總價應為所有商品價格總合的 75 折。
註:這裡我們就不再製作 UI ,只專注在購物車邏輯上。
架構分析
TDD 並不是一開始就要撰寫測試,而是先設計出基本的程式架構,再搭配範例情境與使用案例來撰寫測試,進而完成程式。
所以我們先進行初步的分析:
角色有兩個:購物車、商品。
商品包含品名、價格、活動標籤。
購物車有加入商品、結帳等功能。
加入商品時,不需要考慮每項商品的數量。
結帳時驗證加入的商品是否符合活動條件,並計算折扣的總價。
範例情境
接著我們要設定範例情境:
假定有四項商品,分別是:
- 紅標商品 1 - $200
- 紅標商品 2 - $160
- 綠標商品 1 - $80
- 綠標商品 2 - $100
一個購物車,其功能有:
- 加入商品
- 計算總價
- 結帳
使用案例
以下列出使用案例,讓開發者可以明確得知它們
購物車加入一個紅標商品 1 後結帳,出現「商品配對錯誤」的錯誤訊息。
購物車加入一個紅標商品 1 及綠標商品 1 ,總金額應為 ($200 + $80) * 0.75 = $210 。
購物車加入一個紅標商品 2 及綠標商品 2 ,總金額應為 ($160 + $100) * 0.75 = $195 。
購物車加入一個紅標商品 1 及綠標商品 2 ,總金額應為 ($200 + $100) * 0.75 = $225 。
購物車加入一個紅標商品 1 、紅標商品 2 及綠標商品 1 ,出現「商品配對錯誤」的錯誤訊息。
購物車加入一個紅標商品 1 、綠標商品 1 及綠標商品 2 ,出現「商品配對錯誤」的錯誤訊息。
設計
以下我們直接設計將要開發的類別:
Cart - 購物車
- addProduct - 加入購物車 (接受一個商品物件)
- checkout - 結帳 (計算總價,成功回傳
true
、失敗回傳錯誤訊息) - getTotal - 取得最後的總價
Product - 商品
- __construct - 建構子 (設定商品資訊)
- getName - 取得名稱
- getPrice - 取得單價
- getTag - 取得活動標籤 (
R
為紅標,G
為綠標)
練習
試著用圖形來表示整個專案的抽象架構圖,並說明給身邊的同學瞭解。
想想看這樣的設計規格可能會有什麼問題?使用案例是否考慮到了所有的狀況?