一部のサービスのクライアント インターフェイスを定義するライブラリに取り組んでいます。内部では、ユーザーから提供されたデータを検証し、別のライブラリの Connection クラスを使用して「エンジン」プロセスに渡す必要があります (注: Connection クラスはライブラリのユーザーには知られていません)。私の同僚の 1 人が 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;
}
ただし、テストするのは非常に難しいと思います。テストを接続の模擬実装にリンクしたとしても、期待を設定して検証するために簡単にアクセスすることはできません。私は何か不足していますか、それともよりクリーンでテスト可能なソリューションは、インターフェイス + ファクトリを使用しています:
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 を使用する理由はありますか?