SimpleObjectContainer という gem をリリースした

リリースしたよ

業務で Object::Container という CPAN モジュールに似た動きをする gem が欲しいなーと思ったので作ってリリースしました。まだ機能限定版です。

https://rubygems.org/gems/simple-object-container

ドキュメントっぽいのは github の README.md を参照してください。

https://github.com/Shinpeim/SimpleObjectContainer

ドキュメントには書いてないですが、本家 Object::Container と同じく遅延ロードするようになっています。

これを使うとなにがうれしいの

アプリケーションを書いていると、アプリケーション全体を横断する関心を持っているようなオブジェクトというのがたまにあります。典型的なのはイベントロガーなどでしょうか。

そういうオブジェクトは、アプリケーションからグローバルに参照したいですね。そういうときに、この SimpleObjectContainer を利用すると、シングルトンパターンで作られてるとかそういうのじゃないようなオブジェクトも、グローバルに参照できるようになってうれしいです。

あと、本番と開発でregister するオブジェクトを変えれば、開発環境と本番環境で参照するオブジェクトを変えるみたいなこともできる、そういう簡単なDIコンテナっぽい使い方もできます(まあ Ruby のような動的な言語では Java みたいな言語ほどDIコンテナの需要は高くないとは思いますが)。

定数/グローバル変数で実現できるじゃん

Ruby の場合定数やグローバル変数にオブジェクトを代入すればそのオブジェクトはグローバルに参照できるようになるじゃんってのはその通りです。ただし、SimpleObjectContainer使うと、遅延ロードされるってことと、「ここにはアプリケーション横断的な関心を持ったオブジェクトが入ってるよ」という意図が明示できることが嬉しいと思います。

グローバルに参照できるということは、SimpleObjectContainer に登録されたオブジェクトは一種のグローバル変数として振る舞うことになります。 濫用すると人間が死にます。グローバル変数で人間が死ぬ!これで管理してるオブジェクトを、どこかで値を書き換えてほかのところで使う〜〜〜!みたいなやりかたするのはやめたほうがいいと思います。

see also

http://search.cpan.org/~typester/Object-Container-0.14/lib/Object/Container.pm