ए ईश्वर वस्तु एक ऐसी वस्तु है जिसमें संदर्भ, सीधे या अप्रत्यक्ष रूप से संदर्भ होते हैं, यदि किसी एप्लिकेशन के भीतर सभी ऑब्जेक्ट्स नहीं हैं। जैसा कि सवाल देखता है, एक आवेदन में भगवान वस्तु होने से बचना लगभग असंभव है। कुछ ऑब्जेक्ट को विभिन्न उपप्रणालीओं के संदर्भ रखना चाहिए: यूआई, डेटाबेस, संचार, व्यापार तर्क, आदि ध्यान दें कि भगवान वस्तु को एप्लिकेशन-परिभाषित नहीं होना चाहिए। कई ढांचे में "अनुप्रयोग संदर्भ", "एप्लिकेशन पर्यावरण", "सत्र", "सक्रियकर्ता", आदि जैसे नामों के साथ ईश्वरीय वस्तुओं का निर्माण किया गया है।
समस्या यह नहीं है कि कोई ईश्वर वस्तु मौजूद है, बल्कि यह कैसे है उपयोग किया गया। मैं एक चरम उदाहरण के साथ चित्रित करूंगा ...
मान लें कि मेरे आवेदन में मैं मानक प्रदर्शित करना चाहता हूं कि संख्याओं को प्रदर्शित करते समय सटीकता के कितने दशमलव स्थान दिखाना चाहते हैं। हालांकि, मैं परिशुद्धता विन्यास योग्य होना चाहता हूँ।
class NumberFormatter {
...
String format(double value) {
int decimalPlaces = getConfiguredPrecision();
return formatDouble(value, decimalPlaces);
}
int getConfiguredPrecision() {
return /* what ??? */;
}
}
सवाल, कैसे क्या लौटने के लिए getConfiguredPrecision
आंकड़ा बाहर करता है: मैं एक वर्ग जिसका जिम्मेदारी है कि तार करने के लिए संख्या परिवर्तित करने के लिए बनाने के?एक तरीका NumberFormatter
वैश्विक अनुप्रयोग संदर्भ का संदर्भ देना होगा जो इसे _appContext
नामक सदस्य क्षेत्र में संग्रहीत करता है। फिर हम लिख सकते हैं:
return _appContext.getPreferenceManager().getNumericPreferences().getDecimalPlaces();
ऐसा करने से, हम सिर्फ NumberFormatter
एक देवता वस्तु में रूप में अच्छी तरह बना दिया है! क्यूं कर? क्योंकि अब हम _appContext
फ़ील्ड के माध्यम से आवेदन में वर्चुअल रूप से किसी ऑब्जेक्ट को (अप्रत्यक्ष रूप से) संदर्भित कर सकते हैं। क्या यह बुरा है? हाँ यही है।
मैं NumberFormatter
के लिए एक यूनिट परीक्षण लिखने जा रहा हूं। चलिए पैरामीटर सेट अप करें ... इसे एप्लिकेशन संदर्भ की आवश्यकता है? डब्ल्यूटीएफ, जिसमें 57 विधियां हैं जिन्हें मुझे नकल करने की ज़रूरत है। ओह, इसे केवल प्रीफ मैनेजर की जरूरत है ... डब्ल्यूटीएफ, मुझे 14 तरीकों का मज़ाक उड़ाना है! संख्यात्मक prefs!? इसे पेंच करें, कक्षा काफी सरल है, मुझे इसकी जांच करने की आवश्यकता नहीं है ...
मान लें कि एप्लिकेशन संदर्भ में एक और तरीका था, getDatabaseManager()
। पिछले हफ्ते हम एसक्यूएल का उपयोग कर रहे थे, इसलिए विधि ने SQL डेटाबेस ऑब्जेक्ट वापस कर दिया। लेकिन इस हफ्ते, हमने एक नोएसक्यूएल डेटाबेस में बदलने का फैसला किया है और विधि अब एक नया प्रकार लौटाती है। NumberFormatter
परिवर्तन से प्रभावित है? हमम, मुझे याद नहीं है ... हाँ, यह हो सकता है, मुझे लगता है कि यह निर्माता में एक अनुप्रयोग संदर्भ लेता है ... मुझे स्रोत खोलने और एक नज़र डालने दो ... नहीं, हम भाग्य में हैं: यह केवल getPreferenceManager()
तक पहुंचता है ... अब चलिए अन्य 93 वर्गों को जांचें जो पैरामीटर के रूप में अनुप्रयोग संदर्भ लेते हैं ...
यह वही परिदृश्य तब होता है जब प्राथमिकता प्रबंधक या संख्यात्मक प्राथमिकता ऑब्जेक्ट में कोई परिवर्तन किया जाता है। कहानी का नैतिक यह है कि किसी ऑब्जेक्ट को केवल उन चीजों के संदर्भ रखना चाहिए जिन्हें इसे अपना काम करने की आवश्यकता होती है, और केवल उन्हीं चीजों को। NumberFormatter
के मामले में, इसे केवल एक पूर्णांक की आवश्यकता है - दशमलव स्थानों की संख्या। यह सीधे भगवान ईश्वर वस्तु द्वारा बनाया जा सकता है जो जादूगर संख्या (या pref प्रबंधक या बेहतर अभी भी, संख्यात्मक prefs) जानता है, बिना किसी ईश्वरीय वस्तु में फ़ॉर्मेटर को घुमाने के। इसके अलावा, संख्याओं को प्रारूपित करने के लिए आवश्यक किसी भी घटक को भगवान ऑब्जेक्ट के बजाय एक फॉर्मेटर दिया जा सकता है। चारों ओर जीतता है।
तो संक्षेप में, समस्या भगवान ईश्वर का अस्तित्व नहीं है बल्कि अन्य वस्तुओं को ईश्वर की तरह की स्थिति प्रदान करने का कार्य है।
संयोग से, इस समस्या को हल करने वाले डिजाइन सिद्धांत को Law of Demeter के रूप में जाना जाता है। या "एक रेस्तरां में भुगतान करते समय, सर्वर को अपना पैसा अपना वॉलेट नहीं दें।"
यह सही है। कभी-कभी (हमेशा नहीं) आपको एक मास्टर ऑब्जेक्ट की आवश्यकता होती है लेकिन उस ऑब्जेक्ट को केवल ज़िम्मेदार वर्गों को तुरंत चालू करना चाहिए और ज़िम्मेदारी का प्रतिनिधि होना चाहिए। यदि यह सब कुछ करने की कोशिश करता है तो यह भगवान-वस्तु बन जाता है। संरचना और प्रतिनिधिमंडल वह कुंजी है जो इसे एक बनने से रोक सकती है। –
इस उत्तर को सबसे ज्यादा पसंद किया। धन्यवाद! –