簽章相同的方法不一定是壞事。
重點在於:每個新方法是否都帶來顯著的功能。穿透型方法之所以糟,是因為它什麼都沒貢獻。
例外 1:分派器(Dispatcher)#
分派器(dispatcher)是一個方法,根據參數選擇要呼叫哪一個方法,然後把多數或全部參數丟給選中的方法。
- 分派器與被呼叫方法的簽章常相同
- 但分派器仍提供有用的功能:選擇
真實範例:Web 伺服器#
- Web 伺服器收到 HTTP 請求後,分派器檢查 URL 並挑選適當的處理方法
- 有些 URL 由「回傳磁碟檔案內容」處理;有些由「呼叫 PHP / JavaScript 程序」處理
- 分派過程可能相當複雜,通常以一組規則對 URL 做匹配
例外 2:同介面的多種實作#
例如:作業系統中的磁碟驅動程式:
- 每個驅動支援不同類型的磁碟
- 但都實作同一個介面
為什麼這樣降低認知負擔#
同介面的多種實作降低了學習成本。
學會其中一個之後,其他的就不用重新學介面。
這類方法通常:
- 位於同一層
- 彼此之間不互相呼叫
一句話判準#
只要每個共用簽章的方法各自提供有用且彼此不同的功能,就 OK。穿透型方法之所以糟,是因為它只是搬參數。