सी ++ में मैं अक्सर कोड को और अधिक विश्वसनीय बनाने के लिए रैली-स्टाइल ऑब्जेक्ट्स का उपयोग करता हूं और कोड को अधिक प्रदर्शन करने के लिए स्टैक पर आवंटित करता हूं (और bad_alloc से बचने के लिए)।आवंटित आरएआईआई ऑब्जेक्ट बनाम डी सिद्धांत
लेकिन स्टैक पर कंक्रीट क्लास का एक ऑब्जेक्ट बनाना निर्भरता उलटा (डीआई) सिद्धांत का उल्लंघन करता है और इस ऑब्जेक्ट को मजाक करने से रोकता है।
निम्नलिखित कोड पर विचार करें:
struct IInputStream
{
virtual vector<BYTE> read(size_t n) = 0;
};
class Connection : public IInputStream
{
public:
Connection(string address);
virtual vector<BYTE> read(size_t n) override;
};
struct IBar
{
virtual void process(IInputStream& stream) = 0;
};
void Some::foo(string address, IBar& bar)
{
onBeforeConnectionCreated();
{
Connection conn(address);
onConnectionCreated();
bar.process(conn);
}
onConnectionClosed();
}
मैं IBar::process
परीक्षण कर सकते हैं, लेकिन मैं यह भी Some::foo
परीक्षण करने के लिए, वास्तविक कनेक्शन वस्तु बनाने के बिना चाहते हैं।
निश्चित रूप से मैं एक कारखाने का उपयोग कर सकता हूं, लेकिन यह कोड को काफी जटिल करेगा और ढेर आवंटन पेश करेगा।
इसके अलावा, मैं Connection::open
विधि जोड़ने की इच्छा नहीं करता, मैं पूरी तरह से प्रारंभिक और पूरी तरह कार्यात्मक वस्तुओं का निर्माण करना पसंद करता हूं।
मैं Some
के लिए Connection
प्रकार टेम्पलेट पैरामीटर बनाना होगा (या foo
के लिए करता है, तो एक नि: शुल्क समारोह के रूप में यह निकालने), लेकिन मुझे यकीन है कि यह सही तरीके से (टेम्पलेट्स कई लोगों के लिए एक काला जादू की तरह लग रही है, इसलिए मैं नहीं कर रहा हूँ गतिशील polymorphism का उपयोग करना पसंद करते हैं)
टेम्पलेट्स कम या कम सक्षम सी ++ प्रोग्रामर के लिए काले जादू नहीं होना चाहिए, मुझे उनसे बचने का कोई कारण नहीं दिखता है।इसके अलावा मुझे नहीं लगता कि ढेर आवंटन * वह * महंगा है (यह निश्चित रूप से आपके द्वारा लिखे गए सॉफ़्टवेयर पर निर्भर करता है), इसलिए मुझे इससे बचने का कोई कारण नहीं दिखता है (जब स्मार्ट पॉइंटर्स के साथ उपयोग किया जाता है)। –
@ एलेक्स बी: उनसे बचने का एक कारण है, हालांकि मैं मानता हूं कि ऐसा इसलिए नहीं है क्योंकि वे "काला जादू" हैं। ऐसा इसलिए है क्योंकि अगर सबकुछ टेम्पलेट पैरामीटर के माध्यम से इंजेक्शन दिया जाता है, तो आपके द्वारा लिखे गए सब कुछ एक टेम्पलेट है, आपकी लाइब्रेरी केवल हेडर है, और यह संकलन या वितरण के मामले में काफी बोझिल हो सकती है। हालांकि, मुझे लगता है कि देखभाल के साथ आप इकाई केवल हेडर-लाइब्रेरी का परीक्षण कर सकते हैं, फिर इसे एक टीयू से बना सकते हैं जिसमें केवल तत्काल आवश्यकताएं होती हैं जिन्हें एप्लिकेशन की आवश्यकता होती है। –
आरएआईआई और डीआई एक साथ काम करते हैं, इसलिए शीर्षक भ्रामक है, आपकी समस्या स्टैक आवंटन बनाम डी है। –