1

私はRuby on Rails 3.1を使用しています。定数を記述するときに正しい方法で以下の問題を解決する方法を理解したいと思います。定数のステートメントに関するトラブル

は、私は2つのクラスがあります。

class Class1 < ActiveRecord::Base 
    CONSTANT_CLASS_1_A = Class2::CONSTANT_CLASS_2_A # => 222 
    CONSTANT_CLASS_1_B = 111 
end 

class Class2 < ActiveRecord::Base 
    CONSTANT_CLASS_2_A = 222 
    CONSTANT_CLASS_2_B = Class1::CONSTANT_CLASS_1_B # => 111 
end 

私は/ "負荷" 私は次のエラーを取得Class1 "使う" しようとすると:私は以下のコードを述べるならば、しかし

NameError in ... 
uninitialized constant Class1::CONSTANT_CLASS_2_B 

class Class1 < ActiveRecord::Base 
    CONSTANT_CLASS_1_B = 1 
    CONSTANT_CLASS_1_A = CONSTANT_CLASS_2_A * CONSTANT_CLASS_3_B # => 3 
end 

を私はを述べることができることを知っている:それは動作します(定数文の順序に注意してください)の前にCONSTANT_CLASS_1_B(少なくともこの時点で問題を解決するには)、は正しいですか?つまり、私の問題を「正しい」と「実行者」wayで解決する方法がありますか(たとえば、前にClass1の定数をロードして他の定数を取得する)?上記のコードを使用することをお勧めしますか?

ボーナス:問題のこの種の規則はありますか?もしそうなら、それは何ですか?

答えて

1

これを行う正しい方法は、おそらくあなたが探しているデータを参照するただ1つの定数を持つことです。定義を倍増させると、このような問題が発生し、さらにコードを読みやすく理解しやすくなります。

2つの場所で同じ定数を使用する魅力的な理由がない場合(ほとんど存在しない)、CONSTANT_CLASS_2_BまたはCONSTANT_CLASS_1_Aは定義しないでください。あなたがそれらをしたい場合は、このような他のモデルからそれらを参照:

Class2::CONSTANT_CLASS_2_A 
Class1::CONSTANT_CLASS_1_B 
+0

「の定義を倍増すると、このような問題につながり、さらに読みやすく、理解し、あなたのコードはハードになります」 - 作ることも事実でありますより明示的なコード(これは、基礎となるクラスを理解する利点/利益だと思います)。 – Backo

+0

定数名が合理的に理解できれば、別のモデルでそれを参照することも明示的です。つまり、User :: EMAIL_REGEXは、あなたが探しているものと探しているものをかなり明白にしていると言います。 – Veraticus

+0

あなたは正しいかもしれませんが、特に、個別に取られたクラスソースコードを読んで理解しなければならないときには、 "二重"ステートメント(つまり、明示的に理解すること)が理解できると思います。 – Backo

関連する問題