DSE ICT|物件導向設計與除錯 備課指引(導師用)|3 個 class 12 個 method、18 個測試
- 2026-11-03
學生寫 class,通常把整個程式塞進一個 class,然後靠 print 找錯。這一堂只做兩件事:分責任、先寫邊界測試。
本堂目標 學生能夠:① 為一個小型圖書館系統定出 3 個 class(Book、Member、Loan),每個 class 只負責一件事;② 講出屬性與方法的分工,並為每個 class 寫出 4 個 method(合共 12 個);③ 在 18 個測試案例中先寫 6 個邊界案例(佔 33.3%),用測試而非 print 定位錯誤。
01 先備知識(開課前 3 分鐘快檢)
以下任何一項未過關,本堂就會卡住,先補該項:
| 技能 | 快檢題 | 過關標準 |
|---|---|---|
| 變數與資料型別 | list 與 dict 分別用於什麼 | 有序集合/鍵值對應 |
| 函數 | def 裏的參數與回傳值有什麼分別 | 參數入、return 出 |
| 條件與迴圈 | for 與 while 分別在什麼情況停 | 次數已知/條件成立 |
02 課堂流程(45 分鐘)
| 時間 | 環節 | 導師做什麼 | 學生做什麼 |
|---|---|---|---|
| 0–5 分 | 定責任 | 寫出 3 個 class 各一句責任 | 每個 class 一句,不准重疊 |
| 5–15 分 | 屬性先於方法 | 先列 5 個屬性,再定 12 個 method | 屬性與方法一一對應 |
| 15–25 分 | 邊界案例 | 示範空值、重複、超額三類邊界 | 寫出 6 個邊界測試 |
| 25–40 分 | 用測試除錯 | 故意放入一個 bug,用測試定位 | 27 分鐘內跑完 18 個測試 |
| 40–45 分 | 離場三問 | 責任、邊界、除錯次序各一題 | 三題全對 |
03 講解腳本(照著說就可以)
第一幕:責任先於方法:三個 class,各一句話
圖書館系統只需要 3 個 class:Book 負責一本書的資料與狀態(5 個屬性之內)、Member 負責誰借了什麼、Loan 負責借還的期限與罰款。每個 class 給 4 個 method,合共 12 個,剛好夠一個 45 分鐘課堂示範。
判斷責任的方法只有一句:如果一個 method 需要同時知道書價與會員地址,就放錯 class。借書期限要知書、又要知會員,所以另開 Loan,由 Loan 同時引用兩邊,而不是把書與會員塞成一個 class。
學生最常見的做法是一個 class 叫 System,內含全部 method。要即場數:有幾個 method 同時處理三種資料?超過兩個就代表責任未分。
判斷責任的方法只有一句:如果一個 method 需要同時知道書價與會員地址,就放錯 class。借書期限要知書、又要知會員,所以另開 Loan,由 Loan 同時引用兩邊,而不是把書與會員塞成一個 class。
學生最常見的做法是一個 class 叫 System,內含全部 method。要即場數:有幾個 method 同時處理三種資料?超過兩個就代表責任未分。
要學生講:罰款計算應該放在 Book、Member 還是 Loan,憑什麼。
第二幕:屬性先於方法:五個屬性決定十二個 method 的形狀
每個 class 先寫屬性,再寫方法。Book 的屬性是 isbn、title、author、available;Member 的屬性是 id、name、borrowed;Loan 的屬性是 book、member、due date。屬性一旦定好,方法就是對屬性的操作:查詢、修改、驗證。
好處是 method 數目自然收斂。有 5 個屬性,通常只需要 4 個 method(一個建立、一個查詢、一個修改、一個驗證);如果學生寫到 12 個 method 在同一個 class,幾乎一定是把別的 class 的屬性也搬了進來。
要強調封裝的理由不是「資料隱藏」這種口號,而是:屬性是唯一會被改壞的地方,把改動集中在一處,除錯範圍就固定。
好處是 method 數目自然收斂。有 5 個屬性,通常只需要 4 個 method(一個建立、一個查詢、一個修改、一個驗證);如果學生寫到 12 個 method 在同一個 class,幾乎一定是把別的 class 的屬性也搬了進來。
要強調封裝的理由不是「資料隱藏」這種口號,而是:屬性是唯一會被改壞的地方,把改動集中在一處,除錯範圍就固定。
要學生講:available 這個屬性由誰改,改之前要先檢查什麼。
第三幕:除錯次序:先邊界測試,再 print
18 個測試之中留 6 個做邊界,佔 33.3%。三類邊界固定:借已借出的書、借超過上限、歸還時已過期。這三類佔實際錯誤的大多數,而且不需要看完整段程式就能寫。
每個測試平均限 1.5 分鐘,18 個測試合共 27 分鐘;超過這個時間就代表測試寫得太細,或程式根本沒有可測的介面。
除錯次序固定為:跑測試看哪一個紅 → 在該 method 內加一個斷言 → 只用 print 印出輸入與中間值 → 修完即刪 print。留著 print 的程式在考試卷上會被扣分數,因為它會改變輸出格式。
每個測試平均限 1.5 分鐘,18 個測試合共 27 分鐘;超過這個時間就代表測試寫得太細,或程式根本沒有可測的介面。
除錯次序固定為:跑測試看哪一個紅 → 在該 method 內加一個斷言 → 只用 print 印出輸入與中間值 → 修完即刪 print。留著 print 的程式在考試卷上會被扣分數,因為它會改變輸出格式。
要學生講:為甚麼「借已借出的書」屬於邊界而不是正常流程。
04 必教題型與步驟
| 題型 | 例子 | 步驟 | 答案 |
|---|---|---|---|
| 寫 class 骨架 | 為 Book 寫屬性與 method | 先列屬性→每個屬性配一個操作→只寫簽名 | class Book: isbn, title, available; borrow(), return_book() |
| 追蹤物件狀態 | 兩次借書後 available 是什麼 | 逐步寫出每個 method 之後的屬性值 | False,第二次應拋出錯誤 |
| 找 bug | find 出罰款算錯的原因 | 先寫失敗測試→重現→縮小範圍→修一处 | 期限比較用了 < 而非 <= |
| 寫測試 | 為歸還過期書寫兩個案例 | 正常一例+邊界一例,各附預期結果 | 罰款=過期日數 × 每日罰款 |
合理性檢查(一定要教):檢查三個數:class 3 個、method 12 個、測試 18 個(邊界 6 個)。如果學生一個 class 寫到 10 個以上 method,先叫他講出該 class 的責任,講不出就是責任未分。測試時間 27 分鐘是上限,不是目標;18 個測試跑 45 分鐘代表測試粒度太細。
05 獨立練習三題
| 題目 | 答案 | 想觀察什麼 |
|---|---|---|
| 為 Loan 寫出三個屬性與兩個 method 簽名。 | book、member、due;create()、fine()。 | 屬性是否足夠計罰款,方法是否只做一件事 |
| 寫一個測試:會員已借滿上限仍再借。 | 預期拋出 BorrowLimitError,並且 borrowed 數目不變。 | 有無檢查狀態未被改動,而非只看有無報錯 |
| 指出這段程式的 bug:if due < today: fine = 0 | 條件寫反,應該是 due < today 才罰款;寫成 due <= today 或方向錯就會漏罰。 | 能否用一個測試重現,而不是靠讀 |
06 學生常見錯誤與糾正句
| 錯誤 | 學生通常這樣寫 | 導師這樣說 |
|---|---|---|
| 全部塞進一個 class | class System 內 15 個 method | 「一個 class 只做一件事,你數下邊幾個 method 要同時識三種資料。」 |
| 屬性與方法數目失衡 | 2 個屬性卻有 9 個 method | 「method 係操作屬性,屬性得兩個,第九個 method 操作咩?」 |
| 只寫正常流程測試 | 18 個測試全部借書成功 | 「邊界先寫,成功案例最後寫,因為邊界才會搵到 bug。」 |
| 靠 print 除錯且不刪 | 交卷仍留有 6 個 print | 「修完即刪,print 會改輸出格式,考試直接扣分。」 |
07 家課建議(直接指到練習卷題號)
- DSE ICT 練習卷(程式編寫部分) 第 4 題:為題目的系統列出 class 與 method 表,每個 class 限 4 個 method,並標明 6 個邊界測試。
- 同一份卷資料庫部分 第 6 題:把題目的實體關係改寫成 class 屬性,指出哪一個屬性需要驗證。
08 離場檢查(最後 5 分鐘)
| 題目 | 答案 | 判定 |
|---|---|---|
| 三個 class 各負責什麼 | Book 書況、Member 會員、Loan 借還期限 | 講不出 Loan=重講責任 |
| 18 個測試留幾個邊界 | 6 個,佔 33.3% | 答 2 個以下=重講邊界 |
| 除錯第一步做什麼 | 跑測試找出失敗的那一個 | 答「加 print」=重講次序 |
09 導師常問
一定要用物件導向嗎?
不是。但題目若要求多個實體共用狀態,用 class 比用多個 list 更清楚,也更容易寫測試。
測試要寫到多細?
每個 method 至少一個成功案例、一個邊界案例就夠;18 個測試對 12 個 method 已經覆蓋足夠。
考試卷可以寫註解代替測試嗎?
不可以。註解不執行,看不到錯誤;測試失敗才有定位作用。
本頁為 TutorZone 導師備課指引,內容由 TutorZone 團隊編寫;題目與流程為原創,並非任何學校或出版社的教材。


