使C ++ COM类更加适合测试

时间:2010-06-24 08:49:43

标签: c++ com code-testing

我们的代码库有很多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类中。

思考? };

1 个答案:

答案 0 :(得分:5)

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

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

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

  3. 核心测试。由于逻辑与接口分离,因此您可以轻松地进行最小化测试。你不再怀疑:“我的泄密在哪里?它是我的核心逻辑中的合法泄漏还是与COM相关的东西?”核心课程可以独立有效地进行测试。

  4. 这会增加文件数量和编译时间,但我(我们)认为值得。