簡體   English   中英

訪問者與公共成員

[英]Accessors vs. public members

我有一個 class 有很多具有讀/寫訪問權限的內置類型成員。 我應該將它們設為公共成員並為每個成員提供 get/set 方法嗎? 結構呢?

擁有訪問器(getter)和修改器(setter)的全部原因是為自己提供額外的間接級別。

這種額外的間接級別允許您向公共接口提供變量的只讀視圖,同時不允許更改數據成員。 您仍然可以使用私有或受保護的設置器。

設置器允許您在設置值時進行特殊的錯誤檢查、驗證和更正。 例如 setDirectory(const std::string &strPath),如果用戶沒有指定,你可以確保有一個終止斜線。 這可確保您的 class state 始終有效。

Getter 還可以保護您的成員不讓它們暴露以允許指向它們的指針。 通過不允許從外部指向它們,您可以確保如果您的 object 超出 scope 它不會導致崩潰。

getter/setter 的額外間接級別還允許您更改它們封裝的數據成員。

使用 getter,您還可以獲得數據的不同視圖,例如:getMinutes,當您的數據成員實際上以秒為單位存儲時。

這不是使用它們的原因,但是使用 getter 和 setter 的一個很好的副作用是您可以在修飾符中設置一個斷點,例如准確地查看它何時更改。

您是否應該使用它們是基於您的需要的判斷電話。 如果您有這么多成員,以至於提供 getter 和設置非常痛苦,您可以考慮將數據成員存儲在一個結構中,並在 class 中使用該結構。 您甚至可以一次為整個結構提供 object 的 getter/setter。

如果您需要保留不變量,那么可以。 否則,不要打擾。

首先,如果您的 class 有很多數據成員,那么它可能設計得不好。 您可能需要考慮將其拆分為多個類或將數據存儲在地圖等結構中。

關於提供訪問器,問題是您是否想要修改訪問權限,可能會阻止它。 如果答案是肯定的,那么您需要訪問功能。 另一方面,如果你的 class 真的只是一袋比特,沒有任何行為,那么就讓它成為一個結構。

您應該只使用公共數據成員

  • 在結構中,您不會向客戶端代碼公開(例如,綁定樣式的函子) - 保護外部任何人都無法獲得的結構是沒有用的
  • 如果它們的類型封裝了設置/獲取它們的邏輯(例如,如果您創建 class ObservableAttribute)
  • 如果它們是不可變結構中的 const 成員(如果它們是不可變的,則除了讀取它們之外,您無能為力)

如果創建公共數據成員,則必須確保其值與 class 的其他成員完全正交。 例如,您禁用了未來的可能性

  • 觀察成員的變化
  • 使成員在類的不變量中扮演任何角色
  • 禁止訪問該成員
  • 如果性能需要,更改成員的實現(例如,計算、緩存和存儲)

對私有/受保護的數據成員使用 get/set 方法是一個糟糕的設計。

它會導致客戶端代碼依賴於 class 的實現細節。

class 中的更改會導致客戶端代碼發生更改。

但是,可以使用公共成員的 get/set 方法。 但避免它們總是好的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM