軟體系統由多個層次(layer)構成:上層使用下層提供的設施。

在設計良好的系統中,每一層提供的抽象都不同於它上下兩層

跟隨單一操作在各層之間上下移動 → 每次方法呼叫都伴隨抽象的轉換。

範例:抽象怎麼變#

檔案系統(File system)#

  • 最上層:檔案抽象——可變長度的位元組陣列,可透過讀寫位元組區段更新
  • 中層:固定大小磁碟區塊的記憶體快取(呼叫端可假定常用區塊留在記憶體裡能快取)
  • 最底層:裝置驅動程式(在二級儲存與記憶體之間搬資料)

網路傳輸協定(如 TCP)#

  • 最上層:可靠送達的位元組串流(從一台機器到另一台)
  • 下層:盡力送達(best-effort)的有界封包(多數會送到,少數可能遺失或亂序)

紅旗#

若系統中相鄰的層次有相似的抽象,這是一個紅旗——通常意味著類別拆分有問題。

本章脈絡:

  1. 穿透型方法(pass-through methods)
  2. 何時可以重複介面
  3. 裝飾者模式(decorators)的問題
  4. 介面 vs. 實作的抽象分層
  5. 穿透型變數(pass-through variables)

結語#

加進系統的每個設計設施(interface、argument、function、class、definition)都會引入複雜性,因為開發者得學它。

一個元素必須消除原本會存在的複雜性,才能在淨值上對抗複雜性有貢獻;否則拿掉它反而比較好。

「不同層次、不同抽象」就是這個觀念的應用:

  • 不同層卻共用同一抽象(穿透方法、裝飾者)→ 多半沒有提供足夠價值來抵掉它引入的基礎設施
  • 穿透變數同理——讓多個方法被迫知道某變數存在,卻沒帶來新功能