배경:
많은 인스턴스 메소드를 선언하는 모듈이 있습니다
module UsefulThings
def get_file; ...
def delete_file; ...
def format_text(x); ...
end
그리고 클래스 내에서 이러한 메소드 중 일부를 호출하고 싶습니다. 루비에서 일반적 으로이 작업을 수행하는 방법은 다음과 같습니다.
class UsefulWorker
include UsefulThings
def do_work
format_text("abc")
...
end
end
문제
include UsefulThings
의 모든 메소드를 가져옵니다 UsefulThings
. 이 경우 난 단지 원하는 format_text
명시 적으로하지 않으려 get_file
하고 delete_file
.
이에 대한 몇 가지 가능한 해결책을 볼 수 있습니다.
- 어떻게 든 어디서나 포함시키지 않고 모듈에서 직접 메소드를 호출합니다.
- 어떻게 할 수 있는지 모르겠습니다. (따라서이 질문)
- 어떻게 든 포함
Usefulthings
하고 방법 중 일부만 가져옵니다.- 나는 또한 어떻게 /이 작업을 수행 할 수 있는지 모른다
- 프록시 클래스를 작성하여 포함
UsefulThings
시킨 다음format_text
해당 프록시 인스턴스에 위임하십시오.- 이것은 효과가 있지만 익명 프록시 클래스는 해킹입니다. 왝.
- 모듈을 2 개 이상의 작은 모듈로 분할
- 이것은 또한 효과가 있으며 아마도 내가 생각할 수있는 가장 좋은 해결책 일 것입니다. 그러나 수십 및 수십 개의 모듈이 확산되면 피하는 것이 좋습니다.
단일 모듈에 관련없는 기능이 많은 이유는 무엇입니까? 그것은의 ApplicationHelper
A는 아무 것도 다른 곳 속한하지 특정 정도에 대한 덤핑 지상으로 우리 팀이 사실상 결정적인를 가지고 응용 프로그램을, 레일에서. 거의 모든 곳에서 사용되는 독립형 유틸리티 방법. 나는 그것을 별도의 도우미로 나눌 수는 있지만 30 가지가 있었으며 모두 1 가지 방법이 있습니다 ... 이것은 비생산적 인 것 같습니다.
module UT; def add1; self+1; end; def add2; self+2; end; end
중이 add1
아닌 사용하고 싶다고 가정합니다 . 이를 위해 모듈 기능을 갖는 것이 어떻게 도움이됩니까? 뭔가 빠졌습니까? add2
Fixnum
Module#included
콜백 을 사용하여 다른 모듈 중 하나 를 트리거 하여 한 모듈이 다른 모듈을 항상 자동으로 포함하도록 할 수 있습니다include
. 이format_text
방법은 자체적으로 유용하기 때문에 자체 모듈로 이동할 수 있습니다. 이것은 관리 부담을 덜 줄입니다.