在Ruby中定義訪問者時,可能會在簡潔(我們都愛)和最佳實踐之間產生緊張關係。Ruby私有和公共訪問者
例如,如果我想揭露上的一個實例的值,而是從更新它禁止任何身外之物,我能做到以下幾點:
class Pancake
attr_reader :has_sauce
def initialize(toppings)
sauces = [:maple, :butterscotch]
@has_sauce = toppings.size != (toppings - sauces).size
...
但是突然我使用的是原始實例變量,這讓我抽搐。我的意思是,如果在未來的日期設置之前需要處理has_sauce,我可能需要做更多的重構,而不僅僅是覆蓋訪問器。來吧,原始實例變量?布萊什。
我可以忽略該問題並使用attr_accessor
。我的意思是,任何人都可以設置屬性,如果他們真的想要;畢竟,這是Ruby。但是後來我失去了數據封裝的想法,對象的接口定義不好,系統可能更加混亂。
另一種解決方案是定義在不同的訪問修飾符一對訪問器:
class Pancake
attr_reader :has_sauce
private
attr_writer :has_sauce
public
def initialize(toppings)
sauces = [:maple, :butterscotch]
self.has_sauce = toppings.size != (toppings - sauces).size
end
end
哪幹得不錯,但是這是樣板的一個簡單的訪問,並坦率地說,一大塊:EW。
那麼是否還有更好的Ruby方法?
**哪些工作可以完成**錯!你的initialize()方法中的has_sauce是一個局部變量 - 不是一個實例變量。你甚至沒有測試你的代碼(它也有另一個錯誤)。 **我的意思是,如果我在未來的日期設置之前需要處理has_sauce,那麼我可能需要做更多的重構,而不是重寫訪問器。**通過設置setter來設置實例變量是一種很好的做法,並且使用兩個訪問修飾符是實現只讀實例變量的方法。 – 7stud 2014-08-29 17:45:26
未經測試的代碼最深切的歉意,並很好的發現。現在修復,fwiw。另外,我很高興你同意這是一個很好的做法,但是這種實現感覺有點不好意思。可能只是我。 – 2014-09-02 09:49:39