Sto lavorando a una libreria che definisce un'interfaccia client per qualche servizio. Sotto il cofano devo convalidare i dati forniti dagli utenti e poi passarlo al processo di "motore" utilizzando classe Connection da un'altra libreria (nota: la classe Connection non è noto agli utenti della nostra biblioteca). Uno dei miei colleghi ha proposto di utilizzare Pimpl:È un buon posto per usare il modello 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;
}
Tuttavia, trovo molto difficile prova - anche se collego il mio test per qualche implementazione deriso di connessione, non ho un facile accesso ad essa per impostare e convalidare le aspettative. Mi sto perdendo qualcosa, o molto più pulito e la soluzione verificabile utilizza l'interfaccia + fabbrica:
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();
}
Esistono motivi per andare con Pimpl in questa situazione?
Potrei sbagliarmi, ma se hai un membro di tipo 'Connection' (e non' Connection * '), devi includere la sua definizione nell'header e quindi' Connection' è noto agli utenti della tua libreria. – ereOn
Vedere http: // stackoverflow.it/questions/825018/pimpl-idiom-vs-pure-virtual-class-interface –
@ereOn: nell'intestazione del client uso solo la dichiarazione anticipata della classe ClientImpl (è possibile, poiché il membro è un puntatore) così l'intestazione di ClientImpl può essere nascosto dai miei client di libreria, quindi posso usare Connection come membro di ClientImpl. – chalup