2009-04-03 21 views
7

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

क्या यह सदस्य या गैर-सदस्य होना चाहिए? एक अच्छा नियम क्या है?

उत्तर

11

यह एक सदस्य समारोह बनाने के लिए जब:

  • जब समारोह तार्किक (अपने भूलभुलैया संयुक्तता उदाहरण की तरह) वर्ग के साथ युग्मित है
  • समारोह निजी या संरक्षित सदस्यों तक पहुंच की आवश्यकता है, यह बेहतर है इसे एक दोस्त से सदस्य बनाने के लिए।

जब यह एक स्टैंडअलोन समारोह

  • बनाने के लिए जब यह एक सामान्य समारोह है कि स्वाभाविक रूप से अन्य वर्गों पर काम करने (< एल्गोरिदम को देखो> अच्छा उदाहरण के लिए हेडर)
templatized किया जा सकता है
+4

क्यों? इन दिशानिर्देशों के पीछे तर्क क्या है? – jalf

+0

@jalf: आप गैर-सदस्य, गैर-मित्र कार्यों के लाभों के बारे में अपनी पोस्ट में एक अच्छा बिंदु बनाते हैं: कंपाइलर द्वारा केवल सार्वजनिक इंटरफ़ेस उपयोग को लागू करने के द्वारा encapsulation में सुधार किया गया है। गैर-सदस्य कार्यों का एक संभावित नकारात्मक हिस्सा नामस्थान प्रदूषण है, कम से कम उन लोगों के लिए जो समृद्ध नेमस्पेस पदानुक्रम बनाने की इच्छा नहीं रखते हैं। –

3

मैं हमेशा FAQ 13.9 पर वापस संदर्भित करता हूं। यह एक सटीक विज्ञान नहीं है बल्कि विवेकाधिकार पर आधारित है।

यह कहने के लिए एक अतिसंवेदनशीलता है कि जब भी आपको कक्षा के आंतरिक प्रवेश तक पहुंच की आवश्यकता होती है - आपको एक सदस्य का उपयोग करना चाहिए। उल्लेखनीय उदाहरण स्ट्रीम सम्मिलन/निष्कर्षण ऑपरेटर (>> और << क्रमशः) और बाइनरी + हैं।

आपके उदाहरण में, isConnected ऑब्जेक्ट के राज्य का परीक्षण करने का एक तरीका है यानी एक इंस्पेक्टर और सदस्य होने के लिए आदर्श उम्मीदवार।

4

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

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

0

गैर-सदस्य फ़ंक्शंस बनाने के लिए एकमात्र चीजें वे चीजें हैं जिन्हें केवल सदस्य कार्यों के भीतर से बुलाया जाता है (कक्षा के बाहर दिखाई देने की आवश्यकता नहीं है), और कक्षा के सार्वजनिक सदस्यों और/या बस ठीक काम कर सकते हैं पैरामीटर की एक छोटी संख्या।

13

हर्ब सटर कहते हैं, "यदि हम उचित रूप से संभव हो तो हम उन्हें गैर-सदस्य बनाना चाहते हैं", और वह मुझसे ज्यादा चालाक है।

http://www.gotw.ca/gotw/084.htm

+0

http: //www.ddj भी है। कॉम/सीपीपी/184401197 बहुत कुछ कह रहा है – jalf

+2

मैं पूरी तरह से सहमत हूं ... और मैंने नहीं किया ' यह भी पता नहीं है कि सटर ने इसकी सिफारिश की है। –

12

ठीक है, दोनों के लिए बहस कर रहे हैं।

nonmember कार्यों के पक्ष में: better encapsulation

    • यह प्रदान करता है यह बेहतर कोड पुन: उपयोग (अनुमति देता है std :: मिल जाए, किसी भी कंटेनर प्रकार के लिए पुन: उपयोग किया जा सकता क्योंकि यह एक नि: शुल्क सुविधा नहीं होती यदि यह। एक सदस्य रहा था, कभी कंटेनर को खुद को परिभाषित करना होगा)
    • यह बहुत सामान्य प्रोग्रामिंग चाल आसान बनाता है। (container.begin() मान्य नहीं है यदि container एक सरणी है। यह कंटेनरों पर काम कर रहे सामान्य कोड को लिखने के लिए थोड़ा और अजीब बनाता है। लेकिन begin(container) किसी भी प्रकार के लिए वैध बनाया जा सकता है, यहां तक ​​कि अंतर्निहित एरे जैसे)। यह मिश्रण को बहुत साफ करने के माध्यम से मिश्रित भी बना सकता है, क्योंकि उपयोगकर्ता को उस मिक्स्ड ऑब्जेक्ट पर जाने के लिए सदस्यों के माध्यम से स्वयं को "डॉट" करने की आवश्यकता नहीं होती है, जिसे आप संचालित करना चाहते हैं।

    बातें सदस्य कार्यों बनाने के पक्ष में है:

    • यह परिचित है। जावा और सी # को की आवश्यकता है, और बहुत से प्रोग्रामर की आंखों में, सदस्य फ़ंक्शंस ओओपी के समानार्थी हैं।

    और ... यही है। (लेकिन उस तर्क को कम करके आंका नहीं जाना चाहिए। कोड पठनीयता महत्वपूर्ण है, और यदि लोगों को सदस्य संस्करण को पढ़ने में आसान लगता है, तो यह इसके पक्ष में एक मजबूत तर्क है। यह बेहतर कोड नहीं बनाता है। एक सख्त "बेहतर कोड से "दृष्टिकोण, गैर-सदस्यों को जब संभव हो तो प्राथमिकता दी जानी चाहिए।

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