2012-01-07 7 views
1

ページ上に多数のナビゲーションリンクを表示しています。 これはアプリケーションで修正される予定ですが、将来は新しいリリースで変更された場合でも対話的に変更される可能性があります。そのため、使用中のアプリケーション内で固定されています。定数またはクラス変数を使用しますか?

リンクの数は、コントローラのさまざまなアクション内で使用するために設定されています。

私は(すなわちスコープ)がクラス内にとどまると競合することなく、同じ名前の他の用途を(異なるコントローラやモデルが言う)できるようにするために、クラスレベル変数@@number_of_link Sを使用すべきか、私はNumberOfLinksのような定数を使用する必要があります?

私は両方のアドバイスを受けており、最初のものに対する自分の好みを確認したいと思います。

+2

わからないを使用してそのコードを減らすことができます。アプリケーション全体の定数であれば、アプリケーション全体の定数でなければなりません。クラスレベルの定数の場合は、クラスレベルの定数でなければなりません。 –

+0

デイヴ大丈夫+1。あなたがクラスレベルの定数を言うとき、実際には、単にメソッドの外で宣言された変数を意味しますか?任意の事前修正?大文字ですか? –

+0

私はそれがどのように変化するかについてもう少し詳しく述べるべきです。私はそれをもっと明瞭にするために少し変更するでしょう。 –

答えて

4

定数でない限り、間違いなく定数です!

クラス変数の代わりに、クラスインスタンス変数を提案します。あなたは(クラスの他のメンバーがあまりにも値、および容易なアクセスを壊しません。より良いスコープで、クラス変数のすべての利点を得ることができます。

class Foo 

    class << self 
    def number_of_links 
     @number_of_links ||= 10 # or some sensible default, you might make this a constant to highlight the number when you're reading the code. 
    end 

    def number_of_links=(n) 
     @number_of_links = n 
    end 
    end 
end 

puts Foo.number_of_links 
# => 10 
Foo.number_of_links = 20 

puts Foo.number_of_links 
# => 20 

は、より多くのためにhttp://blog.codegram.com/2011/4/understanding-class-instance-variables-in-rubyを参照してください。

+0

ありがとうございます。 +1私はリンクをチェックアウトします。 –

+0

はい良い情報。多くを吸収する。 –

0

のは、あなたがこのように警告する一定のルビーの上にそれを行う場合は、リンクの数を更新する必要があるとしましょう「警告:すでに一定のNumOfLinks初期化」、このような場合には

を使用すると、クラス変数に固執すべきです。

1

アプリケーションロジックを使用して変更する予定がないという厳しい性質のものがある場合は、定数を使用する必要があります。

クラスの状態によって変わることが予想されるもの(データベースインタラクションの状態に基づいて外挿されている場合)は、クラス変数を使用する必要があります。

パフォーマンスの観点からは、この場合、上で説明した方法を使用して、デベロッパーに「デコード」せずに理解させることを容易にする変数のタイプを使用してインテントを想定することができます。

+0

定数はうまくいくと思いますが、num_of_linksが他の場所で使用されていたら、このクラスにスコープするほうがよいでしょう。それがより安全であるように思えますか? –

+0

はい、NUM_OF_LINKSは少し曖昧です。定数は大文字で始まらなければならないので、あなたが "矛盾"を起こす唯一の方法は、ルビで可能な定数を再割り当てすることです。再び、慣例は賢明さ以上のものです。変化しないものがあれば、他の人があなたのアプリケーションに関する多くのことをあなたのアプリケーションの定数を評価することから学ぶことができます。 – josephrider

2

それならば

アプリケーションロジックによって変更されない値は、一時変数である必要はありません。私は避けることをお勧めします。多くの開発者がその違いを理解するのに問題があるため、可能な場合はクラス変数(およびクラスインスタンス変数) EEN 2は、それらを使用するときなど

2

同様イアンは言う.. クラスのインスタンス変数を使用..しかし、あなたが求めているものをattr_accessor

class Foo 
    class << self; attr_accessor :number_of_links; end 
    self.number_of_links = 10 #default value.. 
end 

puts Foo.number_of_links 
# => 10 
Foo.number_of_links = 20 

puts Foo.number_of_links 
# => 20 
関連する問題