2009-05-27 10 views
5

मान लीजिए ऑब्जेक्ट 1 को ऑब्जेक्ट 2 से जानकारी चाहिए। मैं कहूंगा कि यह ऑब्जेक्ट 2 प्रॉपर्टी में है, लेकिन जानकारी ऑब्जेक्ट 2 फ़ंक्शन से आसानी से वापसी मान हो सकती है। जब मैं दूसरों के कोड को देखता हूं तो मुझे लगता है कि कभी-कभी वे ऑब्जेक्ट 1 में सीधे संपत्ति तक पहुंचने का एक तरीका रखेंगे। अन्य बार मैं लोगों को ऑब्जेक्ट 2 को विधि में पैरामीटर के रूप में पास करता हूं, और फिर पास ऑब्जेक्ट 2 से संपत्ति तक पहुंचता हूं।ओओपी न्यूबी: सीधे फ़ील्ड एक्सेस करना पैरामीटर के रूप में ऑब्जेक्ट्स पास करना

ये परिदृश्य मेरे जैसा ही प्रतीत होते हैं। सीधे संपत्ति का उपयोग करना आसान लगता है। एक नौसिखिया के रूप में, आपको क्या लगता है कि ऑब्जेक्ट 1 को ऑब्जेक्ट 2 से जानकारी प्राप्त करने का निर्णय लेने के बारे में सोचना चाहिए?

धन्यवाद (जब मैं एक वस्तु पैरामीटर के बजाय सीधे प्रॉपर्टी एक्सेस चाहेगा?) - Object1 को Object2 गुजर साथ अल सी

+0

एक वास्तविक उदाहरण उपयोगी होगा। –

उत्तर

9

एक समस्या यह है कि आप Object2 और Object1 के बीच एक निर्भरता पैदा करते हैं। ऑब्जेक्ट 1 जिस डेटा को आवश्यक है उसे प्राप्त करने का एकमात्र तरीका ऑब्जेक्ट 2 का संदर्भ होना है।

अब, कभी-कभी आप इसे चाहते हैं, लेकिन अधिकांश समय आप नहीं करते हैं। इसलिए ऑब्जेक्ट 2 के उदाहरण को पारित करने के बजाए, विधि के पैरामीटर के रूप में आपको जिस मूल्य की आवश्यकता है, उसे पार करने की संभावना सबसे अधिक संभावना है।

1

ऑब्जेक्ट 1 ऑब्जेक्ट 2 के बारे में जानता है या नहीं। ओओपी में, अच्छे डिजाइन का हिस्सा ऑब्जेक्ट्स को जितना संभव हो उतना कम से कम जानकारी के रूप में स्टोर करना है जो अभी भी उन्हें सही तरीके से व्यवहार करने की अनुमति देता है। तो समस्या मूल रूप से नीचे आती है: क्या ऑब्जेक्ट 1 को ऑब्जेक्ट 2 के अस्तित्व के बारे में जानने की आवश्यकता है (यानी, क्या यह ऑब्जेक्ट 2 का एक उदाहरण मौजूद है) या ऑब्जेक्ट 2 इंस्टेंस के अस्तित्व के बारे में बताया जा सकता है? आम तौर पर, ओओपी में, आप पूर्व की तुलना में बाद की तरफ झुकना चाहते हैं।

हालांकि, ऐसी स्थिति में जहां ऑब्जेक्ट 1 ऑब्जेक्ट 2 से आने वाले डेटा पर काम कर सकता है, सबसे अच्छा तरीका शायद ऑब्जेक्ट 1 में एक विधि है जो डेटा पर पर ऑब्जेक्ट 2 पर संचालित होती है; इस तरह, आप ऑब्जेक्ट 1 और ऑब्जेक्ट 2 को डीक्यूपल करते हैं, उस ऑब्जेक्ट 1 में निर्भरता ऑब्जेक्ट 2 पर किसी दिए गए तरीके को प्रदान करने के लिए नहीं है; कॉलिंग कोड दो कनेक्ट कर सकते हैं।

+0

मैं ऑब्जेक्ट 2 के अस्तित्व के बारे में जानने के बिना ऑब्जेक्ट 2 के बारे में ऑब्जेक्ट 1 को कैसे बताया जा सकता है, इस बारे में थोड़ा उलझन में हूं। –

+0

@ एएलसी: निर्भरता इंजेक्शन सोचें। –

1

हां, रैंडोल्फ़ो क्या कहता है सच है।

याद रखें, ओओपी के साथ आप अलग-अलग पहचान बनाने का लक्ष्य रख रहे हैं जो पूरी तरह से सिस्टम में कार्य कर सकते हैं। जब आप ऑब्जेक्ट्स बनाना शुरू करते हैं जो एक दूसरे पर भारी निर्भर करते हैं, न केवल आप कीड़े की संभावनाओं को बढ़ाते हैं, बल्कि यह भी संभावना है कि आपका प्रोग्राम अब और काम नहीं करेगा।

अब आपका उदाहरण एक नाबालिग है, लेकिन 5, 10, 100 ऑब्जेक्ट्स को पैरामीटर के माध्यम से एक-दूसरे को कॉल करने की कल्पना करें, यह बुरा काम है।

3

यदि विधि केवल ऑब्जेक्ट 2 से एक संपत्ति मूल्य की आवश्यकता है, तो उस संपत्ति मूल्य को सीधे पास करना सबसे अच्छा होगा। यदि ऑब्जेक्ट 2 के संदर्भ को पास करने के लिए विधि को ऑब्जेक्ट 2 की कई गुणों या अन्य विशेषताओं तक पहुंच की आवश्यकता है, तो उचित होगा।

अपवाद हैं - यदि आपको विधि के हस्ताक्षर की रक्षा करने की आवश्यकता है (यानी यह सार्वजनिक है) और आप भविष्य में विधि के भीतर ऑब्जेक्ट 2 के अतिरिक्त उपयोग की अपेक्षा करते हैं, ऑब्जेक्ट संदर्भ पास करना उपयुक्त हो सकता है।

पिछले उत्तर भी वैध अंक बनाते हैं - आपको यह निर्णय लेने पर ऑब्जेक्ट 1 और ऑब्जेक्ट 2 के युग्मन पर विचार करना चाहिए।

1

विकिपीडिया पर Encapsulation पर एक नज़र डालें।

Encapsulation [..] घटक की अखंडता को अमान्य या असंगत स्थिति में स्थापित करने से उपयोगकर्ताओं को रोकने से घटक की अखंडता की रक्षा करता है।

2

आमतौर पर लक्ष्य वस्तुओं के बीच युग्मन को कम करना है।

चलिए एक साधारण उदाहरण का उपयोग करते हैं जहां मेरे पास तीन वस्तुएं हैं; एक ऐप कंट्रोलर, जिसमें डेटा कंट्रोलर और मेनविंडो कंट्रोलर का संदर्भ होता है। आपको DataController.Data को MainWindowController को पास करने की आवश्यकता है, ताकि आप मुख्य विंडो में किसी तालिका में मान प्रदर्शित कर सकें। आप डेटा कंट्रोलर को मेनविंडो कंट्रोलर को विधि पैरामीटर के रूप में पास कर सकते हैं, या DataController को मेनविंडो कंट्रोलर में एक इंस्टेंस वैरिएबल बना सकते हैं। युग्मन को कम करने के लिए, सबसे आसान तरीका ऐप कंट्रोलर के लिए सीधे मेनविंडो कंट्रोलर को डेटा पास करने के लिए है, इसलिए इसे डेटाकंट्रोलर के बारे में कुछ भी जानने की आवश्यकता नहीं है।

संबंधित मुद्दे