Сделать классы C ++ COM более удобными для тестирования - PullRequest
1 голос
/ 24 июня 2010

Наша кодовая база имеет много 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
{
...
};

Является ли это хорошим подходом, или есть лучший способ иметь класс 'plain C ++', обеспечивающий базовую функциональность, и класс COM, выполняющий работу с COM?Я думаю, что для минимизации количества кода, который я пишу, я бы предпочел не вводить методы-обертки, но иметь фактический метод реализации в не-COM-классе, поэтому он автоматически присутствует в COM-классе.

Мысли?};

1 Ответ

5 голосов
/ 24 июня 2010

Там, где я работаю, мы решили отделить базовые C++ классы от COM по нескольким причинам:

  1. Это легче поддерживать .Люди, которые не знают COM, могут сосредоточиться на написании основных классов, а люди, которые знают COM, могут безопасно обернуть основные классы, не заботясь о базовой реализации.

  2. Повторное использование кода .Возможно, это не является обязательным требованием, но поскольку основные классы отделены от COM, мы используем их непосредственно в C++ проектах, где COM не требуется.

  3. Тестирование керна .Поскольку логика отделена от интерфейса, вы можете легко перейти к минимальным тестам.Вы больше не удивляетесь: «Где моя утечка? Это законная утечка в моей основной логике или что-то, связанное с COM?»Основные классы могут быть протестированы независимо и эффективно.

Это увеличивает как количество файлов, так и время компиляции, но я (мы) думаю, что оно того стоит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...