2014-01-10 16 views
8

在可能的情況下,有一種約定可以在其實例變量上引用對象的屬性。 Practical Object-Oriented Design in Ruby說:在object.initialize中,最好使用self。在@?

始終包裹實例變量的訪問方法,而不是直接 參考變量...

這用一個例子,我已經轉述:

class Gear 
    attr_reader :chainring, :cog 
    ... 
    def ratio 
    # this is bad 
    # @chainring/@cog.to_f 
    # this is good 
    chainring/cog.to_f 
end 

最常用的方法我看到來創建一個實例變量的新對象是這樣的:

class Book 
    attr_accessor :title 
    def initialize(title) 
    @title = title 
    end 
end 

@title=直接訪問實例變量title假設我們正在慣例,繼的「過度實例變量屬性」是它更適合使用self.title=which would tell the object to send itself the message title=,從而使用該屬性寫入方法,比直接實例變量?

class Book 
    attr_accessor :title 
    def initialize(title) 
    self.title = title 
    end 
end 

這本書談到'屬性超過實例變量'引用讀取實例變量,但它不適用於寫?

+0

在一些情況下'self.feature ='更優選比'@特徵=',通常在這種情況下,當分配到'self.'殼做更多actiona然後只是分配。第二,在這裏:https://github.com/3aHyga/ruby-style-guide你可以看到,良好的作風'self.feature ='是encontered只有一次,當複雜的任務(這意味着不僅僅是assisnment到發生實例變量)。在閱讀總是使用像'feature ==「值」''的結構的情況下 –

回答

10

約「屬性在實例變量」這本書會談參考 閱讀一個實例變量,但沒有它也適用於寫作?

是的,它也適用於寫作。但是,initialize方法很特殊,因爲它負責設置對象。當你使用setter方法時,你這樣做是因爲setter可能正在做一些額外的工作(例如Rails中的屬性設置器)。在初始化器中,您通常不希望產生任何副作用,因此您可以直接訪問實例變量。

0

首先,在某些情況下,self.feature=更優選爲@feature=,通常在這種情況下,當分配給feature屬性外殼執行更多操作時,則只需分配。例如,在數據庫訪問方法中。

其次,在the good ruby style guide中,您可以看到,當複雜分配發生時,良好樣式self.feature=僅佔用一次。這意味着不僅僅是對實例變量的幫助。在閱讀的情況下,總是使用像特徵==「值」的構造。