gpt4 book ai didi

c++ - 使 C++ COM 类更易于测试

转载 作者:行者123 更新时间:2023-11-30 01:31:23 26 4
gpt4 key购买 nike

我们的代码库有很多 COM 对象,所以通常我们会有这样的东西:

//this is the IDL-generated IGetTime interface header
#include "gettime.h"

//our COM class implementation of IGetTime
class CGetTime : public IGetTime
{
public:
CGetTime(CGetTimeCF &factory,...); //COM-specific constructor params
/* IUnknown */
STDMETHODIMP QueryInterface(REFIID riid, LPVOID FAR * ppv);
STDMETHODIMP_(ULONG) AddRef();
STDMETHODIMP_(ULONG) Release();

/* IGetTime */
STDMETHODIMP GetTheTime(); //
};

构造函数和其他一些东西的设置方式,这个类只能通过 COM 轻松使用...您可以找到一种创建对象的方法,但它往往是不稳定的。不过在很多情况下,该类的实际功能可能在没有 COM 的情况下也可用...如果您可以执行 new CGetTime();

,这也将更容易测试

我想知道是否有这样的模式:

class CGetTimeBase
{
public:
STDMETHODIMP GetTheTime();
};

class CGetTime : public IGetTime, public CGetTimeBase
{
...
};

这是一个好方法,还是有更好的方法让一个“纯 C++”类提供核心功能,一个 COM 类执行 COM 功能?我认为,为了尽量减少编写的代码量,我宁愿不引入包装方法,而是在非 COM 类中具有实际的实现方法,因此它会自动出现在 COM 类中。

想法?};

最佳答案

在我工作的地方,出于以下几个原因,我们选择将核心 C++ 类与 COM 类分开:

  1. 更易于维护。不太了解 COM 的人可以专注于编写核心类,而了解 COM 的人可以安全地包装核心类,而不用关心底层实现。

  2. 代码重用性。这可能不是您的要求,但由于核心类与 COM 类分离,我们可以直接在 C++ 项目中使用它们,其中 COM 不需要。

  3. 核心测试。由于逻辑与界面分离,您可以轻松地进行最少的测试。您不再怀疑:“我的泄漏在哪里?是我的核心逻辑中的合法泄漏还是与 COM 相关的东西?”可以独立高效地测试核心类。

这增加了文件数量和编译时间,但我(我们)认为这是值得的。

关于c++ - 使 C++ COM 类更易于测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3108415/

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