2013-08-02 2 views
3

예 : - 응용 프로그램이 있고 플러그인을 통해 가져올 객체를 만들고 싶다면 어떻게 작성해야합니까?플러그인을 통해 확장 가능한 루비 응용 프로그램을 작성하는 방법

나는 예를 든다 - 그것은 내가 의도 한 것처럼 작동한다; 그러나 이것이 이것에 관한 '전통적인 방식'인지 확실하지 않습니다.

Ruby에서 더 효율적이고 적절한 방법이 있습니까?

start.rb

require './cloud.rb' 

dir = 'plugins' 
$LOAD_PATH.unshift(dir) 
Dir[File.join(dir, "*.rb")].each {|file| require File.basename(file) } 

mycloud = CloudProvider.descendants.first.new 


mycloud.say('testing') 

cloud.rb

class CloudProvider 

    def self.descendants 
    ObjectSpace.each_object(Class).select { |asdf| asdf < self } 
    end 
end 

플러그인/aws.rb

# This one inside plugins/ 
class AWS < CloudProvider 
    def initialize 

    end 

    def say(val) 
    puts val 
    end 
end 
+0

플러그인이 지정한 인터페이스를 구현하는 것일뿐 아니라 기본 클래스가 없어야합니다. Ruby에서는 인터페이스를 선언 할 필요가 없습니다 (예 : Java에서와 같이). 객체가 인터페이스의 메소드에 응답하면, 객체가이를 구현합니다. – Jonah

답변

1

Jekyll은 널리 사용되는 Ruby 프로젝트로서 plugins을 제공합니다.

  1. 이 플러그인의 기본 기능을 구현하는 기본 클래스를 구현 (지킬 당신이 상속 수있는 클래스의 몇 가지 종류가 있습니다) : 나는 그들의 접근 방식을 많이 좋아한다.

  2. 플러그인을 작동시키기 위해 서브 클래스가 대체해야하는 메소드를 명확하게 지정하십시오.

그런 다음 사용자가 plugins 디렉토리에 모든 플러그인을 덤프하고 당신이 지금하고있는 모든 파일을로드 할 수 있습니다. 이 접근법은 견고한 객체 지향 개념에 기반하며 매우 깨끗합니다.

제안 사항 : Ruby는 사용할 수있는 inherited 콜백을 제공합니다. 이는 모든 수업을 검색하는 것보다 훨씬 우수합니다 (asdf < self).

+0

Heh. 나는 방금 'asdf'에 머물렀다는 것을 깨달았습니다. 원래이 줄을 'klass'로 발견했으며,이 줄을 특수 키워드로 보았는지 테스트했습니다. –

+0

감사! 내가 여분의 약간의 분이 있었을 정도로 지금까지 갔고, 이것을 읽어라 - 매우 깨끗한 접근! –

관련 문제