gpt4 book ai didi

c++ - 依赖注入(inject)库的正确比喻是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:44:08 24 4
gpt4 key购买 nike

我是一个实现依赖注入(inject)的小型 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

嗯,我对这个比喻不是很满意,因为:

  • 在现实世界中,你将插头插入 socket ,所以源类应该有一个插头,目标类应该有一个 socket ,但在“代码世界”中,我有一个类的指针指向另一个类;
  • 当你与基数有关联时,我的比喻就不太管用 > 1. 我试过 MultiplePlug< T > (它基本上是一个 std::list< Plug< T > > ),但听起来不太好:现实世界中的“多插头”是什么?

Here你可以找到我的图书馆。对于更适合我的代码的隐喻,您有什么建议吗?

(不过,如果您对图书馆有任何其他好的建议,我们将非常欢迎!)

非常感谢。

注意:我知道还有一个问题的主题是“What's a good metaphor for Dependency Injection”,但这不是它的拷贝。

编辑:This是一篇著名博文的评论中对该主题的讨论。

Edit2:最后,我决定将语法更改为这种更好、更简单的语法:

// explicit catalog
use( myCatalog["myBar"] ).as( "bar" ).of( myCatalog["myFoo"] );

// implicit catalog:
within( myCatalog )
{
use( "myBar" ).as( "bar" ).of( "myFoo" );
...
}

最佳答案

我假设这是针对配置阶段的。如果您坚持使用 PlugInto 术语:

// this means myFoo.bar = myBar
catalog[ "myFoo" ].Into( "bar" ).Plug( catalog[ "myBar" ] );

其中 Plug 用作动词,即“插入”。如果您创建一个流畅的界面,请尝试制定有意义的句子。如果我想配置“myFoo”的几个依赖项,那么我会很乐意这样写:

catalog[ "myFoo" ].
.Into( "bar").Plug( "myBar" )
.Into( "some_other_member" ).Plug( "that_other_instance" );

有点不寻常的是,通常在进行配置时,您处理的是类型而不是实例...

关于c++ - 依赖注入(inject)库的正确比喻是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11781974/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com