2012-08-25 3 views
0

는 내가 latitudelongitude 방법을 구현하는 모델까지의 거리와 관련된 방법을 제공하는 Module 이름 Coordinated 있습니다.모델이 포함 된 클래스가 특정 메소드를 구현하도록 요구하려면 어떻게해야합니까?

module Coordinated 
    ... 
    def crow_flies_to(place) 
    raise ArgumentError, "place does not implement latitude and longitude" unless is_coordinated?(place) 
    Math.sqrt((latitude - place.latitude).abs**2 + (longitude - place.longitude).abs**2) 
    end 

    def is_coordinated?(place) 
    place.respond_to?(:latitude) && place.respond_to?(:longitude) 
    end 
    ... 
end 

나는 클래스가로드 될 때 Coordinated가 포함되는 클래스가 필요한 메소드를 구현하는지 테스트하고 싶습니다. 어떻게해야합니까?

답변

1

당신은 모듈이 포함되어 때 실행되는 included 후크 사용할 수 있습니다 :이 방법이 정의 후 이미 존재해야하기 때문에 포함이 발생해야하는 단점이있다

module M 
    def self.included(klass) 
    raise "Must implement 'foo'" unless klass.instance_methods.include?(:foo) 
    end 
end 

class C; include M; end 
#=> RuntimeError 

class C 
    def foo; end 
    include M 
end 
#=> C 

때 후크 실행됩니다.

+0

완벽한 답변. 감사. – barelyknown

+0

이것은 또한이 기능을 투명하게 구현하는 대신 다른 개체에 투명하게 위임 한 개체와 함께이 mixin을 사용할 수 없음을 의미합니다. 물론 객체 지향 프로그래밍에서 강력한 기술입니다. 실제로 질문하는 사람에 따라 기능 수행을 구분하고 다른 사람에게 위임하는 기능을 구분할 수 없다는 것이 객체 지향의 * 정의 *입니다. IOW :이 솔루션은 객체 지향을 사용하지 못하게합니다. –

+0

@ JörgWMittag 오 이런 일이 처음에는 꽤 심술 궂은 생각이라고 생각합니다. 메소드가 그것을 사용하려고 시도 할 때까지는 모듈이주의를 기울여서는 안된다. 이것은 또한'method_missing'을 통해서만 존재하는 메소드들과 같은 것들을 위해 깨질 것입니다. –

관련 문제