依赖注入库的正确比喻是什么?
What's the right metaphor for a dependency injection library?
我是一个实现依赖注入的小型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" );
...
}
我认为这是为配置阶段准备的。如果您坚持使用Plug
和Into
术语:
// this means myFoo.bar = myBar
catalog[ "myFoo" ].Into( "bar" ).Plug( catalog[ "myBar" ] );
其中Plug
用作动词,即"to plug"。如果你创造了一个流畅的界面,试着写出有意义的句子。如果我想配置"myFoo"的几个依赖项,那么我很乐意写:
catalog[ "myFoo" ].
.Into( "bar").Plug( "myBar" )
.Into( "some_other_member" ).Plug( "that_other_instance" );
有点不寻常的是,通常情况下,在进行配置时,您处理的是类型,而不是实例。。。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- C++避免重复声明的语法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- C++中名称篡改的目的是什么
- 在 c++ 中拥有一组结构的正确方法是什么?
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 是什么阻止DOMTimerCoordinator::NextID进入无休止的循环
- 派生类销毁的最佳实践是什么
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 通过JNI传递数据数组的最快方法是什么
- "using namespace std;"在C++的作用是什么?
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 文件系统:复制功能的速度秘诀是什么
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 是什么原因导致它无法编译?它是声明签名还是在函数本身的实现中
- C++:从注入的DLL读取内存的好方法是什么?