gpt4 book ai didi

C++ 或 D : idiom to decouple classes without dynamic dispatch?

转载 作者:搜寻专家 更新时间:2023-10-31 01:35:34 25 4
gpt4 key购买 nike

我是一个真正的性能爱好者,但我也意识到执行自动化测试的重要性(直到更好的形式验证方法成为主流)。

缺点是,当您尝试针对可测试性进行设计时,您会开始引入接口(interface)来表示您的依赖项。如您所知,接口(interface)使您的调用动态分派(dispatch)到该依赖项上,并减少编译时的优化机会。

class MyDependency
{
void someMethod();
}

class MyUnit
{
// Concrete type reference of MyDependency allows
// to bypass the dynamic dispatch
this(MyDependency mayBeAMock)
{
mayBeAMock.someMethod();
}

unittest
{
// Now how can I get a mock of my dependency without to instantiate it.
auto dep = someBlackMagic.getMock();
auto uut = new MyUnit(dep);
}
}

确实存在一种更好的方法来单元测试类,而无需在生产中承担动态调度成本。如果需要,我可以负担执行单元测试的费用,但负担不起产品发布的费用。

我对 D 和 C++ 解决方案很感兴趣。

最佳答案

我在 D 中经常使用的一种技术是进行编译时策略替换:

private struct MyUtilImpl ( HTTPClient )
{
void foo ( )
{
HTTPClient.makeRequest("url");
}
}

version (unittest)
alias MyUtil = MyUtilImpl!FakeHTTPClient;
else
alias MyUtil = MyUtilImpl!RealHTTPClient;

它在本质上与经典的依赖注入(inject)非常相似,但我不是模拟 I/O 实用程序并通过接口(interface)进行交换,而是在编译时使用模板参数执行相同的操作。

它还有一个好处是不需要更改程序的其余部分就可以开始传递接口(interface)。

关于C++ 或 D : idiom to decouple classes without dynamic dispatch?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37088958/

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