Tôi đang làm việc trên thư viện xác định giao diện ứng dụng cho một số dịch vụ. Dưới mui xe tôi phải xác nhận hợp lệ dữ liệu được cung cấp bởi người dùng và sau đó chuyển nó tới tiến trình "engine" bằng cách sử dụng lớp Connection từ một thư viện khác (lưu ý: lớp Connection không được biết đến với người dùng thư viện của chúng ta). Một trong những đồng nghiệp của tôi đề xuất sử dụng pImpl:Đây có phải là nơi tốt để sử dụng mẫu PIMPL không?
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;
}
Tuy nhiên, tôi thấy nó rất khó để kiểm tra - thậm chí nếu tôi liên kết các bài kiểm tra của tôi để thực hiện một số chế giễu của kết nối, tôi không có quyền truy cập dễ dàng để nó để thiết lập và xác nhận kỳ vọng. Tôi có thiếu điều gì đó, hoặc giải pháp sạch hơn và có thể kiểm tra hơn là sử dụng giao diện + nhà máy:
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();
}
Có bất kỳ lý do gì để đi với PIMPL trong tình huống này không?
Tôi có thể sai, nhưng nếu bạn có một thành viên kiểu 'Kết nối' (và không phải' Kết nối * '), bạn phải bao gồm định nghĩa của nó trong tiêu đề của bạn và do đó' Kết nối' được biết đến với người dùng thư viện của bạn. – ereOn
Xem http: // stackoverflow.com/questions/825018/pimpl-idiom-vs-pure-virtual-class-interface –
@ereOn: trong tiêu đề Client tôi chỉ sử dụng khai báo phía trước của lớp ClientImpl (có thể, vì thành viên là một con trỏ) vì vậy tiêu đề ClientImpl có thể ẩn khỏi các ứng dụng thư viện của tôi, vì vậy tôi có thể sử dụng Connection làm thành viên của ClientImpl. – chalup