受保護資料
2003 年 5 月 14 日
在具有受保護存取修飾詞的類別中儲存資料,是否為良好的物件導向設計?
物件導向設計師對於是否應該將所有資料設為私有,或允許部分資料為公有,有不同的看法。
(在我深入探討這個模糊不清的議題之前,我應該指出受保護的存取修飾詞的意義在不同的語言中以微妙但重要的方式有所不同。)
我認為這個主題之所以變得如此困難,是因為人們從團隊內部或跨團隊開發的角度來看待它,而且這種觀點佔了主導地位。
一方面,如果我正在撰寫子系統並決定透過階層實作一些行為,那麼我非常樂意讓子類別深入存取其超類別。畢竟,這都是我的程式碼 - 我使用子類別來提供多型行為,而不是提供模組化。
另一方面,如果我正在建構框架並提供預期會被覆寫的掛鉤類別,我可能會想要保護資料,以便我可以在未來進行變更,而不會中斷人們的子類別。事實上,這比這更陰險,因為如果你不小心,子類別很容易中斷超類別 - 這稱為脆弱基底類別問題。
因此,我認為你不能說將資料設為受保護總是好或壞。如果你打算讓不受你控制的用戶端覆寫某個類別,那麼你應該將受保護的功能視為已發佈介面的部分,因此需要更加小心。發佈欄位是個壞主意,所以我在這種情況下不會這麼做。
但如果這不是你的意圖,而且它有助於你存取你編寫的子類別中的資料,那麼對我來說似乎是合理的。但我承認我的預設是將欄位設為私有,而且我很少將它變更為受保護。
一個相關的問題是,你是否應該使用自我封裝。