2012-11-25 50 views
0

我進入了一個關於getter和setter方法和封裝的有趣的互聯網爭論。有人說他們應該做的只是一個賦值(setters)或者一個變量訪問(getters)來保持它們的「純粹」並確保封裝。getter和setter應該允許什麼?

  • 我說得對,這將完全打敗吸氣劑和吸入器的目的,驗證和其他邏輯(當然沒有奇怪的副作用)應該被允許嗎?
  • 驗證何時應該發生?
    • 當設定值,二傳手內(要保護的對象從不斷進入無效狀態 - 我的意見)
    • 之前設定值時,二傳手
    • 對象內部的外面,每次前值
  • 是否允許更改值(可能將有效值轉換爲某些規範的內部表示形式)?

在您關閉這個問題作爲一個重複:我花了很多時間在這裏尋找,我沒有發現任何回答這些具體問題。如果你能向我展示一個回答他們的問題,我很樂意刪除這個問題。

+3

這可能是一個更適合http://programmers.stackexchange.com的問題 –

+0

@JonClements:它如何在那裏遷移?那只有MODS才能做到嗎? –

+0

是這樣的,但我已經標記爲更適合程序員 - 所以希望它會在那裏結束(除了在那裏創建它,並且有這個遷移,然後重複問題等) –

回答

2

我完全同意;儘管我會說驗證是訪問者合法業務的一部分 - 特別是setter!允許未經驗證的setter是非常差的做法。

傳播無效數據的對象意味着你不得不擔心它的外部屬性,這是嚴重破壞封裝。

如果對選中存取一個正當的理由,以我的面嚮對象語言同時提供,命名爲getunchecked_Get等要清楚這是首選,沿Unchecked_Access線。

只要重讀福勒的「重構」,他認爲只有原始存取器的類應該可能被刪除並重構爲沒有增加值。

具體的答案:(我認爲)

是的,它會破壞存取的目的;它幾乎與公開實例變量一樣糟糕......

最好的驗證結構和設置;那麼你可以信任這個對象。

setter可以更改值嗎?我認爲你必須在個案的基礎上做出決定。一般的答案在某些細節上是錯誤的。有時候你想讓制定者失敗並指出潛在的問題,讓你修復它。

+0

謝謝。我一直計劃閱讀很長一段時間的重構 - 現在我有另一個理由:) –

2

我說得對不對,這將徹底擊垮其擺在首位,並驗證和其他邏輯 (當然沒有奇怪的副作用) getter和setter的目的應該被允許?

是的。如果你正在獲得和設置,它的優點在於它可以在將來引入鎖定或轉換例程,但是如果你從不需要它,只需讓這些成員公開!

什麼時候應該驗證發生?當設定值時, 二傳手內(要保護的對象從不斷進入無效狀態 - 我 意見)之前設定值時,二傳裏面的 對象外,使用該值每一次前

這取決於你。事先評估和驗證所有內容稱爲分期付款,這很好,因爲你知道狀態總是有效的。但是,如果您希望稍後執行此操作,則稱爲延遲驗證,如果您實際上從未實際使用數據,則可以提高性能。

是否允許更改值(可能將有效值 轉換爲某些規範表示形式)?

當然,這是使用它們的重要理由。如果您需要突然支持兩種類型的輸入(例如,度量和標準),則可以在一個位置向設置器添加邏輯,而不是在整個項目中更改其使用情況的每個實例。