2014-01-10 9 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=を使用して、属性writeメソッドをインスタンス変数より直接使用する方が適切ですか?

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

インスタンス変数を読み込むを参照して、「インスタンス変数を超える属性」についての本会談を、それはまた、書き込みには適用されませんか?

+0

'self.feature ='が '@ feature ='よりも望ましい場合があります。一般的に、 'self.'シェルに代入するとより多くのactionaを実行して割り当てを行うことになります。第2に、https://github.com/3aHyga/ruby-style-guideで、あなたは良いスタイル 'self.feature ='が複雑な割り当て(これは単にインスタンス変数)が発生します。 'feature ==" value "'のように常に読み込まれた構文の場合 –

答えて

10

インスタンス変数を読み込むを参照する して「インスタンス変数を超える属性」についての本会談を、それはまた、書き込みには適用されませんか?

はい、これは書き込みにも適用されます。しかし、initializeメソッドは、オブジェクトの設定を担当するため、特別です。 setterメソッドを使用するときは、セッターが余分な作業をしている可能性がある(たとえば、Railsのアトリビュートセッター)。イニシャライザでは、通常、副作用を起こしたくないため、インスタンス変数に直接アクセスします。

0

最初に、がより好ましくは@feature=であり、その場合には、featureプロパティシェルへの割り当てがより多くのアクションを行い、次に割り当てられるときに一般的である。たとえば、データベースアクセスメソッドで。

第2に、the good ruby style guideでは、複雑な割り当てが発生したときに良いスタイルが1回だけエンコードされていることがわかります。つまり、インスタンス変数へのアサーションだけではありません。読み込みの場合、feature == "value"のような構造が常に使用されます。

関連する問題