2013-08-19 11 views
5

मैं थोड़ी देर के लिए एक्सेल में वीबीए कक्षा मॉड्यूल का उपयोग कर रहा हूं, लेकिन मुझे यकीन नहीं है कि मैं उन्हें सही तरीके से बना रहा हूं। मैं आमतौर पर कक्षा के लिए मॉड्यूल स्तर चर बना देता हूं और फिर संपत्ति को चलो और कार्य प्राप्त करता हूं। उदाहरण के लिए:क्या मुझे वीबीए कक्षा वस्तुओं में डुप्लिकेट मान रखना चाहिए?

Private msRegion As String 

Property Get Region() As String 
    Region = msRegion 'Return the Region 
End Property 

Property Let Region(ByVal sRegionName As String) 
    msRegion = sRegionName 'Set the Region 
End Property 

जब मैं स्थानीय विंडो में वस्तुओं को देखने मैं उस प्रत्येक प्रॉपर्टी के लिए मैं मॉड्यूल scoped चर और चर Let समारोह के लिए आवश्यक के साथ अंत पर ध्यान दें। यह मेरे लिए एक चर के डुप्लिकेशंस की तरह लगता है। मुझे चिंतित है कि यदि मैंने प्रत्येक में कई गुणों के साथ वस्तुओं का एक बड़ा संग्रह स्थापित किया है तो यह संसाधनों के मामले में महंगा हो सकता है।

मैंने कोड को संशोधित करने का प्रयास किया है ताकि ऑब्जेक्ट क्लास में केवल एक चर हो, लेकिन अब तक मुझे केवल मेरे दर्द के लिए त्रुटि संदेश मिल गए हैं।

क्या किसी को कक्षा मॉड्यूल में गुण बनाने के तरीके के बारे में पता है जो डुप्लिकेट चर का कारण नहीं बनता है?

संपादित करें:

मैं बस अपना स्थानीय लोगों खिड़की पर फिर से विचार किया था और महसूस किया संपत्ति देना है कि तर्क वहाँ नहीं है है। 2 अभिव्यक्ति निजी रूप से संग्रहीत चर के रूप में दिखाई देती हैं और इस मामले में msRegion और क्षेत्र में प्रॉपर्टी मूल्य प्राप्त होता है। यह Cor_Blimey के जवाब के साथ फिट बैठता है।

+1

+1 अच्छा सवाल और कुछ मैं के बारे में उत्सुक है, भी किया गया है। मैंने पाया कि सभी उदाहरण (और मैंने जो कार्यान्वित किया है) आपके कोड को दर्पण करते हैं। मुझे संदेह है कि यह चीजों की प्रकृति है और सही है, लेकिन यह स्थानीय खिड़की में कुछ उलझन में है। –

उत्तर

5

क्या आपने कक्षा को कॉल करने वाले कोड में msRegion प्रॉपर्टी प्राप्त करने या सेट करने का प्रयास किया है? यदि आप करते हैं तो आप देखेंगे कि यह कॉल करने योग्य नहीं है।

आप कक्षा को सही तरीके से संरचित कर रहे हैं।

स्थानीय विंडो एक कक्षा के भीतर निजी varibale सहित सभी घोषित चर दिखाता है।

+0

जानकारी के लिए धन्यवाद, मुझे उम्मीद थी कि देना प्रक्रिया के लिए तर्क नष्ट किया जा सकता है जब प्रक्रिया समाप्त हो गया है, लेकिन मुझे लगता है कि इस तरह से यह काम करता है नहीं है। –

4

Declan_K यह कहने में सही है कि ए) आप सही कर रहे हैं, और बी) स्थानीय खिड़की गुंजाइश को अनदेखा करती है और उन्हें वैसे भी दिखाती है।

उन्हें बाहर अलग और एक सार्वजनिक संपत्ति और और एक निजी सदस्य क्षेत्र के लिए कारण है कि यह अच्छा है करने के लिए एक छोटे से जोड़ने के लिए:

1) आप उपयोगी सीमित 'तर्क' प्राप्त में हो सकता है/सेट/ दें। शायद आप मान को एक अलग प्रारूप में स्टोर करना चाहते हैं लेकिन हमेशा इसे दूसरे में प्रस्तुत करें (उदा। इसे लंबे समय तक मिलीसेकंड के रूप में स्टोर करें लेकिन हमेशा डबल सेकेंड में वापस आएं), या शायद आप इसे संग्रहीत करने से पहले डेटा को सत्यापित करना चाहते हैं।

2) आप एक सार्वजनिक 'इंटरफ़ेस' परिभाषित करते हैं जो आपके वर्ग और उपभोग कक्षाओं के बीच अनुबंध का प्रतिनिधित्व करता है। इसलिए आप अपनी कक्षा के आंतरिक लोगों के बीच स्पष्ट अंतर बनाते हैं, जो फिट बैठते हैं, और बाहरी इंटरफेस के रूप में बदलने के लिए स्वतंत्र होते हैं। यह वीबीए में अभ्यास में कोई मुद्दा नहीं हो सकता है, क्योंकि आप पूरी तरह से उपभोग करने वाले वर्गों के नियंत्रण में हैं, और वीबीए मांग पर संकलन कर रहे हैं, इसलिए यह गुणों के लिए फ़ील्ड बदलने में कोई समस्या नहीं है और इसके विपरीत, लेकिन यह अच्छी प्रथा है और बेहतर encapsulation लागू करने में मदद करें। यह आपको याद रखने में भी मदद करेगा जब आपको यह सुनिश्चित करने की ज़रूरत है कि आप अपने एडिन/प्रोग्राम में कहीं और ब्रेकिंग बदलाव नहीं कर रहे हैं!

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

4) आप वास्तव में कुछ मामलों में संसाधनों को बचा सकते हैं: ऐसी कक्षा पर विचार करें जिसमें ऑब्जेक्ट्स लौटाएं (जैसे "परिणाम" संग्रह या कुछ)। आप बैकिंग फ़ील्ड्स को तब तक कुछ भी नहीं रख सकते जब तक ऑब्जेक्ट की वास्तव में आवश्यकता न हो, या तो आपकी कक्षा में या किसी उपभोक्ता के माध्यम से किसी संपत्ति के माध्यम से अनुरोध करने के माध्यम से। जब अनुरोध किया जाता है, तो आप वस्तु को तत्काल आवश्यक कर सकते हैं।

5) सेटर और Accessor के लिए अलग गुंजाइश: फील्ड्स या तो निजी हैं या सार्वजनिक कर रहे हैं और यदि ऐसा है तो यह जनता के आप नहीं रोका जा सकता है, उदाहरण के लिए, एक क्षेत्र या एक नया उद्देश्य यह है कि हो सकता है संदर्भित करने के लिए किया जा रहा है नहीं हो सकता राज्य के साथ असंगत रहें जो आपकी कक्षा की अपेक्षा करता है। दूसरी ओर, आप सीमित कर सकते हैं एक संपत्ति केवल पढ़ने के लिए किया जाना है आदि (ध्यान दें कि यह यह गुण बदल गया है होने से केवल पढ़ने के लिए वस्तु बंद नहीं होगा - यह केवल परिवर्तित करने से संदर्भ रोकता है)। फिर, प्रति बिंदु 2 के रूप में, यह नहीं एक मुद्दा बिल्कुल आप के लिए के रूप में यह, सब के बाद अपनी परियोजना और केवल VBA के भीतर है हो सकता है, लेकिन यह है कि अपने वर्ग के गुण (हारने अर्थ में) कि अभिन्न अंग हैं सुनिश्चित करने के लिए मदद करनी चाहिए आपकी कक्षा की विशेषताएं आपकी कक्षा द्वारा नियंत्रित की जाती हैं।

6) अन्य भाषाओं में अन्य कारणों से बहुत सारे हैं, लेकिन VBA करता है, यह सच है, कम है।

दूसरी ओर, ऐसा कुछ दर्द है जो आपको उपयोगी हो सकता है या नहीं मिल सकता है!

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