vba

2010-08-31 19 views
5

में मॉड्यूल बनाम ऑब्जेक्ट उन्मुख प्रोग्रामिंग मेरी पहली "गंभीर" भाषा जावा थी, इसलिए मैंने ऑब्जेक्ट उन्मुख प्रोग्रामिंग को समझ लिया है कि कार्यक्रम का मौलिक ईंट एक वर्ग है। अब मैं वीबीए और पायथन पर लिखता हूं। मॉड्यूल भाषाएं हैं और मुझे लगातार असुविधा महसूस हो रही है: मुझे नहीं पता कि मैं मॉड्यूल/कक्षाओं में प्रोग्राम को कैसे विघटित कर सकता हूं।vba

मैं समझता हूँ कि एक मॉड्यूल एक ज्ञान डोमेन के अनुरूप है, एक मॉड्यूल बा अलग से परीक्षण करने के लिए सक्षम ... मैं के रूप में नामस्थान मॉड्यूल गिरफ्तार करना चाहिए करना चाहिए (C++) केवल?

उत्तर

3

मैं वीबीए नहीं करता लेकिन पाइथन में, मॉड्यूल मौलिक हैं। जैसा कि आप कहते हैं, नामस्थान के रूप में देखा जा सकता है लेकिन वे भी अपने अधिकार में वस्तुएं हैं। हालांकि वे कक्षाएं नहीं हैं, इसलिए आप उनसे उत्तराधिकारी नहीं हो सकते हैं (कम से कम सीधे नहीं)।

मुझे लगता है कि एक डोमेन क्षेत्र से संबंधित मॉड्यूल रखने के लिए यह एक अच्छा नियम है। नियम जो मैं यह तय करने के लिए करता हूं कि कोई मॉड्यूल स्तर फ़ंक्शन या क्लास विधि है या नहीं, यह पूछना है कि क्या इसका अर्थ किसी भी ऑब्जेक्ट पर अर्थपूर्ण रूप से किया जा सकता है जो 'इंटरफ़ेस' को संतुष्ट करता है जो तर्क है। यदि ऐसा है, तो मैं इसे कक्षा पदानुक्रम से मुक्त करता हूं और इसे मॉड्यूल स्तर का कार्य करता हूं। यदि इसकी उपयोगिता सचमुच किसी विशेष श्रेणी पदानुक्रम तक ही सीमित है, तो मैं इसे एक विधि बना देता हूं।

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

+0

हाँ यह बहुत शांत है कि अजगर में मैं सफेद अगर एक कर सकते हैं b_handler आयात लेकिन VB में मैं नहीं कर सकता यह आप मॉड्यूल स्तर समारोह के उदाहरण पता है जो नहीं है :(करें एक सिंगलटन फ़ंक्शन (अन्य उत्तरों देखें)? – nikaan

+0

@ निकिता मुझे नहीं पता कि सिंगलटन फ़ंक्शन द्वारा आपका क्या मतलब है। एक सिंगलटन एक मॉड्यूल के बारे में सोचने का एक (शायद ही कभी अच्छा तरीका है) लेकिन मुझे लगता है कि आप ओओ अवधारणाओं को मजबूर करने की कोशिश कर रहे हैं एक गैर ओओ मुहावरे पर। – aaronasterling

1

भाषाओं के मुहावरे अलग-अलग हैं और यही वजह है कि अलग-अलग भाषाओं में हल की गई समस्या अलग-अलग दृष्टिकोण लेती है।

  1. "सी" प्रक्रियात्मक अपघटन के बारे में है।
  2. जावा में मुख्य मुहावरे "कक्षा या वस्तु" अपघटन के बारे में है। कार्य अनुपस्थित नहीं हैं, लेकिन वे इन वर्गों के प्रदर्शन व्यवहार का हिस्सा बन जाते हैं।
  3. "पायथन" क्लास आधारित समस्या अपघटन के साथ-साथ प्रक्रियात्मक आधारित दोनों के लिए समर्थन प्रदान करता है।

इनमें से सभी बड़े कोड टुकड़ों को व्यवस्थित करने के लिए अवधारणा के रूप में फ़ाइलों, संकुल या मॉड्यूल का उपयोग करते हैं। ऐसा कुछ भी नहीं है जो आपको एक ज्ञान डोमेन के लिए एक मॉड्यूल रखने के लिए प्रतिबंधित करता है। ये अपघटन और आयोजन तकनीकों हैं और हाथ पर समस्या के आधार पर लागू किया जा सकता है।

यदि आप ओओ के साथ सहज हैं, तो आप इसे पायथन में बहुत अच्छी तरह से उपयोग करने में सक्षम होना चाहिए।

+0

> यदि आप ओओ के साथ सहज हैं, तो आप इसे पायथन में बहुत अच्छी तरह से उपयोग करने में सक्षम होना चाहिए। जावा में, एक फ़ाइल <-> एक सार्वजनिक कक्षा। ऐसा लगता है कि इस नियम का आवेदन पायथन में बहुत बदसूरत है। पायथन में एक फ़ाइल <-> एक छोटा सा कार्य, मुझे लगता है। – nikaan

+0

@ निकिता ऐसा नहीं है। पाइथन (अक्सर) में एक फ़ाइल <-> कई संबंधित छोटे कार्यों और शायद कुछ बड़े संग्रहों का संग्रह। – aaronasterling

+2

कोड का संगठन पूरी तरह से कोडर पर निर्भर है। नियम पत्थर में सेट नहीं हैं। आमतौर पर, यदि छोटे से अधिक वर्ग होते हैं, तो वे सामान्य आदत उन्हें एक फ़ाइल में क्लब करना चाहते हैं, क्या मैं मॉड्यूल कहूंगा। यदि कक्षाएं बड़ी हैं, तो वे आमतौर पर कई फाइलों में विभाजित होती हैं। पाइथन में इन फ़ाइलों को समूहबद्ध करने के तरीके के रूप में पैकेज है। मुझे लगता है कि लचीलापन कोडर को उनके लिए उपयुक्त पहचानने की अनुमति देता है। – pyfunc

1

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

लेकिन आप इंटरफेस के साथ कम से कम एक निश्चित डिग्री तक काम कर सकते हैं।

मैंने केवल "एक मॉड्यूल = एक सिंगलटन" जैसे मॉड्यूल का उपयोग किया। मेरे मॉड्यूल में "स्थिर" या यहां तक ​​कि स्टेटलेस विधियां भी हैं। तो मेरी राय में एक वीबीए मॉड्यूल नामस्थान नहीं है। अक्सर कक्षाओं और मॉड्यूल का एक गुच्छा "नेमस्पेस" बन जाएगा। मैं अक्सर इस तरह के "नामस्थान" के लिए एक नई परियोजना (डीएलएल, डीवीबी या कुछ समान) बनाते हैं।

+0

हां, इस संदर्भ में सिंगलटन सही अवधारणा है! इसलिए, मॉड्यूल स्तर फ़ंक्शन कुछ है यदि यह सिंगलटन फ़ंक्शन है। आयात a_handler बाकी: – nikaan

3

यह स्वाद का विषय है। यदि आप मॉड्यूल का उपयोग करते हैं तो आपका 'प्रोग्राम' अधिक प्रक्रियात्मक उन्मुख होगा। यदि आप कक्षाएं चुनते हैं तो यह अधिक या कम ऑब्जेक्ट उन्मुख होगा। मैं कुछ महीनों के लिए एक्सेल के साथ काम कर रहा हूं और व्यक्तिगत रूप से कक्षाएं चुनता हूं जब भी मैं कर सकता हूं क्योंकि यह मेरे लिए अधिक आरामदायक है। यदि आप objects के बारे में सोचना बंद कर देते हैं और उन्हें Components के रूप में सोचते हैं तो आप उन्हें लालित्य के साथ उपयोग कर सकते हैं। कक्षाओं को प्राथमिकता देने का मुख्य कारण यह है कि आप इसे और अधिक प्राप्त कर सकते हैं। आपके पास मॉड्यूल के दो उदाहरण नहीं हो सकते हैं। यह मुझे encapsulation और बेहतर कोड पुन: उपयोग का उपयोग करने की अनुमति देता है।

उदाहरण के लिए मान लें कि आप कार्रवाई है कि निष्पादन के दौरान अपने कार्यक्रम द्वारा किया गया लॉग इन करने, लकड़हारा किसी तरह का लेना पसंद करते हैं। आप इसके लिए एक मॉड्यूल लिख सकते हैं। उदाहरण के लिए यह एक वैश्विक चर हो सकता है जो दर्शाता है कि किस विशेष शीट लॉगिंग की जाएगी। लेकिन निम्नलिखित काल्पनिक स्थिति पर विचार करें: आपका ग्राहक चाहता है कि आप अपने कार्यक्रम में कुछ फैंसी रिपोर्ट पीढ़ी की कार्यक्षमता शामिल करें। आप स्मार्ट हैं इसलिए आप समझते हैं कि आप उन्हें तैयार करने के लिए अपने लॉगिंग कोड का उपयोग कर सकते हैं। लेकिन आप एक मॉड्यूल द्वारा एक साथ लॉग और रिपोर्ट नहीं कर सकते हैं। और आप अपने कोड में किसी भी बदलाव के बिना Component लॉगिंग के दो उदाहरणों के साथ कर सकते हैं।

+0

हां, मुझे समझ में आया। मेरे पास विपरीत स्थिति है - वीबीए, एक्सेल, लगभग 10 मॉड्यूल में से लगभग 1000 लाइन पर बड़ा ऐड-इन है और इसमें कोई कक्षा नहीं है :) लेकिन अगला सुधार बहुत समान व्यवहार के 5 मामले की मांग करता है और मैं कक्षाएं पेश करना चाहता हूं। जावा में यह अधिक कठिन है :) वीबीए कई चीजों को प्रतिबंधित करता है। ओह! क्या आप वीबीए के लिए कुछ आईडीई जानते हैं? या वाक्यविन्यास हाइलाइटिंग के साथ ऐड-इन्स, उदाहरण के लिए? – nikaan

+1

ठीक है, एक्सेल में एम्बेडेड आईडीई उतनी खराब नहीं है जितनी पहली नजर में दिखाई देती है। मैं 2003 संस्करण में लिख रहा हूं और इसमें वाक्यविन्यास हाइलाइटिंग और कुछ प्राचीन पूर्व इंटेलि-सेंटी सिस्टम है ;-) डीबगर भी उचित है। अगर आप किसी चीज़ से फंस जाते हैं तो मैं मदद करने की कोशिश करूंगा। उस समय के दौरान मुझे कुछ विस्तार मिला है। – Bart

+0

धन्यवाद! मैं 2003 और 2007 का प्रयास करता था। मुझे ग्रहण आदि के लिए आदी हो गई है - समान नोटपैड ++ को हाइलाइट करने के बारे में क्या? (जब मैं एक शब्द चुनता हूं, तो वही शब्द हाइटलाइट किया जाता है ..) या पदानुक्रम को कॉल करें? क्योंकि, उदाहरण के लिए, 'कुछ' की खोज न केवल 'कुछ' संस्थाओं को पाती है बल्कि 'कुछ', 'सुन्दर' और इसी तरह से मिलती है। यदि आप वैश्विक चर का उपयोग कर रहे हैं तो कॉल पदानुक्रम बहुत मददगार है :) मिमीएम। इसके अलावा मुझे स्वरूपण कोड के साथ समस्या है - क्या मैं टैब का कोड या इंडेंट का बड़ा टुकड़ा कर सकता हूं? हो सकता है, मैं आपकी मदद कर सकता हूं - वीबीए के लिए एसवीएन उपकरण (http://www.codeproject.com/KB/office/SourceTools.aspx) – nikaan