खेल के विकास में "दोस्त" कक्षाओं का उपयोग करना


9

आमतौर पर C ++ गेम में विकास की गति एनकैप्सुलेशन से अधिक होती है, इसलिए आप सार्वजनिक रूप से सुलभ क्लास सदस्यों का एक टन देखते हैं जो वास्तव में सार्वजनिक नहीं होना चाहिए।

मुझे ज्यादातर मामलों में यह प्रतीत होता है कि केवल कुछ चुनिंदा मामलों में ही कुछ अन्य वर्गों के आंतरिक कामकाज को उनके निजी डेटा को संशोधित करने या पढ़ने के बिंदु पर जाना जाता है।

इस निजी डेटा के लिए सार्वजनिक गेटर्स / सेटर बनाना उन चीजों को उजागर करता है जिन्हें वास्तव में विली-निली संशोधित नहीं किया जाना चाहिए।

क्या मित्र वर्गों का उपयोग करने के लिए यहां एक समझौता होगा? या मित्र वर्ग के लिए कुछ कमियां हैं जो मैं नहीं देख रहा हूं।

जवाबों:


8

मित्र वर्गों के लिए दो बड़ी कमियां हैं।

  1. आप चुन नहीं सकते और चुन सकते हैं कि आप अपने दोस्तों को क्या बताना चाहते हैं। यह सब या कुछ भी नहीं है। यदि आप किसी प्रकार के गैर-असंगत सेटर के अनिवार्य उपयोग को लागू करने की कोशिश कर रहे हैं तो यह समस्याग्रस्त साबित हो सकता है।
  2. आपकी दो कक्षाएं अब इस अर्थ में कुछ युग्मित हैं कि मित्र-एर मित्र के बारे में जानता है।

कहा जा रहा है कि, मित्र वर्गों का उपयोग निश्चित रूप से इनकैप्सुलेशन में सुधार कर सकता है, खासकर यदि विकल्प सार्वजनिक गेटर्स / सेटर है।

इसके अलावा, SO पर संबंधित प्रश्न: /programming/521754/when-to-use-friend-class-in-c


5

एनकैप्सुलेशन अच्छा है, लेकिन चिंताओं को अलग करना अच्छा है।

अन्य वर्ग के "कुछ निजी हिस्से" तक पहुंचने वाला एक वर्ग यह संकेत दे सकता है कि पहली जगह में कोड अच्छी तरह से डिज़ाइन नहीं किया गया है।

हर बार जब आप अपने आप को "गोश में पाते हैं, तो मुझे यहां एक मित्र वर्ग बनाने की आवश्यकता होती है" स्पॉट, सवाल आपको खुद से पूछना चाहिए "क्या मैं इसे सही तरीके से कर रहा हूं, या क्या कोई क्लीनर तरीका है?" (उर्फ "यह मुझे बाद में गधे पर काटने के लिए जा रहा है?")।

यदि आप "मित्रता" के बारे में सुनिश्चित हैं, तो इसे बिना किसी हिचकिचाहट के वहाँ रखें।


मैं समझता हूं कि मित्र वर्ग का उपयोग करने से एक वर्ग से दूसरे वर्ग को कैसे जोड़ा जाएगा। मैं सोच रहा था कि क्या विशेष रूप से एक डिज़ाइन पैटर्न था जो समस्या को कम करता है, क्योंकि बस एक गेटर / सेटर में कुछ लपेटना संभवतः एक बदतर समाधान है।
डेविड यंग

1
दिलचस्प उदाहरण है C ++ में फ़ैक्टरी पैटर्न को निजी कंस्ट्रक्टरों के उपयोग के कारण "मित्र" की आवश्यकता होती है।
डेविड यंग

2

एक अन्य विकल्प पीआईएमपीएल मुहावरे का उपयोग करना है , जहां संरचना के कार्यान्वयन का एक हिस्सा दूसरे प्रकार का सूचक है। कक्षा के अधिकांश उपयोगकर्ता केवल सामान्य हेडर फ़ाइल शामिल करेंगे, जहां कार्यान्वयन एक अपारदर्शी सूचक है। जिन कक्षाओं को निजी डेटा तक पहुंच की आवश्यकता होती है, उनमें अन्य प्रकार को परिभाषित करने वाले हेडर शामिल हो सकते हैं, और इसके द्वारा दिए गए इंटरफ़ेस का उपयोग कर सकते हैं।

यह सी-प्रोग्रामर के लिए एक सामान्य पैटर्न है जो मित्र जैसी कार्यक्षमता चाहता है। मेरी राय में यह चिंताओं को अलग करने के बारे में सोचने के लिए और अधिक निकटता से है (आमतौर पर अच्छा डिजाइन सिद्धांत जो पुन: प्रयोज्य, ऑर्थोगोनल कोड की ओर जाता है) एन्कैप्सुलेशन के बजाय (एक ओओ-विशिष्ट तकनीक है जो चिंताओं को अलग करने के लिए उपयोगी है, लेकिन अक्सर इसका दुरुपयोग होता है। चीजों को पूरा करने के लिए)।

यह दोस्त पर एक फायदा है कि यह दोस्त-दोस्त को दोस्त-ई को बिल्कुल नहीं देता है। कुछ लोग दावा कर सकते हैं कि यह नुकसान है, क्योंकि अब कोई भी आपकी कक्षा को "मित्र" कर सकता है। मुझे लगता है कि यह एक अनुचित डर है, क्योंकि आप अभी भी रिश्ते को स्पष्ट कर रहे हैं (हेडर सहित)। यदि आप उससे डरते हैं, तो आप स्मार्ट वास्तुशिल्प निर्णय लेने की आपकी (या आपके सहकर्मी की) क्षमता से डरते हैं। लेकिन अगर आप बाद में उन फैसलों को ठीक से नहीं कर पाते हैं, तो friendअब आप खुद पर भरोसा क्यों कर रहे हैं?

इससे रनटाइम कॉस्ट का नुकसान होता है। एक सूचक में डेटा संग्रहीत करके आपके पास बदतर कैश सुसंगतता और अधिक आवंटन मायने रखता है, और आपको इसे साफ करने के लिए एक विध्वंसक की भी आवश्यकता है।


+1 दिलचस्प, इस अवधारणा को जावा पृष्ठभूमि से नहीं सुना गया है।
डेविड यंग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.