2011-01-28 17 views
10

私はヘルパーメソッドの束を書いてRubyの名前空間機能のベストプラクティス? (初心者の質問)

を(StackOverflowのがよく、私は関係なく、それに打撃を与えるだろう...この質問は、「主観と閉鎖される可能性が高い」であることを私に言っています) (TextMateバンドルの場合)、私はそれらをきちんと名前空間にしたいと思っています。

これらのメソッドは実際には単なる関数です。つまり、自分のスコープ外のものでは動作しないため、実際にはクラスに属しません。インスタンス化が必要なものは何もありません。

これまでのところ、私はこれをやってきたし、それは

module Helpers::Foo 
    module_function 
    def bar 
     # ... 
    end 
end 
Helpers::Foo.bar # this is how I'd like to call the method/function 

うまく動作しますが、それはする方がよいでしょう:
1.スキップmodule_functionself.*としてメソッド/関数を宣言しますか?
2.モジュールの代わりにクラスを宣言する方が良いでしょうか?
3. class << self(モジュール内またはクラス内)を使用しますか?
4.それとも完全に他の何か?

これはかなり自由な質問ですが、私は本当に人々が何をしているのか聞いています。

答えて

8

私は

module Foo 
    def self.bar 
    "bar" 
    end 
end 

Foo.bar #=> "bar" 

または

module Foo 
    def Foo.bar 
    "bar" 
    end 
end 

Foo.bar #=> "bar" 

のいずれかを好むが、おそらく、元の方に傾く、私はself.が本当にわかりやすいと思います。

編集:コメントを読んだ後、わかりやすいように3番目のオプションを提案します。技術的には、これはEigenクラスに含まれるメソッドを拡張するものとして定義されると思います。

module Foo 
    module ClassMethods 
    def baz 
     "baz" 
    end 
    end 
    extend ClassMethods 
end 

Foo.baz #=> "baz" 
+0

+1前者は、別名です。 –

+2

良い点。しかし、実際にはすべてがヘルパー関数以外のものを含んでいるモジュールなので、 'self.'が自分のコードでその重要性を失うのではないかと心配しています。 _everything_は 'self.'として定義されます。この場合、私は' self 'として何も定義しないで、代わりに 'module_function'を使います。 – Flambino

+0

私は、私がこの状況のた​​めに好む第3の選択肢を含めるように答えを更新します。 –