Skip to content

Commit ac77da5

Browse files
committed
feat: 簡化場景4,將10個Bug縮減為6個明顯易測的核心問題
- 保留最明顯的計算錯誤(加法vs乘法) - 保留功能性問題(清空按鈕、優惠券、結帳後清空) - 移除複雜的UI互動和驗證邏輯 - 提供清楚的測試指南和修復驗證方法 - 大幅降低教學複雜度,提升學習效果
1 parent 449186e commit ac77da5

2 files changed

Lines changed: 86 additions & 137 deletions

File tree

04-debugging-assistant/LESSON_GUIDE.md

Lines changed: 61 additions & 116 deletions
Original file line numberDiff line numberDiff line change
@@ -18,149 +18,94 @@
1818
├── README.md (本檔案)
1919
├── index.html (購物車介面)
2020
├── style.css (樣式檔案)
21-
├── script.js (含有 10 個 Bug 的 JavaScript)
21+
├── script.js (含有 6 個明顯 Bug 的 JavaScript)
2222
└── package.json (專案配置)
2323
```
2424

2525
## 已知問題清單
26-
此應用包含以下 10 個刻意設計的 Bug:
27-
1. 總金額計算錯誤(數學運算錯誤)
28-
2. 商品重複添加時數量更新邏輯不完整
29-
3. 運費計算邏輯有問題
30-
4. 清空購物車按鈕沒反應(函數名稱錯誤)
31-
5. 優惠券折扣計算異常
32-
6. 免運費功能沒有實現
33-
7. 套用優惠券後沒有重新計算
34-
8. 結帳後沒有清空購物車
35-
9. 數量修改時價格不會重新計算
36-
10. 移除商品時沒有確認或動畫效果
26+
此應用包含以下 6 個明顯的 Bug(簡化版,便於教學):
3727

38-
## Demo 劇本
28+
### 🔴 **核心計算錯誤**
29+
1. **總金額計算錯誤**:使用加法而不是乘法(第72行)
30+
2. **運費邏輯被覆蓋**:永遠是150元運費(第83行)
3931

40-
### **重點:快速修復與自主解決**
41-
這個場景展示 Edit 的快速修復能力和 Agent 的自主問題解決。
32+
### 🟡 **功能不完整**
33+
3. **清空購物車按鈕沒反應**:函數名稱錯誤
34+
4. **優惠券功能不完整**:FREESHIP 沒有實際作用
35+
5. **結帳後不會清空購物車**:註解掉的程式碼
4236

43-
### 階段 1:快速診斷 (2分鐘)
37+
### 🟠 **輸入驗證問題**
38+
6. **數量輸入沒有驗證**:空值會導致 NaN 錯誤
4439

45-
#### 步驟 1:快速掃描問題 (Ask)
46-
**Context 準備**:無需加入特定檔案到 context,Ask 模式會使用 @workspace 掃描整個專案
47-
48-
```
49-
@workspace 這個購物車應用有哪些嚴重的 Bug?給我前 3 個最影響使用者體驗的問題。
50-
```
51-
**使用模式:Ask**
40+
## 簡化 Demo 劇本
5241

42+
### **教學重點:讓學員輕鬆發現和測試 Bug**
5343

54-
### 階段 2:基礎修復 (5分鐘)
44+
### 階段 1:體驗 Bug(3分鐘)
5545

56-
#### 步驟 2:Edit 快速修復明顯錯誤 (Edit)
57-
**Context 準備**:開啟 `script.js` 並點擊檔案標籤上的 **+** 加入 context
46+
#### 步驟 1:開啟應用並測試
47+
1. 用瀏覽器開啟 `index.html`
48+
2. **測試場景**
49+
- 加入1台筆電(25000元)
50+
- 觀察總金額是否正確? ❌ **Bug 1**:顯示 $25,001(應該是 $25,000)
51+
- 點擊「清空購物車」按鈕 ❌ **Bug 3**:沒反應
52+
- 輸入優惠券 `FREESHIP`**Bug 4**:運費還是150元
53+
- 結帳後再加商品 ❌ **Bug 5**:之前的商品還在
5854

55+
#### 步驟 2:Ask 模式快速診斷
5956
```
60-
修復這些明顯的錯誤:
61-
1. 將 clearShoppingCart 改為 clearCart
62-
2. 將第 72 行的 + 改為 *(總金額計算)
63-
3. 刪除第 83 行(運費永遠是 150 的問題)
57+
@workspace 我測試這個購物車發現幾個問題:總金額計算錯誤、清空按鈕沒用、免運費無效。請幫我分析 script.js 中的問題。
6458
```
65-
**使用模式:Edit**
59+
**使用模式:Ask**
6660

61+
### 階段 2:Agent 修復(5分鐘)
6762

68-
#### 步驟 3:Edit 修復 UI 互動問題 (Edit)
69-
**Context 準備**:確保 `script.js` 在 context 中
70-
71-
```
72-
修復以下 UI 互動問題:
73-
1. 移除第 145 行多餘的 event.preventDefault()
74-
2. 修正第 158 行的數量輸入框事件監聽器
75-
3. 修復第 167 行的移除按鈕事件綁定
63+
#### 步驟 3:Agent 一次性修復核心問題
7664
```
77-
**使用模式:Edit**
65+
請修復這個購物車的 6 個 Bug:
66+
1. 總金額計算錯誤(第72行加法改乘法)
67+
2. 運費永遠150元(第83行)
68+
3. 清空按鈕沒反應(函數名稱錯誤)
69+
4. FREESHIP 優惠券沒有實際作用
70+
5. 結帳後不會清空購物車
71+
6. 數量輸入驗證問題
7872
79-
80-
### 階段 3:核心修復 (8分鐘)
81-
82-
#### 步驟 4:Agent 修復計算邏輯 (Agent)
83-
**Context 準備**:保持 `script.js` 在 context 中(Agent 會自動分析需要的檔案)
84-
85-
```
86-
請修復購物車的所有計算相關問題,包括總金額、運費、優惠券折扣的完整邏輯,並實現免運費功能。
73+
請一次修復完成,讓所有功能正常運作。
8774
```
88-
**使用模式:Agent**
89-
**開啟新對話**
75+
**使用模式:Agent**
9076

77+
#### 步驟 4:測試修復結果
78+
1. 重新整理頁面測試:
79+
- ✅ 加入1台筆電:總金額正確顯示 $25,150
80+
- ✅ 清空購物車按鈕:可以正常清空
81+
- ✅ 輸入 `FREESHIP`:運費變成 $0
82+
- ✅ 結帳後:購物車自動清空
9183

92-
#### 步驟 5:Ask 深入分析系統問題 (Ask)
93-
**Context 準備**:無需額外準備,使用 @workspace 進行深入分析
84+
### 階段 3:延伸功能(2分鐘)
9485

86+
#### 步驟 5:Ask 模式獲取改進建議
9587
```
96-
@workspace 分析這個購物車系統還有哪些缺失的核心功能和邏輯問題
88+
@workspace 現在購物車基本功能都正常了,還可以加入哪些提升使用者體驗的功能
9789
```
98-
**使用模式:Ask**
90+
**使用模式:Ask**
9991

92+
### **快速測試指南**
10093

101-
#### 步驟 6:Agent 實現缺失功能 (Agent)
102-
**Context 準備**
103-
- 保持 `script.js` 在 context 中
104-
- 加入 `index.html` 了解 HTML 結構(點擊檔案標籤上的 **+**
94+
#### 🧪 **Bug 測試方法**
95+
1. **總金額錯誤**:加入任何商品,金額會多1
96+
2. **運費問題**:任何金額都是150元運費
97+
3. **清空按鈕**:點擊沒反應(Console 會有錯誤)
98+
4. **免運費券**:輸入 FREESHIP 運費不會變0
99+
5. **結帳問題**:結帳後商品還在購物車
100+
6. **輸入驗證**:數量框留空再按新增會有問題
105101

106-
```
107-
請實現這些缺失的功能:
108-
1. 結帳後自動清空購物車
109-
2. 數量輸入框變更時自動更新購物車
110-
3. 移除商品時加入確認提示
111-
```
112-
**使用模式:Agent**
113-
114-
115-
### 階段 4:進階優化 (5分鈘)
116-
117-
#### 步驟 7:Agent 完善使用者體驗 (Agent)
118-
**Context 準備**:將 `script.js``index.html` 都加入 context
119-
120-
```
121-
請改善購物車的使用者體驗,包括:
122-
1. 為所有操作加入適當的成功/錯誤提示訊息
123-
2. 加入載入狀態顯示
124-
3. 改善表單驗證和錯誤處理
125-
4. 為購物車商品加入簡單的動畫效果
126-
```
127-
**使用模式:Agent**
128-
**開啟新對話**
129-
130-
131-
#### 步驟 8:Edit 細節調整 (Edit)
132-
**Context 準備**:保持 `script.js` 在 context 中
133-
134-
```
135-
請進行最後的細節調整:
136-
1. 在購物車為空時顯示提示文字
137-
2. 調整優惠券輸入框的 placeholder 文字
138-
3. 修正結帳按鈕的文字為「立即結帳」
139-
```
140-
**使用模式:Edit**
141-
142-
143-
### 階段 5:延伸應用 (2分鐘)
144-
145-
#### 步驟 9:產生測試案例文件 (Agent)
146-
**Context 準備**:將 `script.js``index.html` 都加入 context(點擊檔案標籤上的 **+**
147-
148-
```
149-
請為這個購物車應用產生完整的測試案例文件,包括正常流程和異常情況的測試項目。
150-
```
151-
**使用模式:Agent**
152-
153-
154-
#### 步驟 10:Agent 產生修復報告 (Agent)
155-
**Context 準備**:保持所有相關檔案在 context 中
156-
157-
```
158-
請產生一份詳細的修復報告,包括:
159-
1. 修復的問題清單和解決方案
160-
2. 系統改進建議
161-
3. 未來維護注意事項
162-
```
163-
**使用模式:Agent**
102+
#### **修復驗證方法**
103+
1. **總金額正確**:25000元商品顯示25000元
104+
2. **運費邏輯**:<10000收200、10000-30000收100、>30000免運
105+
3. **清空按鈕**:點擊能清空購物車
106+
4. **免運費券**:FREESHIP 讓運費變0
107+
5. **結帳清空**:結帳後購物車自動清空
108+
6. **輸入安全**:空值不會造成錯誤
164109

165110

166111
## 重點技巧

04-debugging-assistant/script.js

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
// 購物車計算器 - 含有多個 Bug 的版本
2-
// 讓 GitHub Copilot Agent 來幫你找出並修復這些問題
1+
// 購物車計算器 - 含有6個明顯Bug的簡化版本
2+
// 讓 GitHub Copilot 幫你找出並修復這些問題
33

44
let cart = [];
55
let discount = 0;
66

7-
// Bug 1: 函數名稱拼寫錯誤,但 HTML 中呼叫的是正確的名稱
7+
// ✅ 正常:新增商品到購物車
88
function addToCart(productId, price) {
99
const qtyInput = document.getElementById(productId + '-qty');
1010
const quantity = parseInt(qtyInput.value);
@@ -14,10 +14,9 @@ function addToCart(productId, price) {
1414
return;
1515
}
1616

17-
// Bug 2: 沒有正確處理商品重複添加的數量更新
17+
// 處理重複商品
1818
const existingItem = cart.find(item => item.id === productId);
1919
if (existingItem) {
20-
// Bug: 應該要更新價格或其他邏輯
2120
existingItem.quantity += quantity;
2221
} else {
2322
cart.push({
@@ -67,23 +66,23 @@ function updateCartDisplay() {
6766
}
6867

6968
function updatePricing() {
70-
// Bug 3: subtotal 計算錯誤 - 使用加法而不是乘法
69+
// 🐛 Bug 1: 金額計算錯誤 - 使用加法而不是乘法
7170
let subtotal = 0;
7271
cart.forEach(item => {
73-
subtotal += item.price + item.quantity; // 錯誤:應該是 *
72+
subtotal += item.price + item.quantity; // 錯誤:應該是 *
7473
});
7574

76-
// Bug 4: 運費計算邏輯錯誤
75+
// 🐛 Bug 2: 運費邏輯被覆蓋
7776
let shipping = 0;
7877
if (subtotal < 10000) {
7978
shipping = 200; // 基本運費
8079
} else if (subtotal < 30000) {
8180
shipping = 100; // 中等運費
8281
}
83-
// 超過 30000 免運費,但這個邏輯被下面的代碼覆蓋了
84-
shipping = 150; // Bug: 永遠是 150
82+
// 超過 30000 免運費,但被下面的代碼覆蓋了
83+
shipping = 150; // Bug: 永遠是 150
8584

86-
// Bug 5: 優惠券折扣在某些情況下計算異常
85+
// ✅ 正常:優惠券折扣計算
8786
const discountAmount = subtotal * (discount / 100);
8887
const total = subtotal + shipping - discountAmount;
8988

@@ -94,23 +93,23 @@ function updatePricing() {
9493
document.getElementById('total').textContent = `$${total.toLocaleString()}`;
9594
}
9695

96+
// ✅ 正常:移除商品
9797
function removeFromCart(index) {
98-
// Bug 10: 移除商品時沒有確認或動畫效果
9998
cart.splice(index, 1);
10099
updateCartDisplay();
101100
}
102101

103-
// Bug 6: 清空購物車函數名稱錯誤
104-
function clearShoppingCart() { // HTML 中呼叫的是 clearCart()
102+
// 🐛 Bug 3: 函數名稱錯誤
103+
function clearShoppingCart() { // HTML 中呼叫的是 clearCart()
105104
cart = [];
106105
discount = 0;
107106
updateCartDisplay();
108107
}
109108

109+
// 🐛 Bug 4: 優惠券功能不完整
110110
function applyCoupon() {
111111
const couponCode = document.getElementById('coupon-code').value.toUpperCase();
112112

113-
// Bug 7: 優惠券邏輯有問題
114113
switch (couponCode) {
115114
case 'SAVE10':
116115
discount = 10;
@@ -121,7 +120,7 @@ function applyCoupon() {
121120
alert('已套用 20% 折扣!');
122121
break;
123122
case 'FREESHIP':
124-
// Bug: 免運費功能沒有實現
123+
// Bug: 免運費功能沒有實現,只顯示訊息
125124
alert('已套用免運費!');
126125
break;
127126
default:
@@ -130,10 +129,10 @@ function applyCoupon() {
130129
}
131130

132131
document.getElementById('coupon-code').value = '';
133-
// Bug 7: 沒有正確更新優惠券狀態
134-
updatePricing();
132+
updatePricing(); // ✅ 正常:會更新價格
135133
}
136134

135+
// 🐛 Bug 5: 結帳後不會清空購物車
137136
function checkout() {
138137
if (cart.length === 0) {
139138
alert('購物車是空的!');
@@ -143,9 +142,14 @@ function checkout() {
143142
const total = document.getElementById('total').textContent;
144143
alert(`結帳成功!總金額:${total}`);
145144

146-
// Bug 8: 結帳後沒有清空購物車
145+
// ❌ Bug: 結帳後沒有清空購物車
147146
// clearCart();
148147
}
149148

150-
// Bug 9: 當使用者修改商品數量時,沒有自動更新購物車
151-
// 應該要監聽 input 事件並重新計算
149+
// 🐛 Bug 6: 點擊新增按鈕時,如果輸入框是空的會出錯
150+
function validateAndAdd(productId, price) {
151+
const qtyInput = document.getElementById(productId + '-qty');
152+
const quantity = qtyInput.value; // ❌ Bug: 沒有檢查 NaN
153+
154+
addToCart(productId, price);
155+
}

0 commit comments

Comments
 (0)