我正在开发一个为某些服务定义客户端接口的库。在后台,我必须验证用户提供的数据,然后使用来自另一个库的 Connection 类将其传递给“引擎”进程(注意:我们库的用户不知道 Connection 类)。我的一位同事建议使用 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?