2011-01-28 3 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 Foo.bar 
    "bar" 
    end 
end 

Foo.bar #=> "bar" 

그러나 아마 전 향하다

module Foo 
    def self.bar 
    "bar" 
    end 
end 

Foo.bar #=> "bar" 

또는

, 내가 self. 정말 설명 생각 선호합니다.

편집 : 의견을 읽은 후에는 가독성을 위해 선호하는 세 번째 옵션을 제안합니다. 기술적으로 이것은 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

나는이 상황에 선호하는 세 번째 옵션을 포함하도록 대답을 업데이트 할 것이다. –