2010-06-26 101 views
4

我來自更多的C#背景,但我正在業餘時間學習Ruby。您應該在Ruby中使用私有,受保護和公共修飾符嗎?

給定類別,可以使其方法private,public(默認)或protected。雖然我理解他們的用法,但是Ruby代碼使用這些修飾符的典型代表,儘管它是一種動態語言,用戶可以輕鬆地覆蓋訪問權限?

雖然使用類似Send的東西允許用戶訪問私有方法,無論如何,我只是想知道關於Ruby和訪問修飾符的最佳實踐是什麼?換句話說,我應該在我的課堂上使用它們嗎?

+0

我應該加我關心,如果有人訪問我的私有方法 - Ruby畢竟是動態的。我比其他Ruby開發者所做的更關注訪問修飾符。 – Finglas 2010-06-26 13:29:11

+0

在這種情況下,您會看到Private用得很少,Public和Protected很少用到,因爲Public是默認的,Protected不能像其他語言一樣工作 – cpjolicoeur 2010-06-26 13:43:56

回答

8

鑑於班,有可能使他們的方法私密,公開(默認)或保護。雖然我理解他們的用法,但是Ruby代碼使用這些修飾符的典型代表,儘管它是一種動態語言,用戶可以輕鬆地覆蓋訪問權限?

它還是比較常見的,因爲它表達了意圖並最小化了您所暴露的界面。一些公約來觀察:

  • 簡單地忽略public,因爲所有的方法都是公開進行,除非你說,否則,和方法通常是通過訪問修改分組。

  • 即使用戶可以覆蓋訪問,這並不意味着他們應該(以幾乎相同的方式,你看不到C#開發人員在做瘋狂的事情像注射IL存根爲階級,使他們可以訪問私有方法)。所以區分是有用的。

  • 受保護的方法比在C#中要少一些,因爲Ruby並沒有真正鼓勵繼承作爲傳遞行爲的方式。常見行爲通常可以重構爲Module,然後根據需要重構include/extend

  • 私有方法與C#中的一樣常見; Ruby經常支持很多微小的方法來完成非常具體的事情,然後你們組合起來獲得一些有用的東西。但是你不公開這些方法,因爲它們不是你的公共接口的一部分,你想保持這種無混亂的狀態。

  • 因爲私有方法不被認爲是接口的一部分,所以您應該可以自由地更改它們而不受懲罰。通過將它們私有化,您已經注意到其他方法,這些方法及其實現或定義可能隨時發生變化。

2

我仍然會在代碼中使用它們,因爲它向代碼閱讀器傳達了明確的意圖,並且還爲您提供了所需的保護。如果另一個開發人員要覆蓋你的方法或通過#send直接調用他們,他們很可能有或有充分理由,或者至少理解爲什麼他們必須這樣做。

使用私有/在你的代碼保護使事情變得更加明確未來開發誰去重寫你的方法,也正常工作適合你,如果沒人覆蓋他們

4

我一直認爲它是關於暴露一個接口。你不希望你的用戶被你的實現所淹沒,所以你做了那些私人的東西。對他們很友善。例如,使用數組打交道時,你真的想在你的另一種方式方法71(你幾乎可以肯定不關心?)


RUBY_VERSION     # => "1.8.7" 
Array.new.public_methods.size # => 149 
Array.new.private_methods.size # => 71 

的私有方法的另一個重要意義是「可能改變」的提示當你將自己提交給一個界面時,你必須支持它。每次下載新版本時,都無法破解每個人的代碼。私人事物被認爲是不穩定的。他們沒有暴露,所以暗示你可以自由地改變它們。如果用戶建立了依賴於私有方法的代碼,那麼這不是你的錯(假設他們沒有做它,你給他們一個垃圾界面)。所以你可以讓自己的空間讓自己在將來變得更好。

相關問題