抽象(abstraction):對某個實體的簡化視圖,省略其中不重要的細節

抽象之所以有用,是因為它讓我們更容易思考、操作複雜的東西。

抽象與模組化的關係#

在模組化程式中,每個模組透過介面提供抽象:

  • 介面呈現模組功能的簡化視圖
  • 從抽象的角度看,實作細節並不重要,所以從介面省略

抽象的兩種失誤#

「不重要」這個字是抽象的關鍵:省略的細節越多越好,但前提是它們真的不重要。

抽象可能在兩個方向上出錯:

  • 失誤一:保留了不重要的細節

    • 抽象變得比必要更複雜
    • 提高使用者的認知負擔(cognitive load)
  • 失誤二:省略了實際上重要的細節

    • 形成模糊(obscurity)
    • 只看抽象的人沒有足夠資訊正確使用它
    • 這叫做假抽象(false abstraction):表面上簡單,實際上不是

設計抽象的關鍵:搞清楚什麼是重要的,並尋找那些能讓「重要資訊」最少的設計。

範例:檔案系統#

  • 多數細節對使用者不重要:例如選擇哪些磁碟區塊存放檔案資料 → 可以從抽象省略(前提是效能足夠)
  • 有些實作細節對使用者很重要,例如:
    • 多數檔案系統會把資料快取在主記憶體
    • 為了效能,可能延後把新資料寫到儲存裝置
    • 對資料庫等應用而言,何時資料真正寫入儲存裝置至關重要(涉及系統崩潰後的資料保存)
    • 因此,「flush 規則」必須在介面中可見

日常生活中的抽象#

抽象不只是程式設計的工具,也普遍存在於我們的日常生活:

  • 微波爐:內部把交流電轉成微波輻射、分布到烹調腔的電子線路相當複雜,但使用者只看到幾顆控制時間與火力的按鈕
  • 汽車:開車不必懂電動馬達、電池管理、防鎖死煞車、定速巡航的內部機制