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 模式識別