gpt4 book ai didi

c++ - 堆栈分配的 RAII 对象与 DI 原则

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

在 C++ 中,我经常使用 RAII 风格的对象来使代码更可靠,并将它们分配到堆栈上以提高代码的性能(并避免 bad_alloc)。

但是在堆栈上创建具体类的对象违反了依赖倒置 (DI) 原则并阻止模拟此对象。

考虑以下代码:

struct IInputStream
{
virtual vector<BYTE> read(size_t n) = 0;
};

class Connection : public IInputStream
{
public:
Connection(string address);
virtual vector<BYTE> read(size_t n) override;
};

struct IBar
{
virtual void process(IInputStream& stream) = 0;
};

void Some::foo(string address, IBar& bar)
{
onBeforeConnectionCreated();
{
Connection conn(address);
onConnectionCreated();
bar.process(conn);
}
onConnectionClosed();
}

我可以测试 IBar::process,但我也想测试 Some::foo,而不创建真正的 Connection 对象。

我当然可以使用工厂,但它会使代码显着复杂化并引入堆分配。
另外,我不喜欢添加 Connection::open 方法,我更喜欢构造完全初始化和功能齐全的对象。

我会让 ConnectionSome 键入模板参数(或者为 foo 如果将其提取为自由函数),但我'我不确定这是正确的方法(模板对很多人来说就像黑魔法,所以我更喜欢使用动态多态性)

最佳答案

您现在正在做的是“强制耦合”RAII 类和服务提供者类(如果您想要可测试性,它实际上应该是一个接口(interface))。通过以下方式解决此问题:

  1. Connection抽象为IConnection
  2. 有一个单独的 ScopedConnection 类,在其之上提供 RAII

例如:

void Some::foo(string address, IBar& bar)
{
onBeforeConnectionCreated();
{
ScopedConnection conn(this->pFactory->getConnection());
onConnectionCreated();
bar.process(conn);
}
onConnectionClosed();
}

关于c++ - 堆栈分配的 RAII 对象与 DI 原则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7806985/

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