रूबी: खराब पार्ट्स [बंद]


20

मैंने हाल ही में क्रॉकफोर्ड की पुस्तक "जावास्क्रिप्ट: द गुड पार्ट्स" और अंतर्निहित परिसर में से एक पढ़ा था कि प्रोग्रामिंग भाषाओं में सुविधाओं के खराब सेट हो सकते हैं जो प्रोग्रामर को बचना चाहिए।

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


1
मैं कभी भी "अंत" शब्द का उपयोग करने का प्रशंसक नहीं रहा, और फिर "{" और "}" के मिश्रण से और भी अधिक कष्टप्रद हो जाता है। यह मुझे या तो पायथन-शैली वाक्य रचना की सराहना करता है या सीधे {&} के ऊपर। यद्यपि कोई इस पर आगे और पीछे बहस कर सकता है, और अंततः इसे व्यक्तिगत वरीयता के साथ बहुत कुछ करना है। मैंने किसी को यह कहते सुना कि रूबी पायथन और पर्ल के बदसूरत हिस्सों को लेती है और उन्हें एक साथ रखती है। मैं रूबी सीखने का आनंद ले रहा हूं, हालांकि।

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

मुझे लगता है कि यह चर्चा के लायक है क्योंकि यह खतरनाक प्रथाओं से बचने के लिए रोशन कर सकता है। हालांकि मैं आपकी बात देखता हूं और प्रश्न को अधिक संकीर्ण होने के लिए संपादित किया है।

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

2
मुझे अपनी आंखों की जांच करवाने की जरूरत है - मुझे लगा कि इस सवाल का शीर्षक "रूबी: द ब्रैड पिट्स" था।
oosterwal

जवाबों:


8

आपको गैरी बर्नहार्ट द्वारा पाइथन बनाम रूबी: ए बैटल टू द डेथ देखना चाहिए । वह बोली:

रूबी में जो चीजें मुझे बदसूरत लगती हैं, वे हैं कि आरएसपीक जैसे अद्भुत रूबी सॉफ्टवेयर संभव बनाते हैं, और यह कि पायथन कभी भी (वर्तमान कार्यान्वयन को देखते हुए) नहीं हो सकता है।

जबकि वह विशेष रूप से अजगर के बारे में बहुत सारी बातें करता है, वह बहुत सारे सामान को छूता है जो रूबी में अजीब है। बड़े अतिव्यापी विषयों में से एक बंदर पैचिंग है

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

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


जावास्क्रिप्ट आपको वस्तुओं को उस तरह से व्यवहार करने की अनुमति देता है।
0112

8

कुछ लोग केवल रूबी पर रूबी के संदर्भ में रूबी के बारे में सोचते हैं और यह थोड़े परेशान करने वाला है क्योंकि भाषा अपने आप ही अच्छी तरह से खड़ी है।


7

मुझे लगता है कि सबसे खराब विशेषता यह है open classesकि आप विश्व स्तर पर परिवर्तित वर्ग के सभी वर्तमान और भविष्य के उदाहरणों के व्यवहार को बदलने की अनुमति देते हैं।

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

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

तो सबसे अच्छी बात यह होगी कि या तो खुली कक्षाओं का उपयोग करना बंद कर दें ( #extendऔर ModuleIMHO में बदलाव करना ज्यादा सुरक्षित है, समझने में आसान और बेहतर परीक्षण करने के लिए) या यदि इससे बचा नहीं जा सकता है:

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

5

सबसे बड़ा कारण मैं रूबी का उपयोग नहीं करता हूं: यह बर्फ की उम्र के दौरान उत्तरी ध्रुव पर जनवरी में गुड़ की तुलना में धीमी है। बेंचमार्किंग लैंग्वेज एक अनुभवहीन विज्ञान है, लेकिन रूबी यहां तक ​​कि जावास्क्रिप्ट और पायथन की तुलना में काफी धीमी दिखाई देती है।


वह मेरा अनुभव भी था।
चक स्टीफंस्की

2
वह कौन सा अनुप्रयोग था जो आपके लिए विकसित किया गया था जो बहुत ही धीमा था? मेरा मतलब है, मेरा मानना ​​है कि जब आप कहते हैं कि यह धीमा है, लेकिन यह आपको अपने लक्ष्य तक पहुंचने से कैसे रोकता है?
डेविड

1
मुझे लगता है कि जब आप एक प्रोटोटाइप की तरह कुछ बनाना चाहते हैं और इसे जल्दी करना चाहते हैं, तो रूबी महान है, ऐसा कुछ जो बहुत बड़ा नहीं है और बड़े पैमाने पर क्रंच नहीं कर रहा है। यदि आप लगातार बहुत सारे CPU चक्रों को चबाने की अपेक्षा करते हैं, तो कोई भी अच्छा प्रोग्रामर C या C ++ जैसी किसी चीज़ का उपयोग करना जानता है।
जेफ वेलिंग

1
@ डेविड: मैं सरल डीएनए अनुक्रम प्रसंस्करण कोड के लिए रूबी का उपयोग करने पर विचार करूंगा, लेकिन मैं ऐसा नहीं करता क्योंकि पायथन एक समान जगह भरता है, इसमें समान विशेषताएं हैं और यह बहुत तेज है। अगर मैं निचले स्तर पर जाने को तैयार हूं, तो डी और भी तेज और सुविधाजनक है।
dsimcha

1
@ जेफ़: सहमत हैं, लेकिन सी और सी ++ में लिखने के लिए एक दर्द है। रूबी जैसी उच्च-स्तरीय भाषाओं का मुद्दा इस दर्द से जितना संभव हो उतना निपटने से बचना है। वे जितने धीमे होते हैं, उतना ही कम वे इस लक्ष्य को पूरा करते हैं। उच्च-स्तरीय गतिशील भाषा के लिए भी रूबी धीमी है। वह और NumPy / SciPy इसीलिए हैं जब मैं एक उच्च-स्तरीय गतिशील भाषा की आवश्यकता होने पर इसके बजाय पायथन का उपयोग करता हूं।
dsimcha

4

अगर इसे रूबी ऑन रेल्स तक बढ़ाया जा सकता है, तो:

  1. तथ्य यह है कि डेटाबेस लॉजिक हर एक तालिका को एक auto_incrementप्राथमिक कुंजी देता है, जिसमें उन तालिकाओं को शामिल किया जाता है जिनकी उन्हें आवश्यकता नहीं है और उन्हें नहीं होना चाहिए।

  2. तथ्य यह है कि यौगिक कुंजियाँ समर्थित नहीं हैं।

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


कृपया मेरे संपादन देखें क्योंकि मैंने प्रश्न का दायरा कम कर दिया है। यदि मैं इस प्रश्न को संपादन के साथ स्वीकृत करता हूं तो मैं रेल्स के लिए एक और समानांतर शुरू करूंगा।

1
क्षमा करें, लेकिन आप गलत हैं, रेल एप्लिकेशन में प्रत्येक तालिका में एक auto_incrementआईडी होना आवश्यक नहीं है , विशेष रूप से has_and_belongs_to_many के लिए तालिकाओं में शामिल होने का सुझाव दिया गया है जिसमें स्पष्ट रूप से एक आईडी कॉलम नहीं है।
ब्रेट बेंडर

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

1
@aroth: मुझे यकीन नहीं है कि पिछले तीन वर्षों के भीतर "बाकी सभी" का अर्थ "अपेक्षाकृत नया" होगा ":-)

Rails के ActiveRecord का एक विकल्प है जिसे DataMapper कहा जाता है , जो कि ActiveRecord के अनुसार नहीं है।
एंडी तजहोनो

3

रूबी मेटाप्रोग्रामिंग (प्रतिबिंब, आत्मनिरीक्षण), बहु-प्रतिमान प्रोग्रामिंग, और गतिशीलता को एक असामान्य स्तर पर गले लगाती है। शक्ति और लचीलेपन के साथ खुद को पैर में गोली मारना आसान है।

परेशानी? रूबी में बेहद पठनीय या असंवेदनशील होने की क्षमता है। मैंने कोड देखा है जो ऐसा लगता है जैसे यह किसी Bash स्क्रिप्ट में है।

बुरे आचरण? कुछ रूबिस्ट ज्ञान के ऊपर चतुराई को महत्व देते हैं। वे चालें लिखते हैं और साझा करते हैं जो उनकी चतुराई दिखाती है, लेकिन यह अपठनीय और नाजुक कोड बनाता है।

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

@ जेम्स और लूप्स के लिए ... जब आप माणिक में लूप के लिए करते हैं, तो यह ".each" कहता है। इसलिए, "के लिए" सी शैली छोरों के साथ लोगों के लिए सिंथेटिक चीनी अधिक आरामदायक है। लेकिन रूबिस्ट के रूप में, आप सभी समय, .map, .inject, .each_with_object जैसे पुनरावृत्तियों का उपयोग करने जा रहे हैं। आपको कभी भी रूबी में "i = 0; i> 6; i ++" जैसी किसी चीज़ के लिए लूप लिखने की ज़रूरत नहीं होगी, और इसलिए आप आदत को छोड़ देते हैं। @andrew ... वाक्पटु माणिक छोरों के लिए समर्थन नहीं करता है।


-1

यह भाषा की तुलना में प्रोग्रामर के बारे में अधिक है, लेकिन रूबी प्रोग्रामर लूप के लिए नफरत क्यों करते हैं?

मुझे एहसास है कि रूबी ने:

someCollection.each do |item|
   ...
end

लेकिन मैंने कभी नहीं देखा है कि उन स्थितियों में इस्तेमाल किया जाता है जहां एक लूप के लिए बिल्कुल वही काम नहीं होगा।

मैंने कई बार पूछा है और इस बारे में कभी कोई अच्छा जवाब नहीं दिया।

अगर यह सिर्फ एक शैली की बात है, तो मुझे यह स्वीकार करने में खुशी हो रही है, लेकिन मैंने देखा है कि रूबी प्रोग्रामर्स को वास्तव में इस बारे में काम करना है और मैं वास्तव में उत्सुक हूं।


1
एक बार मुझे भी जवाब मिला "यह कम महत्वपूर्ण प्रेस है", जो स्पष्ट रूप से गलत है ... :-)
जेम्स

2
दो सिद्धांत: 1) forछोरों का उपयोग कुछ n00bs करते हैं। जो लोग रूबी में C प्रोग्रामिंग कर रहे हैं। 2) रूबी में ब्लॉक का बहुत उपयोग किया जाता है, इसलिए कुछ ब्लॉक का उपयोग नहीं करना केवल अतिरिक्त मानसिक प्रयास है।
एंड्रयू ग्रिम

3
जब मैंने रूबी को सीखना शुरू किया, तो ब्लॉक कुछ ऐसा है जिसे मैं वास्तव में पसंद करता हूं और याद करता हूं जब मैं पायथन का उपयोग करने की कोशिश करता हूं। एक पाश के लिए एक ही बात करेंगे? बेशक, मेरे लिए, इस तरह की शैली सिर्फ लूप के लिए मेरी प्राथमिकताओं से अधिक उपयुक्त है।
जेटी

2
@andrew ईमानदार होने के लिए, आपका पहला जवाब बिल्कुल उसी तरह का बकवास है जैसा मैंने पहले पूछा था। कोई वास्तविक कारण, शीर्ष पर एक सूक्ष्म अपमान के साथ। @Wayne, @Jetti और ​​@andrews दूसरा उत्तर: धन्यवाद। तब काफी उचित।
जेम्स

1
यदि आप लूप्स के लिए "एन्हांस" (उर्फ <<> में <value> के लिए <अभिव्यक्ति> करते हैं ...) का मतलब यह है कि इसके अलावा उपयोग में कोई अंतर नहीं है और इसके सामान्य रूप से उपयोग किए जाने वाले चचेरे भाई के करीब, #collect, # अस्वीकार आदि यदि आप 'C' स्टाइल इंडेक्स लूप्स के बारे में बात कर रहे हैं (aka for int i = 0; i <जो भी; ++ i) अंतर यह है, कि a) "एक बंद" त्रुटियां असंभव हैं और b) यह आपके पाश के इरादे को स्पष्ट करता है - # प्रत्येक अर्थ "प्रत्येक तत्व के लिए एक पक्ष प्रभाव पैदा करता है"। लूप के लिए आपको पूरे लूप को पढ़ने की आवश्यकता होती है ताकि आप इसके उद्देश्य के बारे में जान सकें।
अलेक्जेंडर बत्तीसी

-1

मैं आम तौर पर उन चीजों से बचता हूं जो अन्य भाषाओं के साथ पीछे-संगत होने के लिए जोड़े गए थे। उदाहरण के लिए, Perlisms और for x in y


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