2011年3月23日 星期三

漫談物件導向(十) - 封裝性

封裝性 (encapsulation)

封裝性 (encapsulation)是指將物件的資料成員 (data member) 保護或隱藏起來,防止有未授權而任意更改物件內部資料之情形,以免破壞資料完整性,所有內部資料存取只能透過公開的管道 (成員函式,member function)來存取。

一旦物件實體建構完成,就可使用『物件變數.方法名稱()』方式來叫用類別對外公開的方法。對一個公開的資料成員來說,當然也可使用『物件變數.資料成員名稱』來存取,不過將資料成員宣告為public,直接讓外界存取這樣作法並不恰當,嚴重違反物件封裝性原則 (encapsulation),合理方式是將資料成員設定為私有性 (private),只允許透過統一方法或介面實作來存取得類別的內部資料,這樣才能有效管制資料的使用權,維護物件資源的完整性與存取安全。

通常稱呼用來讀存物件內部資料的函式為取值函式 (getter),用來變更物件內部資料的函式為設值函式 (setter),也有些人使用存取子 (accessor) 和更動子 (mutator) 來稱呼它們。

理想的封裝是強調鬆散耦合 (loose coupling) 而避開緊密耦合,追求高內聚力 (high cohesion) 而避開低內聚力,也就是儘量讓類別本身功能完整獨立,與其它類別的相依性愈低愈好。