【发布时间】:2016-03-17 16:36:07
【问题描述】:
我想开始在我的 C++ 代码中添加一些接口,以便更轻松地使用 mock 进行单元测试。
这样做的问题是从 C++ 中的方法返回抽象类很痛苦。不能按值返回,所以需要返回指针或引用。
鉴于过去六七年 C++ 的所有发展,我想我想问一下我们是否有更好的方法来返回抽象基类。没有噪音的界面看起来像这样,但我确信这是不可能的。
IBaseInterface getThing() {return DerivedThing{};}
我记得过去这样做的方式是使用指针(现在可能是智能指针):
std::unique_ptr<IBaseInterface> getThing() {return std::make_unique<DerivedThing>();}
指针的问题在于,我实际上从未打算利用 nullptr,因此处理指针而不是值的开销和噪音对我作为读者没有任何价值。
我不知道有没有更好的方法来处理这个问题?
【问题讨论】:
-
我不清楚为什么使用 mock 进行单元测试需要抽象接口。
-
请注意,您的第一个示例不起作用,您需要返回指针或引用。
-
在某些极端错误情况下,如果不计划
exit,构建永远不会处于空状态的多态类型是非常困难的。如果您知道某些东西不是 nullptr,则可以不检查它:unique_ptr的实际成本是它是堆分配的(在免费存储上)而不是自动存储。但是,如果您愿意限制对象的大小并在极端情况下承认罕见的exit,则发布接口(通过 vtable 或通过类型擦除)的智能联合类型可以工作,具有不同数量的工作。 -
你不应该为了单元测试而牺牲你的软件架构。
-
@ChristianHackl 这是一个有争议的声明。这样做通常会改进架构。
标签: c++ interface c++17 return-value-optimization abstract-base-class