抽象(abstraction):對某個實體的簡化視圖,省略其中不重要的細節。
抽象之所以有用,是因為它讓我們更容易思考、操作複雜的東西。
抽象與模組化的關係#
在模組化程式中,每個模組透過介面提供抽象:
- 介面呈現模組功能的簡化視圖
- 從抽象的角度看,實作細節並不重要,所以從介面省略
抽象的兩種失誤#
「不重要」這個字是抽象的關鍵:省略的細節越多越好,但前提是它們真的不重要。
抽象可能在兩個方向上出錯:
失誤一:保留了不重要的細節
- 抽象變得比必要更複雜
- 提高使用者的認知負擔(cognitive load)
失誤二:省略了實際上重要的細節
- 形成模糊(obscurity)
- 只看抽象的人沒有足夠資訊正確使用它
- 這叫做假抽象(false abstraction):表面上簡單,實際上不是
設計抽象的關鍵:搞清楚什麼是重要的,並尋找那些能讓「重要資訊」最少的設計。
範例:檔案系統#
- 多數細節對使用者不重要:例如選擇哪些磁碟區塊存放檔案資料 → 可以從抽象省略(前提是效能足夠)
- 但有些實作細節對使用者很重要,例如:
- 多數檔案系統會把資料快取在主記憶體
- 為了效能,可能延後把新資料寫到儲存裝置
- 對資料庫等應用而言,何時資料真正寫入儲存裝置至關重要(涉及系統崩潰後的資料保存)
- 因此,「flush 規則」必須在介面中可見
日常生活中的抽象#
抽象不只是程式設計的工具,也普遍存在於我們的日常生活:
- 微波爐:內部把交流電轉成微波輻射、分布到烹調腔的電子線路相當複雜,但使用者只看到幾顆控制時間與火力的按鈕
- 汽車:開車不必懂電動馬達、電池管理、防鎖死煞車、定速巡航的內部機制