13
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?