मैं बिना राज्य के इतने तात्कालिक कक्षाएं क्यों देख रहा हूं?


18

मुझे C ++ और Java दुनिया में बहुत सी तात्कालिक कक्षाएं दिखाई दे रही हैं जिनके पास कोई राज्य नहीं है।

मैं वास्तव में यह पता नहीं लगा सकता कि लोग ऐसा क्यों करते हैं, वे सिर्फ C ++ में मुफ्त फ़ंक्शंस के साथ या निजी कंस्ट्रक्टर वाले एक वर्ग और जावा में केवल स्थिर विधियों के साथ एक नाम स्थान का उपयोग कर सकते हैं।

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

क्या मुझे यह गलत लग रहा है? क्या यह ओओपी नहीं है अगर मैं सब कुछ वस्तुओं (यानी तात्कालिक वर्ग) में नहीं डालूं? फिर C ++ और जावा के मानक पुस्तकालयों में इतने सारे उपयोगिता नाम स्थान और कक्षाएं क्यों हैं?

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


2
"इतनी आम" मात्रा के बिना जवाब देना मुश्किल है। मैं यह नहीं कह सकता कि मैं इसे बहुत बार देखता हूं। क्यू को कुछ इस तरह से बदलने पर विचार करें "बिना हाथी के कक्षाएं कैसे उपयोगी हैं?"
कालेब

@ कालेब मैं ओपन सोर्स प्रोजेक्ट्स में उदाहरणों की तलाश करूँगा। मैंने निश्चित रूप से इसे उन जावा दुकानों पर बहुत देखा है जिनके लिए मैंने काम किया है।
फ्यूटलिब

@futlib: हाँ, यह आम है। stackoverflow.com/questions/4692845/…
लॉन्ग

क्या आप वर्ग को केवल उदाहरण के लिए मानते हैं। EntityManager राज्य युक्त नहीं है?
user470365

जवाबों:


22

मुझे C ++ और Java दुनिया में बहुत सी तात्कालिक कक्षाएं दिखाई दे रही हैं जिनके पास कोई राज्य नहीं है।

अपने स्वयं के ivars के बिना कक्षाएं बनाने के लिए कुछ कमजोर कारण:

  • राज्य सुपरक्लास में सम्‍मिलित है या हो सकता है।

  • क्लास कुछ इंटरफ़ेस को लागू करता है और उसे तुरंत लागू करने की आवश्यकता होती है ताकि अन्य वस्तुओं के लिए उदाहरणों को पारित किया जा सके।

  • कक्षा को उपवर्गित करने का इरादा है।

  • समूह से संबंधित कार्यों के लिए आसान तरीका। (हां, ऐसा करने के लिए बेहतर या अलग तरीके हो सकते हैं।)

क्या मुझे यह गलत लग रहा है? क्या यह ओओपी नहीं है अगर मैं सब कुछ वस्तुओं (यानी तात्कालिक वर्ग) में नहीं डालूं?

OOP एक प्रतिमान है, प्रकृति का नियम नहीं है। कुछ भाषाएं हैं जहां सब कुछ एक वस्तु है, इसलिए आपके पास वास्तव में कोई विकल्प नहीं है। अन्य भाषाएँ (जैसे C) OOP के लिए बिल्कुल भी कोई सहायता प्रदान नहीं करती हैं, लेकिन आप अभी भी ऑब्जेक्ट ओरिएंटेड स्टाइल में प्रोग्राम कर सकते हैं। यदि आप कक्षाओं में सब कुछ नहीं करते हैं , तो आप कह सकते हैं कि आपके पास ओओपी हो सकता है ... आप कह सकते हैं कि आपके पास उस मामले में कम ओओपी है।


4

कालेब और रॉबर्ट हार्वे पहले ही बता चुके हैं कि उपयोगिता वर्ग क्या हैं, और "डेटा-कम" वर्ग के लिए कुछ वैध कारण हैं। वे विवरण स्पॉट-ऑन हैं, लेकिन सकारात्मक पहलुओं से निपटते हैं।

मैं सिर्फ यह उल्लेख करना चाहूंगा कि उपयोगिता वर्गों का दुरुपयोग निश्चित रूप से एक ओओ विरोधी पैटर्न हो सकता है (देखें c2wiki का विवरण )। यह उद्धरण इसे अच्छी तरह से प्रस्तुत करता है:

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

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


2

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

किसी भी मामले में, ये कक्षाएं केवल एकल कंटेनर में संबंधित तरीकों के साथ समूह में काम करती हैं, ऐसे तरीके जिन्हें ठीक से काम करने के लिए किसी वस्तु की तत्काल आवश्यकता नहीं होती है। ऐसी कक्षा का एक उदाहरण एक गणित वर्ग है जिसमें SINE और COSINE (और अन्य गणित) फ़ंक्शन होते हैं।


2

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


0

ऑब्जेक्ट ओरिएंटेड भाषाओं में जहां कक्षाएं ऑब्जेक्ट नहीं हैं, आप क्लास की तुलना में ऑब्जेक्ट के साथ बहुत कुछ कर सकते हैं।

आप एक पैरामीटर के रूप में एक ऑब्जेक्ट पास कर सकते हैं, आप एक प्रकार की संगत ऑब्जेक्ट को स्थानापन्न कर सकते हैं, आप एक इंटरफ़ेस लागू कर सकते हैं (मुझे लगता है कि ऐसी भाषाएं हैं जिनमें कक्षाएं ऑब्जेक्ट हैं लेकिन आप इनमें से कुछ चीजें कर सकते हैं, लेकिन किसी भी मामले में ...) । ये सभी चीजें बहुत महत्वपूर्ण हैं इसलिए डिफ़ॉल्ट निर्णय आमतौर पर एक वर्ग को तत्काल बनाने के लिए होता है।

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.