अपने कोड को शिथिल बनाने के लिए यहां कुछ सरल बातें याद रखने योग्य हैं:
भाग 1:
तकनीकी रूप से "पृथक्करण की चिंता" के रूप में जाना जाता है। प्रत्येक वर्ग की एक विशिष्ट भूमिका होती है, उसे व्यावसायिक तर्क या अनुप्रयोग तर्क को संभालना चाहिए। कोशिश करें और कक्षा को साफ करें जो दोनों जिम्मेदारियों को जोड़ती है। यानी एक वर्ग जो डेटा (व्यापक अवधि) का डेटा अनुप्रयोग तर्क है, जबकि एक वर्ग जो डेटा का उपयोग करता है वह व्यावसायिक तर्क है।
व्यक्तिगत रूप से मैं इसे (अपनी छोटी दुनिया में) के रूप में संदर्भित करता हूं create it or use it
। एक वर्ग को एक वस्तु का निर्माण करना चाहिए या एक ऐसी वस्तु का उपयोग करना चाहिए जो इसे दोनों को कभी नहीं करना चाहिए।
भाग 2:
चिंता के अलगाव को कैसे लागू किया जाए।
शुरुआती बिंदु के रूप में दो सरल तकनीकें हैं:
नोट: डिजाइन पैटर्न निरपेक्ष नहीं हैं।
उन्हें स्थिति के अनुसार अनुकूलित किया जाना चाहिए लेकिन एक अंतर्निहित विषय है जो सभी अनुप्रयोगों के समान है। इसलिए नीचे दिए गए उदाहरणों को न देखें और कहें कि मुझे इस पर सख्ती से अमल करना चाहिए; ये सिर्फ उदाहरण हैं (और उस पर थोड़े विपरीत हैं)।
निर्भरता इंजेक्शन :
यह वह जगह है जहां आप एक ऑब्जेक्ट में गुजरते हैं जो एक वर्ग का उपयोग करता है। वह वस्तु जो आप एक इंटरफ़ेस के आधार पर पास करते हैं, इसलिए आपकी कक्षा को पता है कि उसके साथ क्या करना है, लेकिन वास्तविक कार्यान्वयन को जानने की आवश्यकता नहीं है।
class Tokenizer
{
public:
Tokenizer(std::istream& s)
: stream(s)
{}
std::string nextToken() { std::string token; stream >> token;return token;}
private:
std::istream& stream;
};
यहाँ हम एक टोकनर में स्ट्रीम इंजेक्ट करते हैं। टोकेनाइज़र को यह पता नहीं होता है कि यह स्ट्रीम किस प्रकार की है जब तक यह std :: istream के इंटरफ़ेस को लागू करता है।
सेवा लोकेटर पैटर्न :
सेवा लोकेटर पैटर्न निर्भरता इंजेक्शन पर थोड़ा बदलाव है। एक ऐसी वस्तु देने के बजाय जिसका वह उपयोग कर सकता है, आप उसे एक ऐसी वस्तु देते हैं, जिसे आप जिस वस्तु का उपयोग करना चाहते हैं, उसका पता लगाना (बनाना) जानते हैं।
class Application
{
public:
Application(Persister& p)
: persistor(p)
{}
void save()
{
std::auto_ptr<SaveDialog> saveDialog = persistor.getSaveDialog();
saveDialog.DoSaveAction();
}
void load()
{
std::auto_ptr<LoadDialog> loadDialog = persistor.getLoadDialog();
loadDialog.DoLoadAction();
}
private:
Persister& persistor;
};
यहां हम एप्लिकेशन ऑब्जेक्ट को एक पर्सिस्टर ऑब्जेक्ट पास करते हैं। जब आप एक सेव / लोड एक्शन करते हैं तो यह एक ऑब्जेक्ट बनाने के लिए पर्सिस्टर का उपयोग करता है जो वास्तव में जानता है कि एक्शन कैसे करना है। नोट: फिर से फ़िसिस्टर एक इंटरफ़ेस है और आप स्थिति के आधार पर विभिन्न कार्यान्वयन प्रदान कर सकते हैं।
जब potentially
आप किसी क्रिया को तुरंत करते हैं तो हर बार एक अनोखी वस्तु की आवश्यकता होने पर यह उपयोगी होता है ।
व्यक्तिगत रूप से मुझे लगता है कि यह इकाई परीक्षण लिखने में विशेष रूप से उपयोगी है।
पैटर्न का नोट:
डिजाइन पैटर्न अपने आप में एक बहुत बड़ा विषय है। यह किसी भी तरह से पैटर्न की एक विशिष्ट सूची नहीं है जिसका उपयोग आप ढीली युग्मन के साथ मदद करने के लिए कर सकते हैं; यह सिर्फ एक सामान्य शुरुआती बिंदु है।
अनुभव के साथ आप महसूस करेंगे कि आप पहले से ही इन पैटर्नों का उपयोग कर रहे हैं कि आपने उनके औपचारिक नामों का उपयोग नहीं किया है। उनके नाम मानकीकृत करने से (और हर कोई उन्हें सीखने के लिए) हम पाते हैं कि यह विचारों को संप्रेषित करना आसान और तेज है।