문제

타사 클래스에 기능을 추가하는 Mixin 모듈을 작성한다고 가정 해 봅시다. 분명히 제 3 자 클래스 및 클라이언트에 액세스 할 수 있도록하는 방법 및 인스턴스 변수 중 일부입니다. 이들은 Mixin 모듈의 공개 인터페이스를 구성합니다.

그러나 다른 방법과 인스턴스 변수가 캡슐화되기를 원합니다. 나는 그들이 혼합하는 클래스에 접근하기를 원하지 않으며, 특히 나는 그들이 우연히 무시하거나, 그림자, 충돌 또는 믹스 클래스의 방법이나 인스턴스 변수를 방해하는 것을 원하지 않습니다. 현재 존재하거나 타사가 내가 혼합하는 클래스를 수정하면 미래에 만들어 질 수있는 것입니다.

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

도움이 되었습니까?

해결책

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

다른 팁

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

module Foo
  module Utils
    def self.answer
      42
    end
  end
  def helpme
    "the answer is #{Utils.answer}"
  end
end
include Foo
puts helpme
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top