4

たとえば、アプリケーションがあり、プラグインを介してインポートされるオブジェクトを作成したい場合、どのように記述すればよいでしょうか?

例をまとめました-意図したとおりに機能します。ただし、これが「従来の」方法であるかどうかはわかりません。

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')

クラウド.rb

class CloudProvider

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

plugins/aws.rb

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

  end

  def say(val)
    puts val
  end
end
4

1 に答える 1

1

Jekyllは、プラグインを提供する広く使用されている Ruby プロジェクトです。私は彼らのアプローチがとても好きです:

  1. プラグインの基本機能を実装する基本クラスを実装します (Jekyll には、継承できるいくつかの異なるタイプのクラスがあります)。

  2. プラグインを機能させるためにサブクラスがオーバーライドする必要があるメソッドを明確に指定します。

次に、ユーザーにすべてのプラグインをpluginsディレクトリにダンプさせ、現在行っているようにすべてのファイルをロードさせることができます。このアプローチは、堅実な OO の概念に基づいて構築されており、非常にクリーンです。

1 つの提案: Ruby は、使用できる継承されたコールバックを提供します。これは、 ですべてのクラスを検索するよりもはるかに優れていますasdf < self

于 2013-08-02T05:55:22.147 に答える