2009-07-31 4 views
5

제 생각 엔 제 3 자 클래스에 기능을 추가하는 mixin 모듈을 쓰고 있습니다. 분명히 제 3 자 클래스와 그 클라이언트에 접근 가능하게 만들고 싶은 메소드와 인스턴스 변수 중 일부. 이것들은 mixin 모듈의 공개 인터페이스를 구성합니다.위생적인 ​​루비 믹스는 어떻게 쓰나요?

그러나 다른 특정 메서드와 인스턴스 변수를 캡슐화해야합니다. 믹싱하는 클래스에 액세스 할 수 없도록하고 싶습니다. 믹서 클래스의 메서드 나 인스턴스 변수를 우연히 오버 라이딩하거나, 음영 처리하거나, 충돌 시키거나 방해하지 않도록하고 싶습니다. 현재 존재하고 있을지도 모르는 것, 또는 제 3자가 혼합하고있는 클래스를 변경했을 경우에 장래에 생성 될 가능성이있는 것.

믹스 인이 이런 식으로 "위생적"인 것을 확인하기 위해 어떤 예방 조치를 취해야합니까?

답변

2

기능 및 인스턴스 변수를 캡슐화하는 별도의 개체를 만들고 mixin이 공개적으로 액세스 할 수있는 메서드를 해당 개체에 위임하도록합니다. 이제 단일 인스턴스 변수를 객체와 연결하기 만하면됩니다. 모듈에 {Mixee => Delegate} Hash를 저장하고 각 메소드가 혼합 된 시작 부분을 검색하여이를 회피 할 수도 있습니다.

1

아마도 모든 유틸리티 메소드를 포함하는 하위 모듈을 만들 수 있습니다.

module Foo 
    module Utils 
    def self.answer 
     42 
    end 
    end 
    def helpme 
    "the answer is #{Utils.answer}" 
    end 
end 
include Foo 
puts helpme