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 团队编写;题目与流程为原创,并非任何学校或出版社的教材。


