दूसरी भाषाओं की अवधारणाओं का अनुकरण करने से क्या समस्याएं पैदा हो सकती हैं?


12

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

एकमात्र समस्या अब मैं देख सकता हूं कि अन्य प्रोग्रामर आपके कोड को सामान्य से बहुत अलग पा सकते हैं, जिससे उन्हें प्रोग्राम करना कठिन हो जाता है। आपको क्या लगता है कि इससे और क्या समस्याएं पैदा हो सकती हैं?


3
लोग आपका मज़ाक उड़ाएंगे, एक बात के लिए :-)
कार्ल बेवेलफेल्ट

मैंने एक नेस्टेड फ़ंक्शन पार्सर का डी से जावा में एक बार अनुवाद किया है, लेकिन मैं मानता हूँ कि यह मेरे द्वारा लिखे गए कोड का सबसे साफ टुकड़ा नहीं है (एक इंटरफ़ेस और इसे लागू करने वाले कई वर्गों के साथ एक बड़ा कार्य)
शाफ़्ट फ्रीक

जवाबों:


23

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

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

अधिक आम तौर पर, प्रत्येक भाषा की अपनी संस्कृति होती है, अपनी स्वयं की सर्वोत्तम प्रथाएं, अपनी शैली होती है।

  • अगर मैं C # कोड लिखना शुरू कर दूं जैसे वह C था, तो यह बदसूरत होगा।

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

  • आदि।

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


+1 अच्छा उत्तर, और सी # में एफ # की तरह माप की इकाइयों को जोड़ने के साथ अतिरिक्त खोज शब्दों के लिए धन्यवाद।

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

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

@kojiro: या एक और नौकरी। जब मुझे PHP का उपयोग करने के लिए मजबूर किया गया था, तो मेरे पास वही मुद्दा था, और मैं अपने संकलक को लिखने सहित भाषा को संशोधित करने की लगातार कोशिश कर रहा था। एक कम crazier समाधान मेरी नौकरी को बदलने और केवल उन परियोजनाओं पर काम करना शुरू करना था जो PHP का उपयोग नहीं करते हैं।
आर्सेनी मूरज़ेंको

1
@Cetin Sert: सहमत हूँ, हास्केल एक उत्कृष्ट भाषा है। लेकिन अगर कोई इसे सीखना नहीं चाहता है और कार्यात्मक प्रोग्रामिंग को नहीं समझता है, तो हास्केल की सराहना करना मुश्किल होगा।
Arseni Mourzenko

10

पठनीयता में कमी आना अपने आप में एक समस्या के रूप में पर्याप्त है: यह उन लोगों के पूल को काफी कम कर देता है जो संभावित रूप से आपसे एक व्यापक प्रशिक्षण के बिना आपकी परियोजना को बनाए रख सकते हैं।

के अतिरिक्त,

  • विदेशी प्रतिमान को लागू करने से इसके उपयोग से संभावित बचत से अधिक खर्च हो सकता है
  • विदेशी कार्यक्षमता का आपका अनुकूलन रखरखाव की लागत को बढ़ाकर छोटी गाड़ी हो सकती है
  • विदेशी कार्यक्षमता का आपका अनुकूलन आपकी तकनीक को आपके मूल कार्यान्वयन द्वारा अपेक्षित सीमाओं से परे धकेल सकता है।

2
मुझे एक बार वेनिला सी में सी ++ डायनेमिक डिस्पैच (वर्चुअल टेबल इत्यादि) का अनुकरण करना पड़ा, और वास्तव में इस समस्या में भाग गया: सी प्रोग्रामर जो डायनेमिक प्रेषण को नहीं समझते थे, परियोजना में योगदान या बनाए रखने में असमर्थ थे।
आने वाली

4

यह उतना अच्छा विचार नहीं है जितना कि यह कागज पर दिखाई देता है।

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

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


2

दूसरी भाषाओं की अवधारणाओं का अनुकरण करने से क्या समस्याएं पैदा हो सकती हैं?

लीक से हटकर।


अपने उत्तर के भीतर कुछ और विवरणों को शामिल करना अच्छा हो सकता है। लेख एक ऐसे मामले से संबंधित है जहां एक अमूर्त एक महत्वपूर्ण प्रदर्शन अनुकूलन पर कब्जा करने में विफल रहता है, लेकिन मैं कहूंगा कि असंगत कोने-मामले के व्यवहार और असंगत गारंटी से बड़ी समस्याएं पैदा होती हैं; बाद का एक उदाहरण outएक ढांचे में मापदंडों का अनुकरण करने का सी # प्रयास होगा जो वास्तव में उनका समर्थन नहीं करता है; C # मानता है कि प्रत्येक फ़ंक्शन हमेशा अपने सभी outमापदंडों को लिखेगा , लेकिन C # विधियों द्वारा बुलाए गए गैर-सी # तरीके ऐसी कोई गारंटी नहीं देते हैं।
सुपरकैट

1

यह निषेधात्मक रूप से कठिन हो सकता है। अपने जावा एप्लिकेशन में CQ से LINQ को लागू करने की कोशिश करने की कल्पना करें। या कैसे के बारे में सिर्फ एक भाषा में शाब्दिक closures जोड़ने? आपको बहुत कुछ नया संकलक लिखना होगा, जो बहुत अधिक आपको एक नई भाषा देता है।

या, ऐसे मामलों के लिए जहां आपको अपनी भाषा को लागू करने की आवश्यकता नहीं है, बस ऐसी भाषा में कोड ऑर्डर या लैम्ब्डा फ़ंक्शन या क्लोज़र या फ़ंक्शन के रूप में कार्य करने वाले उच्च क्रम फ़ंक्शंस (जैसे मानचित्र) का उपयोग करके संग्रह विधियों को लागू करने का प्रयास करने की कल्पना करें क्लास ऑब्जेक्ट। प्रत्येक उच्च आदेश फ़ंक्शन को एक इंटरफ़ेस के रूप में घोषित किया जाना चाहिए और स्पष्ट रूप से लागू किया जाना चाहिए, और सभी राज्य जो एक क्लोजर में कैप्चर किए गए हैं, उन्हें स्पष्ट रूप से कार्यान्वयन वर्ग में संग्रहीत किया जाना चाहिए। यह इतना अधिक टाइपिंग है, और पढ़ने के लिए इतना कठिन है, कि यह अक्सर इसके लायक नहीं है।

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