開放繼承
2006 年 8 月 21 日
這與 DesignedInheritance 的態度相反。開放繼承的支持者不會透過 Seal 封閉他們的類別或採取其他措施來禁止繼承,以阻止人們繼承類別。
開放繼承的支持者並不同意設計繼承的支持者關於繼承的危險性。繼承是一種親密的關係,對粗心大意的人來說充滿了危險。你可以輕易地破壞超類別行為,而且你必須特別小心升級,因為你可能會依賴隱藏的實作細節。但是開放繼承者相信,是否承擔這些風險的選擇應該是函式庫使用者的決定。如果他們選擇繼承,那麼他們就接受風險和後果。
理論上,設計方法比較好,但問題在於很難找出某人可以有效改變現有類別的所有方式。這會導致兩個問題:函式庫使用者無法以設計者未預期的方式使用函式庫,而函式庫設計者必須承擔嘗試預測擴充功能的責任。
設計繼承假設函式庫撰寫者比他們的使用者更明智。這通常不是事實。函式庫撰寫者也會犯錯,如果繼承是開放的,那麼類別的使用者就有機會修復錯誤,並仍然可以利用函式庫撰寫者的辛勤工作。
設計繼承是一項非常棘手的任務,特別是當你通常不知道用例是什麼的時候。要求人們思考所有繼承案例會給函式庫作者帶來很大的負擔。開放繼承意味著他們不必處理它,除非他們特別想要這樣做,前提是那些繼承的人必須小心他們正在做什麼。
一個特別讓設計繼承造成麻煩的領域是測試。通常在測試中,你需要使用測試替身,但會被一個沒有可用於替換的介面的密封類別阻止。這些類型的 API 可能會令人討厭
開放繼承者通常會設計具有預期擴充點的類別,這些類別比其他類別更安全。然而,他們通常會通過命名或文件標記這些類別,而不是密封它們。這樣,人們就可以指向安全區域,但如果必要,不至於阻止他們在其他地方覆寫。
設計繼承通常伴隨著指導態度,它通常會忘記愚蠢的人在搞砸事情時是很有創造力的。