"जावा ओओपी" और "पायथोनिक ओओपी" के बीच अंतर? [बन्द है]


19

मैंने एक्शनस्क्रिप्ट 2.0 के साथ शुरुआत की और फिर जावा के साथ चला गया। मैंने सीखा है, या कम से कम इस्तेमाल किया, तब से भाषाओं का एक गुच्छा, जिसमें पायथन (शायद मेरा पसंदीदा) भी शामिल है।

मुझे डर है कि ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग की मेरी शैली हालांकि बहुत ही बेकार है, और पायथन सिंटैक्स के साथ जावा ओओपी की तरह। जावा जैसा और पाइथोनिक OOP एक दूसरे से अलग क्या है? पायथन में ऑब्जेक्ट ओरिएंटेड कोड लिखते समय जावा प्रोग्रामर क्या चीजें अक्सर "अनहोनी" करते हैं?

जवाबों:


54

एक जावा लड़के के लिए पायथन एक अराजकतापूर्ण प्लेगाउंड है, जहां कोई भी एक क्लब को पकड़ सकता है और अपने सिर पर राज करना शुरू कर सकता है।

पायथन लड़के के लिए जावा एक ऑरवेलियन ब्रह्माण्ड है जहाँ आप लगातार किसी और के चकमा दे रहे हैं कि ब्रह्मांड कैसे टिकता है।

सच्चाई कुछ भी है जो आप एक भाषा में कर सकते हैं जो आप दूसरे में भी साफ-सुथरे तरीके से कर सकते हैं। हालाँकि जैसा कि आपने उल्लेख किया है कि दोनों समुदायों में महत्वपूर्ण अंतर है कि स्वच्छ साधन क्या हैं ।

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

जावा बड़े सॉफ्टवेयर का उत्पादन करेगा जो बड़ी टीमों को फैला सकता है और झुंड को बनाए रखने के लिए उपकरण और साधन प्रदान करता है। यदि इसे अनियंत्रित रखा जाता है, तो यह बहुत अलग टीमों के लिए स्वतंत्र रूप से एक और अधिक अस्पष्ट लक्ष्य की ओर काम करेगा। आखिरकार प्रत्येक टीम यह स्वयं का "raison d'être" बन जाता है और एक पूरे के रूप में सिस्टम मुख्य परियोजना को भटकाने वाला पतला हो जाता है। ये अत्यधिक लागत से अधिक लागत और विशाल सॉफ्टवेयर सिस्टम को जन्म दे सकते हैं जो खराब प्रदर्शन करते हैं और बनाए रखते हैं।

जावा में चीजों को करने के लिए लगभग कभी भी एक छोटा त्वरित और आसान तरीका नहीं है, लेकिन आईडीई और टूलींग दर्दनाक कार्यों को केवल कुछ ही क्लिक दूर करने के लिए हैं।

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

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

पायथन के साथ चीजों को करने के लिए लगभग हमेशा एक त्वरित और आसान तरीका है लेकिन एक निश्चित सीमा तक पहुंचने के बाद जटिलता को ध्यान में रखना मुश्किल हो सकता है।

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

इसलिए गर्म बहस के रूप में जो सबसे अच्छा है।


14

तो आप जानते हैं कि तरीकों और चर की दृश्यता सेट करने के बारे में पूरी बात? हाँ, वे अब मौजूद नहीं हैं, सब कुछ सार्वजनिक है। वहाँ नामकरण परंपराओं और नाम प्रबंध हैं, लेकिन सब कुछ वास्तव में अभी भी उपलब्ध है।

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

विधि अधिभार के बजाय, आपके पास डिफ़ॉल्ट चर हैं। अपने डिफ़ॉल्ट मान के रूप में उत्परिवर्तित वस्तुओं का उपयोग न करें।

# bad
def fL(x=[])
  x.append(1)
  print x
# good
def fN(x=None)
  if (x is None):
    x = []
  x.append(1)
  print x

fL()
fL()
fN()
fN()

जब आप पहली बार शुरू करते हैं तो कक्षा और उदाहरण चर के बीच का अंतर बहुत सूक्ष्म होता है।

class Obj(object):
   thing = "class variable"
   def __init__(self):
      self.thing1 = "instance variable"
      print self.thing, self.thing1

उन चीजों में से कुछ हैं जो मुझे स्विच बनाने के लिए इस्तेमाल करने की आदत थी।


1
कुछ चीजों का +1 अच्छा सारांश, हालाँकि मुझे पहले से पता था
Anto

6

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

लेकिन जहाँ तक OO कोड जाता है, कुछ शैली के मूल सिद्धांत हैं जो भाषा से भाषा में नहीं बदलने चाहिए: आपको हमेशा कोड लिखने का प्रयास करना चाहिए जो कि शर्मीली और DRY है, चाहे आप Applescript, Python, Java, या ++ में लिख रहे हों।

---- संपादित ----

जैसा कि @delnan पेडेंटिक रूप से बताते हैं, वास्तव में FIVE कंपोजिट डेटा प्रकार हैं, जो कि कर्नेल स्तर पर सूची में सूचीबद्ध हैं (सूची, तानाशाह, टपल, सेट और फ्रोज़ेन्सेट, "पायथन ऑफ़ ए नटशेल") की मेरी प्रति के अनुसार। हालांकि यह सच है, यह वास्तव में उस बिंदु के लिए प्रासंगिक नहीं है जिसे मैं बनाने की कोशिश कर रहा हूं: पायथन आवश्यक डेटा संरचना के रूप में सूचियों पर बनाता है। हां, आप किसी सूची को स्टैक के रूप में उपयोग कर सकते हैं, लेकिन आप उसी सूची का उपयोग कतार के रूप में कर सकते हैं । और फिर एक ढेर।

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

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

एक अंतर यह है कि आप जावा क्यू से एक आइटम पॉप नहीं कर सकते हैं, और आप जावा लिंक सूची की अपेक्षा कर रहे हैं कि कहीं जावा क्यू ऑब्जेक्ट को पास नहीं कर सकते। तो शायद "अमीर" से मेरा वास्तव में मतलब है "कठोर"।

तो यह समझाने के लिए कि "पायथन सिर्फ लिस्ट्स" कहकर मेरा क्या मतलब है, इसका मतलब यह है कि आप पायथन में वह सब कुछ कर सकते हैं जो आपको करने की ज़रूरत है जो आप पायथन सूची प्रकार का उपयोग करके जावा कलेक्शंस के साथ करेंगे। यह एकल प्रकार जावा में एक महान कई प्रकार के काम करता है।

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


मैं सभी मगरमच्छों से परिचित हूं, उन्हें देखूंगा। धन्यवाद :)
Anto

7
-1 जब तक आप निम्नलिखित की व्याख्या नहीं कर सकते हैं: (1) "पायथन में सिर्फ सूचियाँ हैं" - पायथन में डेटा संरचनाओं का खजाना है। यह कभी भी कल्पना की गई हर एक डेटा संरचना के तीन कार्यान्वयन नहीं है, लेकिन अभी भी हर एक के बारे में सबसे अधिक लोगों को कभी भी आवश्यकता होगी। (२) जावा के टाइप सिस्टम को "रिच" कहना वास्तव में परिष्कृत प्रकार के सिस्टमों का उपहास है । शुरुआत के लिए , हास्केल (98 बिना किसी एक्सटेंशन के) देखें।

मुझे क्षमा करें, यह सच नहीं है। पायथन में दो डेटा संरचनाएं हैं: सूचियाँ और शब्दकोश। कुछ पाइथन लिब्ररीज़ इन मूल संरचनाओं का विस्तार कर सकते हैं, लेकिन यह कहने के लिए वैसा नहीं है कि भाषा उनके पास है।
फिलोसोडैड

5
यह पहले से ही उत्तर नामों से दोगुना है। स्टैक के रूप में सूची डबल्स। सेट और ट्यूपल्स भी अंतर्निहित हैं (कितनी डेटा संरचनाएं जावा में अंतर्निहित हैं?) मानक पुस्तकालय में (मिनट), ढेर, देवताओं, अपरिवर्तनीय रिकॉर्ड और कसकर भरे हुए समरूप सरणियों (सी तक सीमित) के लिए मॉड्यूल भी हैं प्रकार)। और वह सिर्फ मेरे सिर के ऊपर से है। हाँ, उन उपयोग सूचियों / dicts के अधिकांश आंतरिक (हालांकि, सेट अप्रयुक्त कुंजी के साथ dicts नहीं हैं)। लेकिन जावा में अधिकांश संग्रह हैं - वास्तव में, सभी भाषाओं में। यह वैसे काम करता है।

1
अब मुझे लगता है कि मैं उस बिंदु को समझता हूं जिसे आपने बनाने की कोशिश की (और मेरे पतन को हटा दिया - जो मैंने पहली जगह में जोड़ा क्योंकि वह हिस्सा सादा गलत था जिस तरह से मूल रूप से कहा गया था)। मुझे अभी भी लगता है कि आपको कम से कम दो डेटा संरचनाओं पर विचार करने की आवश्यकता है (लगभग-सार्वभौमिक अनुक्रमों के रूप में सूचियां और लगभग-सार्वभौमिक मैपिंग के रूप में dicts)। और यह विभिन्न पुनरावृत्तियों और जनरेटर का उल्लेख नहीं है, जिसका मैं कम से कम (और संभवतः अधिक) सूचियों के रूप में उपयोग करता हूं।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.