私は依存性注入を実装する小さなC++ライブラリの作者です(誰かがそれを「IoCコンテナ」と呼ぶと思います)。
私はいつも、図書館の良い比喩を見つけることが多くの点で役立つと思っていました。
- ライブラリの使用を簡素化します
- これは、ライブラリの作成者が適切な抽象化を見つけるのに役立ちます
- デザインの健全性を確認するためのガイドです
- クラスの意味のある名前を見つける方法です
- 等々...
今、私のライブラリでは、デバイス/プラグのメタファーを使用しました。クラスは「デバイス」であり、依存関係は「プラグ」であり、プラグを別のデバイスに接続できます。これはコード例です:
REGISTERED_CLASS( Foo ), public Device
{
...
private:
Plug< Bar > bar;
...
};
...
catalog.Create( "myFoo", "Foo" );
catalog.Create( "myBar", "Bar" );
...
catalog[ "myFoo" ].Plug( "bar" ).Into( catalog[ "myBar" ] ); // this means myFoo.bar = myBar
まあ、私はこの比喩に完全には満足していません。理由は次のとおりです。
- 現実の世界では、プラグをソケットに挿入するので、ソースクラスにはプラグがあり、宛先クラスにはソケットが必要ですが、「コードの世界」では、別のクラスを指すクラスのポインターがあります。
- カーディナリティ>1と関連付けられている場合、私の比喩はうまく機能しません。
MultiplePlug< T >
(基本的にはstd::list< Plug< T > >
)を試してみましたが、よく聞こえません。現実の世界での「マルチプラグ」とは何ですか。
ここに私のライブラリがあります。私のコードによりよく合う比喩について何か提案はありますか?
(それでも、ライブラリについて他に良い提案があれば、歓迎します!)
どうもありがとうございます。
注:「依存性注入の優れたメタファーは何ですか」という件名の別の質問があることは知っていますが、これはその複製ではありません。
編集:これは有名なブログ投稿のコメントでの主題に関する議論です。
Edit2:最後に、構文をこのより適切で単純な構文に変更することにしました。
// explicit catalog
use( myCatalog["myBar"] ).as( "bar" ).of( myCatalog["myFoo"] );
// implicit catalog:
within( myCatalog )
{
use( "myBar" ).as( "bar" ).of( "myFoo" );
...
}