本節書摘來自異步社群出版社《c++程式設計規範:101條規則、準則與最佳實踐》一書中的第2章,第2.7節,作者:【加】herb sutter , 【羅】andrei,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。
摘要
不要洩密:不要公開提供抽象的實體的内部資訊。
讨論
為了盡量減少操作抽象的調用代碼和抽象的實作之間的依賴性,必須隐藏實作内部的資料。否則,調用代碼就能夠通路該資訊,或者更糟,操作該資訊,而原本應屬于内部的資訊就洩漏給了調用代碼所依賴的抽象。應該公開抽象(如果有的話,還是公開領域抽象更好,但至少應該是get/set 抽象),而不是資料。
資訊隐藏主要從下列兩個方面降低了項目的成本,加快了項目的進度,減少了項目的風險。
它限制了變化的影響範圍。資訊隐藏縮小了變化所引起的“連鎖反應”的範圍,也降低了由此帶來的成本。
它強化了不變式。它限制了負責維護(如果有錯誤的話,也可能是破壞)程式不變式的代碼(見第41條)。
不要從任何提供抽象的實體中公開資料(另見第10條)。資料隻是抽象、概念性狀态的一種可能的具體化而已。如果将注意力集中在概念而不是其表示形式上,就能夠提供富于提示性的接口,并按需要對實作進行調整——比如緩存還是實時地計算,又比如使用不同的表示方式,針對某種使用模式(如極坐标與笛卡兒坐标)進行優化。
絕對不要将類的資料成員設為public(見第41條),或者公開指向它們的指針或句柄(見第42條)而使其公開,這是一個很常見的資訊隐藏的例子,但是它同樣适用于更大的實體比如程式庫——程式庫同樣不能暴露内部資訊。子產品和程式庫同樣應該提供定義抽象和其中資訊流的接口,進而使與調用代碼的通信比采用資料共享方式更安全,耦合度更低。
例外情況
測試代碼經常需要對被測試類或者子產品進行白箱通路。
值的聚合(“c語言式的struct”)隻是簡單地将資料綁在了一起,并沒有提供任何抽象,是以它不需要隐藏資料,資料本身就是接口(見第41條)。
參考文獻
[brooks95] §19 ● [mcconnell93] §6.2 ● [parnas02] ● [stroustrup00] §24.4 ● [sutthysl04a]