आइए इसे व्यावहारिक रूप से देखें
Obj 3
अब Obj 4
मौजूद है। तो क्या? हम क्यों परवाह करते हैं?
डीआईपी का कहना है
"उच्च-स्तरीय मॉड्यूल को निम्न-स्तर के मॉड्यूल पर निर्भर नहीं होना चाहिए। दोनों को अमूर्तता पर निर्भर होना चाहिए।"
ठीक है, लेकिन क्या सभी वस्तुएं अमूर्त नहीं हैं?
डीआईपी भी कहता है
"सार विवरण पर निर्भर नहीं होना चाहिए। विवरण सार पर निर्भर होना चाहिए।"
ठीक है, लेकिन, अगर मेरी वस्तु ठीक से एनकैप्सुलेटेड है, तो क्या यह कोई विवरण नहीं छिपाता है?
कुछ लोग आँख बंद करके इस बात पर जोर देना पसंद करते हैं कि हर वस्तु को एक कीवर्ड इंटरफ़ेस की आवश्यकता है। मैं उनमें से नहीं हूं। मैं आँख बंद करके यह कहना पसंद करता हूं कि यदि आप उनका उपयोग नहीं करने जा रहे हैं, तो आपको बाद में उनके जैसे कुछ की जरूरत से निपटने के लिए एक योजना की आवश्यकता होगी।
यदि आपका कोड हर रिलीज़ पर पूरी तरह से रिफलेक्टर-सक्षम है, तो आप ज़रूरत पड़ने पर बाद में इंटरफेस निकाल सकते हैं। यदि आपने ऐसा कोड प्रकाशित किया है जिसे आप फिर से इकट्ठा नहीं करना चाहते हैं और अपने आप को चाहते हैं कि आप एक इंटरफ़ेस के माध्यम से बात कर रहे हैं तो आपको एक योजना की आवश्यकता होगी।
Obj 3
जानता है Obj 4
मौजूद है। लेकिन क्या यह Obj 3
पता है कि क्या Obj 4
ठोस है?
यह यहीं है क्यों यह new
हर जगह फैल नहीं करने के लिए बहुत अच्छा है। अगर Obj 3
यह नहीं पता है कि Obj 4
क्या ठोस है, संभावना है क्योंकि यह इसे नहीं बनाया है, तो अगर आप बाद में झपकी लेते हैं और Obj 4
एक अमूर्त वर्ग में बदल जाते Obj 3
हैं तो परवाह नहीं करेंगे।
यदि आप ऐसा कर सकते हैं तो Obj 4
सभी के साथ पूरी तरह से अमूर्त है। शुरू से ही उनके बीच एक इंटरफेस बनाने वाली एकमात्र चीज आपको यह आश्वासन देती है कि कोई व्यक्ति गलती से कोड जोड़ता है जो Obj 4
अभी दूर ठोस है। संरक्षित निर्माणकर्ता उस जोखिम को कम कर सकते हैं लेकिन इससे एक और सवाल बनता है:
क्या Obj 3 और Obj 4 एक ही पैकेज में हैं?
वस्तुओं को अक्सर किसी तरह से समूहित किया जाता है (पैकेज, नाम स्थान आदि)। जब समूह बुद्धिमानी से समूह के बजाय समूह के भीतर अधिक संभावित प्रभावों को बदलते हैं।
मुझे फीचर के आधार पर ग्रुप बनाना पसंद है। तो Obj 3
और Obj 4
एक ही समूह और परत में हैं यह बहुत संभावना नहीं है कि आप एक प्रकाशित किया है और यह refactor करने के लिए, जबकि केवल एक दूसरे को बदलने की आवश्यकता के नहीं करना चाहता। इसका मतलब यह है कि इन वस्तुओं को एक स्पष्ट आवश्यकता होने से पहले उन दोनों के बीच एक अमूर्त डाल से लाभ होने की संभावना कम है।
यदि आप एक समूह सीमा पार कर रहे हैं, तो यह वास्तव में एक अच्छा विचार है कि दोनों तरफ की वस्तुओं को स्वतंत्र रूप से अलग-अलग किया जाए।
यह सरल होना चाहिए लेकिन दुर्भाग्य से जावा और सी # दोनों ने दुर्भाग्यपूर्ण विकल्प बनाए हैं जो इसे जटिल बनाते हैं।
C # में प्रत्येक कीवर्ड इंटरफ़ेस को एक I
उपसर्ग के साथ नाम देना परंपरा है । वह ग्राहकों को जानने के लिए मजबूर करता है कि वे एक कीवर्ड इंटरफ़ेस से बात कर रहे हैं। वह रिफ्लेक्टरिंग योजना के साथ खिलवाड़ करता है।
जावा में यह एक बेहतर नामकरण पैटर्न का उपयोग करने की परंपरा है: FooImple implements Foo
हालांकि, यह केवल स्रोत कोड स्तर पर मदद करता है क्योंकि जावा एक अलग बाइनरी में कीवर्ड इंटरफेस को संकलित करता है। इसका मतलब है कि जब आप Foo
कंक्रीट से अमूर्त ग्राहकों के लिए रिफ्लेक्टर करते हैं जिन्हें कोड के एक भी चरित्र की आवश्यकता नहीं होती है जिसे अभी भी बदला हुआ है।
यह इन विशेष भाषाओं में यह BUGS है जो लोगों को औपचारिक अमूर्तता से दूर रखने में सक्षम बनाता है जब तक कि उन्हें वास्तव में इसकी आवश्यकता न हो। आपने यह नहीं कहा कि आप किस भाषा का उपयोग कर रहे हैं, लेकिन समझते हैं कि कुछ ऐसी भाषाएं हैं, जिनमें बस ये समस्याएं नहीं हैं।
आपने यह नहीं कहा कि आप किस भाषा का उपयोग कर रहे हैं, इसलिए मैं आपसे आग्रह करूंगा कि आप अपनी भाषा और स्थिति का सावधानीपूर्वक विश्लेषण करें, इससे पहले कि आप यह तय करें कि यह हर जगह कीवर्ड इंटरफेस होने वाला है।
YAGNI सिद्धांत यहां एक महत्वपूर्ण भूमिका निभाता है। लेकिन ऐसा करता है "कृपया अपने आप को पैर में गोली मारना मुश्किल है"।