मैं एक पुस्तकालय पर काम कर रहा हूं जो कुछ सेवा के लिए क्लाइंट इंटरफेस को परिभाषित करता है। हुड के तहत मुझे उपयोगकर्ताओं द्वारा प्रदान किए गए आंकड़ों को प्रमाणित करना होगा और फिर इसे किसी अन्य लाइब्रेरी से कनेक्शन क्लास का उपयोग करके "इंजन" प्रक्रिया में पास करना होगा (नोट: कनेक्शन क्लास हमारी लाइब्रेरी के उपयोगकर्ताओं के लिए ज्ञात नहीं है)। मेरे साथियों में से एक 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 साथ जाने के लिए कर रहे हैं?
मैं गलत हो सकता हूं, लेकिन यदि आपके पास 'कनेक्शन' (और 'कनेक्शन *' प्रकार) का सदस्य नहीं है, तो आपको अपनी शीर्षलेख में अपनी परिभाषा शामिल करनी होगी और इसलिए 'कनेक्शन' आपकी लाइब्रेरी के उपयोगकर्ताओं को ज्ञात है। – ereOn
http: // stackoverflow देखें।कॉम/प्रश्न/825018/pimpl-idiom-vs-pure-virtual-class-interface –
@ereOn: क्लाइंट हेडर में मैं क्लाइंटइम्पल क्लास की केवल अगली घोषणा का उपयोग करता हूं (यह संभव है, क्योंकि सदस्य एक सूचक है) इसलिए क्लाइंटइम्प्लर हेडर हो सकता है मेरे लाइब्रेरी क्लाइंट से छिपा हुआ है, इसलिए मैं ClientImpl के सदस्य के रूप में कनेक्शन का उपयोग कर सकता हूं। – chalup