代码之家  ›  专栏  ›  技术社区  ›  Mr. Boy

使C++ COM类更具测试友好性

  •  1
  • Mr. Boy  · 技术社区  · 14 年前

    我们的代码库中有很多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 回复  |  直到 14 年前
        1
  •  5
  •   j_random_hacker    14 年前

    在我工作的地方,我们选择分离核心 C++ 来自的类 COM 原因如下:

    1. 这是 易于维护 . 不认识的人 组件对象模型 很多人可以专注于写核心课程和认识的人 组件对象模型 可以安全地包装核心类,而不关心底层的实现。

    2. 代码可重用性 . 这可能不是您的需求,但由于核心类与 组件对象模型 一个,我们可以直接用在 C++ 项目,在哪里 组件对象模型 不需要。

    3. 岩心试验 . 由于逻辑与接口分离,您可以轻松地进行最少的测试。你不再怀疑:“我的漏洞在哪里?这是我核心逻辑的合法漏洞还是与 组件对象模型 “核心类可以独立有效地进行测试。

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