gpt4 book ai didi

c++ - 正确构建和销毁 Setter 依赖注入(inject)对象(可能使用 qt)

转载 作者:行者123 更新时间:2023-11-28 05:01:55 24 4
gpt4 key购买 nike

I am using QT, so maybe there are more advanced options or best practice approaches. But if there is a good, general C++ or language agnostic answer that would be awesomest!

我尝试正确地构建和销毁由 setter 依赖注入(inject) 配置的对象,并且在规划对象的生命周期方面遇到了困难。

German Microsoft Blog 上一个很好的比喻来讨论对象之间的依赖关系、责任和交互,我想改编:

有一个园丁大师和一个学徒园丁
师傅要徒弟挖。一开始,学徒是拿着铲子 build 的,所以他可以挖,但有人指责,自己造铲子对学徒来说责任太大了。

现在,在第二种方法中,主人可以访问一家不错的铲子工厂,生产优质、可测试的铲子。他继续告诉学徒digWith(testableShovel)

现在在Setter Dependendy Injection的上下文中,我会让师父告诉学徒takeShovel(testableShovel) (setter) 然后diggBoy() 让他挖。

问题来了,师父忘记告诉学徒拿铲子,因为现在学徒没有工具可以挖。

为了处理这种情况,我想知道 - 学徒在施工时创造自己非常基本的挖掘设备(例如一双手)是否合适?还是应该通过构造函数依赖注入(inject)来完成(同时允许构造函数和依赖注入(inject))?创造/带来一双手对学徒来说太过分了,我宁愿有一个nullptr-check?


现在,假设我让我的学徒创造了自己的双手,一旦他拿起铲子,谁会破坏它们?一旦他放下铲子,谁会重新创造它们?放下徒弟,会毁掉什么?

最佳答案

对于您的第一个问题:如果目标对象需要注入(inject)的对象来完成其工作,那么它应该被注入(inject)到构造函数中。否则,构造后对象将处于无效状态。或者,如果您在目标中执行某些依赖项的“基本”版本,那么您将引入依赖项注入(inject)首先试图避免的耦合。另一方面,如果依赖在某种程度上是可选的(例如,在某些情况下,记录器可以被认为是可选的),那么 setter 注入(inject)就完全没问题了。

其次,我认为通过 setter 依赖注入(inject)将对象的所有权赋予其他对象将取决于上下文。如果注入(inject)的对象是其他人不会使用的对象,则将它的 std::unique_ptr 传输到目标。另一方面,如果其他人要使用它,那么您可能会有一个 std::shared_ptr 引用它。这里的关键是现代“智能”指针的使用将发出信号并强制执行注入(inject)对象的所有权。

关于c++ - 正确构建和销毁 Setter 依赖注入(inject)对象(可能使用 qt),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45707248/

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