Я работаю над библиотекой, которая определяет клиентский интерфейс для некоторой службы. Под капотом я должен проверить данные, предоставленные пользователями, а затем передать их процессу «двигатель», используя класс Connection из другой библиотеки (обратите внимание: класс Connection не известен пользователям нашей библиотеки). Один из моих коллег предложил использовать Pimpl:Является ли это хорошим местом для использования шаблона PIMPL?
class Client {
public:
Client();
void sendStuff(const Stuff &stuff) {_pimpl->sendStuff(stuff);}
Stuff getStuff(const StuffId &id) {return _pimpl->getStuff(id);}
private:
ClientImpl *_pimpl;
}
class ClientImpl { // not exported
public:
void sendStuff(const Stuff &stuff);
Stuff getStuff(const StuffId &id);
private:
Connection _connection;
}
Однако, я считаю, это очень тяжело протестировать - даже если я свяжу свои тесты в какой-то издевался реализации Connection, не имеют легкий доступ к нему, чтобы установить и утверждать ожидания. Могу ли я что-то отсутствует, или значительно чище и проверяемым решение использует интерфейс + завод:
class ClientInterface {
public:
void sendStuff(const Stuff &stuff) = 0;
Stuff getStuff(const StuffId &id) = 0;
}
class ClientImplementation : public ClientInterface { // not exported
public:
ClientImplementation(Connection *connection);
// +implementation of ClientInterface
}
class ClientFactory {
static ClientInterface *create();
}
Существуют ли какие-либо причины, чтобы пойти с Pimpl в этой ситуации?
Возможно, я ошибаюсь, но если у вас есть член типа 'Connection' (а не' Connection * '), вы должны включить его определение в свой заголовок, и поэтому' Connection' известно пользователям вашей библиотеки. – ereOn
См. Http: // stackoverflow.com/questions/825018/pimpl-idiom-vs-pure-virtual-class-interface –
@ereOn: в заголовке клиента Я использую только декларацию объявления класса ClientImpl (возможно, поскольку элемент является указателем), поэтому заголовок ClientImpl может быть скрытый от моих клиентов библиотеки, поэтому я могу использовать Connection как член ClientImpl. – chalup