閱讀776 返回首頁    go 阿裏雲 go 技術社區[雲棲]


C++編程規範之42:不要公開內部數據

摘要:

    不要過於自動自發:避免返回類所管理的內部數據的句柄,這樣類的客戶就不會不受控製地修改對象自己擁有的狀態。

class Socket

{

public:

         //...打開handle_的構造函數,關閉handle_的析構函數,等等

         int GetHandle() const{ return handle_;}

private:

         int handle_;

};

    數據隱藏是一種強大的抽象方式,也是強大的模塊化機製。但是隱藏數據卻又暴露句柄的作法是一種自欺欺人,就像你鎖上了自己家的家門,確把鑰匙留在了鎖裏。原因如下:

    1.客戶現在有兩種方式實現其功能。可能使用你的類提供的抽象,也可以直接操作你的類所依賴的實現。在後一種情況下,對象並不知道自己所擁有的資源已經發生了顯著變化。現在類無法可靠地增加或者改善功能了,因為客戶可以避開這些改善的、受控的實現——以及任何它認為後加的不變式,這樣本來正確的錯誤處理就幾乎不可能起作用了。

    2.類不能改變其抽象的底層實現,因為客戶將依賴於此。如果以後升級socket,用不同的低級操作原語支持不同的協議,則獲取了底層handle_且布恩那個對其進行正確操作的調用代碼就會不加警告地中斷。

    3.類無法實施其不變式,因為調用代碼能夠在類不知情的情況下改變狀態。

4.客戶代碼會存儲類所返回的句柄,並且在類代碼已經銷毀句柄之後還試圖使用它們。

最後更新:2017-04-03 12:54:29

  上一篇:go android調用服務端的js
  下一篇:go weka學習入門筆記