1

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

想法?};

4

1 回答 1

5

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

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

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

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

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

于 2010-06-24T09:40:55.410 回答