1.2 · 分解
目标: 把大问题拆成更小、可单独解决的子问题。
分解是什么
分解是把一个大问题切成更小、可独立解决再合起来的可管理部分。
复杂系统鲜以一整块解决。把它拆开,逐块解决,再粘合。
例 · 建一个补习预约系统
「建一个补习预约系统」这个大标题分解为:
- 用户账号(注册、登入、个人档案)。
- 导师档案(技能、时间表、收费)。
- 搜索与筛选(科目、时间、价格)。
- 预约流程(选时段、付款、确认)。
- 通知(邮件、短信)。
- 评价与评分。
每个子问题有边界 —— 你不解决其他也能完成它。
好处
- 认知负担 —— 一次只处理一小块。
- 复用 —— 小块可服务多个大问题。
- 团队工作 —— 不同学生 / 程序员处理不同块。
- 测试 —— 易单独测小块。
- 维护 —— 修一个 bug 只动一块。
分解层次
学校注册系统
├── 学生数据
│ ├── 新增
│ ├── 更新记录
│ └── 删除记录
├── 班级编配
│ ├── 按分配
│ └── 手动覆盖
└── 报表
├── 出勤总结
└── 考试排名1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
直到每个叶子小到可用一个函数(10–50 行)实现就停止分解。
实用启发
- 每个子问题都有自己的输入、过程、输出(每层都用 IPO)。
- 每个子问题独立 —— 隐藏依赖最少。
- 用动宾命名每块(如
calculateGrade、sendEmail)。
学生常见错误
- 分得太粗 —— 叶子还很大。
- 分得太细 —— 每个叶子两行;管理开销超过收益。
- 忘了集成 —— 单独看好,但拼不起来。
考试式题目
题(4 分): 把任务「为每位学生制年度成绩单」分解为至少四个子问题,概述每个做什么。
参考答案:
- 收集分数 —— 从数据库取每位学生各科考试分数。
- 计算等级 —— 把每科分数转字母等级 (A–F),算学期 / 总体平均。
- 排版报告 —— 把学生资料、各科等级、评语、出勤组装到标准报告布局。
- 导出 & 打印 —— 每位学生生成 PDF 并送打印机或邮件给家长。
关键要点
- 大问题 → 小问题 → 单独函数。
- 每块自带 IPO。
- 自然带来可复用与适合团队。
➡️ 下一节:1.3 模式识别