LoginSignup
13
14

More than 5 years have passed since last update.

RubyでPluggableなアーキテクチャを実現する

Last updated at Posted at 2014-07-23

プラグインを扱うコードを書く為に、Rubyで動的にクラスをロードする方法を適当に調べてみた[1][2]。
以下の方法があるっぽい。
- const_get
- eval
- qualified_const_get

どれ使えばいいのかイマイチわからん。

そもそもプラグイン的なものを作る場合にいちいちプラグイン側のクラス名気にする必要ないかも。
むしろプラグイン側で勝手にnewしてインスタンス突っ込んでくれるような感じでいいかも。
こんな感じで。どうっすかね。

app.rb
class Plugin
    def Plugin.load(path)
        plugin = new()
        plugin.instance_eval File.read(path)
        plugin
    end

    def get_instance
        @instance
    end
end

#以下は読み込むファイル名をハードコードしているが、
#実際は[1]のコードみたいに特定のディレクトリにあるrubyのファイルをロードする
p = Plugin.load("myplugin.rb")

#プラグインを使う側はプラグインに要求するメソッドしか呼び出さない      
p.get_instance().execute()          
myplugin.rb
module MyModule
    class MyPlugin
        #プラグインに要求されるメソッドを実装しておく
        def execute()
            puts "hello world!!!"
        end
    end
end

@instance = MyModule::MyPlugin.new

追記

i18nさんのアドバイスを元に最終的に上記とは違う形ですが簡単にPlugin化するためのモジュールを作りました。
gemとして公開したのでもしよければ使ってみて下さい。

https://rubygems.org/gems/pluggable_lite
https://github.com/nyamage/PluggableLite

参考URL

[1]Rubyで動的にクラスファイル(プラグイン)を読み込む
http://motivation.drivendevelopment.jp/2009-11-16-1.html

[2]Loading classes from strings in Ruby
http://blog.sidu.in/2008/02/loading-classes-from-strings-in-ruby.html#.U8-tSYB_ux8

あなたの Ruby コードを添削します 【第 4 回】 Tropy
http://magazine.rubyist.net/?0015-CodeReview

13
14
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
14