C++變成規範之41:將數據成員設為私有的,無行為的聚類(C語言形式的struct除外)
摘要:
它們不關調用者的事:將數據成員設為私有的。簡單的C語言形式的struct類型隻是將一組值聚集在了一起,並不封裝或者提供行為,隻有在這種struct類型中才可以將所有數據成員都設成公用的。要避免將公用數據和非公用數據混合在一起,因為這幾乎總是設計混亂的標誌。
信息隱藏是優秀軟件工程的關鍵。應該將所有數據成員都設為私有的,不管是現在,還是可以能發生變化的將來,私有數據都是類用來保持其不變式的最佳方式。
如果類要建模一個抽象,並因而必須維持一個不變式,那麼使用公用數據就不好了。擁有公用數據意味著類的部分狀態的變化可能是無法控製的、無法預測的、與其他狀態異步發生的。這意味著抽象將與使用抽象的所有代碼組成無限集合共同承擔維持一個或者更多不變式的職責,這是一種顯而易見的、根本性的、不可原諒的缺陷。應該斷然拒絕這種設計。
保護數據具有公用數據的所有缺點,因為擁有保護數據仍然意味著抽象將與代碼的無限集合共同承擔著一個或者更多不變式的職責,隻不過這裏的集合是由當前的派生類和未來的派生類組成的。而且,通過派生一個新類,並用它來獲取數據,任何代碼都能夠像公用數據那樣容易地讀取和修改保護數據。
在同一個類中混合使用公用和非公用數據成員既容易含混不清,又存在前後矛盾。私有數據表明具有不變式而且希望保持這種不變性,而將其與公用數據混合則意味著無法明確地判斷這個類到底要不要成為抽象。
非私有數據成員甚至還不如簡單的通道性的get/set函數,後者起碼還能進行健壯的版本處理。
最後更新:2017-04-03 12:54:31