2012-12-13 6 views
1

모듈의 메서드 결과를 메모하려면 나쁜 연습으로 간주됩니까?모듈 내부에서 인스턴스 변수를 사용하는 것은 나쁜 습관입니까?

module FooHelper 
    def values_for_thingie 
    if some_condition && that_other_condition 
     { a: "foo", b: "bar" } 
    else 
     { a: "bar", b: "baz" } 
    end 
    end 
end 

이의이 레일보기가 "A"의 값을 얻기 위해 ..이 도우미 메서드 하나를 여러 번 호출하는 것입니다 가정 해 봅시다, 그리고 또 다른 가치를 얻을 :

는 내가 레일 도우미가 상상

: "B"...의는 또한 some_condition을 가정 해 봅시다의이 일을 해결할 수 있습니다

우리가 한 번 이상 호출되는 해당하지 않도록 매우 복잡한 무언가를하는 방법입니다 ...

module FooHelper 
    def values_for_thingie 
    @values_for_thingie ||= \ 
     if some_condition && that_other_condition 
     { a: "foo", b: "bar" } 
     else 
     { a: "bar", b: "baz" } 
     end 
    end 
end 

그러나이 인스턴스 변수가 FooHelper의 인스턴스와 아무 관련이 없기 때문에이 방법이 마음에 들지 않습니다. 실제로 제어 할 수는 없습니다. 이런 이유로 좋은 해결책이 아닌 것처럼 보입니다.

답변

1

조건이 인스턴스간에 일정하면 클래스/모듈 메서드 여야합니다. 그런 다음 memoization에 사용 된 인스턴스 변수는 해당 클래스/메소드의 인스턴스 변수가됩니다. 그게 잘못된 것은 아닙니다. 또는 인스턴스 메서드로 유지하고 메모 변수로 클래스 변수를 사용할 수 있습니다.

1

인스턴스 변수는 모듈에 거주하지 않고 클래스의 인스턴스에서 모듈에 포함되어 있습니다. FooHelper에 정의되어 귀하의 예를 @values_for_thingie에서

을하지만, ActionView 인스턴스에 살 것이다.

따라서 values_for_thingie의 결과가 요청 사이에서 변경되어야한다면 올바르게 처리 할 수 ​​있습니다.

그러나 귀하의 경우에 실행하는 데 시간이 걸리는 방법 만 메모하면됩니다. some_condition

관련 문제