क्या ऑपरेटर कीवर्ड या फ़ंक्शंस की तुलना में पढ़ने के लिए स्पष्ट हैं? [बन्द है]


14

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

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

सी-लाइक भाषाओं में ऑपरेटर ओवरलोड एक समान मुद्दा है, लेकिन +असामान्य नए अर्थों के साथ परिचित ऑपरेटरों के अर्थ को ओवरलोड करने की अतिरिक्त समस्या से सामना करना पड़ता है ।

किसी भी नई भाषा में, यह काफी कठिन मुद्दे की तरह प्रतीत होगा। F # में, उदाहरण के लिए, C # स्टाइल कास्ट सिंटैक्स या वर्बोज़ VB स्टाइल के बजाय कास्टिंग एक गणितीय व्युत्पन्न टाइप-कास्टिंग ऑपरेटर का उपयोग करता है। C #: (int32) xVB: CType(x, int32)F #:x :> int32

सिद्धांत रूप में एक नई भाषा में अधिकांश अंतर्निहित कार्यक्षमता के लिए ऑपरेटर हो सकते हैं। इसके बजाय defया decया varचर घोषणा, क्यों नहीं के लिए ! nameया @ nameया कुछ इसी तरह। यह निश्चित रूप से बाध्यकारी होने के बाद घोषणा को छोटा करता है: या अधिकांश कोड के @x := 5बजाय बहुत अधिक चर परिभाषाओं की आवश्यकता होती है, तो क्यों नहीं?declare x = 5let x = 5

एक ऑपरेटर कब स्पष्ट और उपयोगी होता है, और कब अस्पष्ट होता है?



1
मैं चाहता हूं कि 1,000 डेवलपर्स में से एक ने कभी मुझसे शिकायत की है कि जावा के ऑपरेटर ओवरलोडिंग की कमी इस सवाल का जवाब देगी।
smp7d

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

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

2
@ आने वाली आंधी: मुझे वास्तव में हास्केल रास्ता बेहतर लगता है। जब आपके पास परिचालकों का एक निश्चित सेट होता है जिसे आप अलग-अलग तरीकों से अधिभारित कर सकते हैं, तो आप अक्सर ऑपरेटरों को विभिन्न संदर्भों (जैसे +स्ट्रिंग संयोजन के लिए या <<धाराओं के लिए) में पुन: उपयोग करने के लिए मजबूर होते हैं । हास्केल के साथ, दूसरी ओर, एक ऑपरेटर या तो एक कस्टम नाम के साथ एक फ़ंक्शन है (जो कि, अतिभारित नहीं है) या एक प्रकार की कक्षा का हिस्सा है जिसका अर्थ है कि जब यह बहुरूपी है, तो यह हर प्रकार के लिए एक ही तार्किक बात करता है , और यहां तक ​​कि एक ही प्रकार के हस्ताक्षर हैं। तो >>है >>कि हर प्रकार के लिए और कभी नहीं एक सा बदलाव होने जा रहा है।
तिखन जेल्विस

जवाबों:


16

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

ये सभी निर्णय अंततः नीचे आते हैं कि आप कैसे पढ़ना चाहते हैं और जैसा कि आप कहते हैं कि व्यक्तिपरक है, हालांकि कोई कुछ स्पष्ट तर्क कर सकता है जैसे कि गणित के लिए सामान्य इन्फिक्स ऑपरेटरों का उपयोग करें क्योंकि हर कोई उन्हें जानता है

अंत में दिक्जस्त्र ने अपने द्वारा उपयोग किए गए गणितीय नोटेशन का एक दिलचस्प औचित्य लिखा , जिसमें infix बनाम उपसर्ग संकेतन के व्यापार-बंदों की एक अच्छी चर्चा शामिल है।


4
मुझे आपको दिक्ज़स्ट्रा पेपर के लिंक के लिए दूसरा +1 देना अच्छा लगेगा।
एपीग्रामग्राम

महान लिंक, आपको एक पेपैल खाता प्रकाशित करना था! ;)
एड्रियानो रेपेटी

8

मेरे लिए, एक ऑपरेटर उपयोगी होना बंद हो जाता है जब आप अब ज़ोर से या अपने सिर में कोड की पंक्ति को नहीं पढ़ सकते हैं, और यह समझ में आता है।

उदाहरण के लिए, के declare x = 5रूप में पढ़ता है "declare x equals 5"या के रूप में let x = 5पढ़ा जा सकता है "let x equal 5", जो बहुत समझ में आता है जब जोर से पढ़ा जाता है, हालांकि पढ़ना वैसे @x := 5ही पढ़ा जाता है "at x colon equals 5"(या "at x is defined to be 5"यदि आप एक गणितज्ञ हैं), जो बिल्कुल समझ में नहीं आता है।

इसलिए मेरी राय में, एक ऑपरेटर का उपयोग करें यदि कोड को ज़ोर से पढ़ा जा सकता है और एक समझदार व्यक्ति द्वारा समझा जा सकता है जो भाषा से परिचित नहीं है, लेकिन फ़ंक्शन नामों का उपयोग करें यदि नहीं।


5
मुझे नहीं लगता कि @x := 5यह पता लगाना कठिन है - मैं अभी भी इसे खुद के रूप में पढ़ता हूं set x to be equal to 5
FrustratedWithFormsDesigner

3
@ राचल, उस मामले में, :=प्रोग्रामिंग भाषाओं के बाहर गणितीय अंकन में व्यापक उपयोग होता है। साथ ही, जैसे बयान x = x + 1थोड़े बेतुके हो जाते हैं।
कोक्क्ले

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

1
@ccoakley धन्यवाद, मुझे पता नहीं :=था कि गणित में इस्तेमाल किया गया था। इसके लिए मुझे जो एक परिभाषा मिली, वह थी "परिभाषित किया जाता है" इसलिए @x := 5अंग्रेजी में इसका अनुवाद किया जाएगा "at x is defined to be 5", जो मेरे लिए अभी भी उतनी समझ में नहीं आता जितना कि इसे बनाना चाहिए।
राहेल

1
निश्चित रूप से पास्कल का उपयोग किया गया: = ASCII में बाएं-तीर की कमी के लिए, असाइनमेंट के रूप में।
वेटाइन

4

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

लेकिन थोड़ा आगे खुदाई करने पर, दो पहलू हैं।

सिंटैक्स (फ़ंक्शन कॉल सिंटैक्स के लिए उपसर्ग के विपरीत ऑपरेटर के लिए इन्फिक्स) और नामकरण।

वाक्यविन्यास के लिए, एक और मामला है जहां infix उपसर्ग की तुलना में पर्याप्त स्पष्ट है कि यह परिचित होने के प्रयास को वारंट कर सकता है: जब कॉल जंजीर और नेस्टेड होते हैं।

के a * b + c * d + e * fसाथ +(+(*(a, b), *(c, d)), *(e, f))या + + * a b * c d * e f(दोनों infix संस्करण के रूप में एक ही स्थिति में पार्स करने योग्य हैं) के साथ तुलना करें । यह तथ्य कि +लंबे समय से उनमें से किसी एक को पूर्ववर्ती करने के बजाय अलग-अलग शब्द मेरी दृष्टि में इसे अधिक पठनीय बनाते हैं (लेकिन आपको पूर्ववर्ती नियमों को याद रखना होगा जो उपसर्ग सिंटैक्स के लिए आवश्यक नहीं हैं)। अगर आपको चीजों को इस तरह से कंपाउंड करना है, तो लॉन्ग टर्म बेनिफिट तरीका सीखने की लागत के लायक होगा। और आप इस लाभ को तब भी रखते हैं जब आप अपने ऑपरेटरों को प्रतीकों का उपयोग करने के बजाय पत्रों के साथ नाम देते हैं।

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

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


यदि उपयोगकर्ता ऑपरेटरों को जोड़ सकते हैं, तो उन्हें अपने द्वारा जोड़े गए ऑपरेटरों की पूर्वता और समरूपता को सेट क्यों नहीं करने देते?
तिखन जेल्विस

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

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

1

ऑपरेटर्स के रूप में प्रतीक उपयोगी होते हैं जब वे सहज ज्ञान युक्त बनाते हैं। +और -इसके अलावा, इसके अलावा और घटाव, उदाहरण के लिए, यही वजह है कि हर भाषा कभी भी उन्हें अपने ऑपरेटरों के रूप में उपयोग करती है। तुलना के साथ एक ही ( <और >ग्रेड स्कूल में सिखाया जाता है, और <=और >=बुनियादी तुलना की सहज ज्ञान युक्त एक्सटेंशन जब आप समझते हैं कि वहाँ मानक कीबोर्ड पर कोई रेखांकित-तुलना चाबियाँ हैं।)

*और /कम स्पष्ट रूप से स्पष्ट हैं, लेकिन वे सार्वभौमिक रूप से उपयोग किए जाते हैं और उनकी कुंजी संख्यात्मक कीपैड के ठीक बगल में होती है +और -चाबियाँ संदर्भ प्रदान करने में मदद करती हैं। C की <<और >>एक ही श्रेणी में हैं: जब आप समझते हैं कि बाएं-शिफ्ट और राइट-शिफ्ट क्या होते हैं, तो तीर के पीछे के मंत्रों को समझना बहुत मुश्किल नहीं है।

तो फिर तुम सच में अजीब लोगों में से कुछ के लिए आते हैं, सामान जो C कोड को अपठनीय ऑपरेटर सूप में बदल सकते हैं। (सी पर यहां चुनना क्योंकि यह एक बहुत ही ऑपरेटर-भारी उदाहरण है जिसका वाक्यविन्यास बहुत अधिक सभी के साथ परिचित है, सी के साथ या वंशज भाषाओं के साथ काम करने के माध्यम से।) उदाहरण के लिए, फिर %ऑपरेटर। हर कोई जानता है कि क्या है: यह एक प्रतिशत संकेत है ... सही है? सी को छोड़कर, इसका 100 से विभाजन से कोई लेना-देना नहीं है; यह मापांक ऑपरेटर है। यह शून्य अर्थ को असाधारण बनाता है, लेकिन यह है!

इससे भी बदतर बूलियन ऑपरेटर हैं। &एक के रूप में और समझ में आता है, सिवाय इसके कि दो अलग-अलग &ऑपरेटर हैं जो दो अलग-अलग काम करते हैं, और दोनों किसी भी मामले में सिंथेटिक रूप से वैध हैं जहां उनमें से एक वैध है, भले ही उनमें से केवल एक वास्तव में किसी भी मामले में समझ में आता है। यह भ्रम का सिर्फ एक नुस्खा है! या , XOR और नहीं , क्योंकि वे mnemonically उपयोगी प्रतीकों का उपयोग नहीं करते हैं, और लगातार या तो नहीं कर रहे हैं ऑपरेटरों, और भी बदतर है। (कोई डबल- एक्सर ऑपरेटर नहीं है, और तार्किक और बिटवाइज़ एक प्रतीक और दो-तरफा संस्करण के बजाय दो अलग-अलग प्रतीकों का उपयोग नहीं करते हैं।)

और बस इसे बदतर बनाने के लिए, &और *ऑपरेटरों को पूरी तरह से अलग चीजों के लिए पुन: उपयोग किया जाता है, जो भाषा को लोगों के लिए कठिन बनाता है और पार्स करने के लिए मजबूर करता है। ( A * Bइसका क्या मतलब है? यह पूरी तरह से संदर्भ पर निर्भर करता है: Aएक प्रकार या एक चर है?)

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

पास्कल के साथ इसका विरोध करें, जिसमें सी के समान ऑपरेटर हैं, लेकिन उनका प्रतिनिधित्व करने में एक अलग दर्शन: ऑपरेटरों को सहज और पढ़ने में आसान होना चाहिए। अंकगणित ऑपरेटर समान हैं। मापांक ऑपरेटर शब्द है mod, क्योंकि कीबोर्ड पर कोई प्रतीक नहीं है जिसका स्पष्ट अर्थ "मापांक" है। तार्किक ऑपरेटर हैं and, or, xorऔर not, और वहाँ केवल एक में से एक है; संकलक जानता है कि क्या आपको बूलियन या बिटवाइज़ संस्करण की आवश्यकता है, इस आधार पर कि क्या आप बूलियंस या संख्याओं पर काम कर रहे हैं, त्रुटियों की एक पूरी कक्षा को समाप्त कर रहे हैं। यह पास्कल कोड को सी कोड की तुलना में समझने में बहुत आसान बनाता है , विशेष रूप से एक आधुनिक संपादक में वाक्यविन्यास पर प्रकाश डाला गया है जिससे ऑपरेटर और कीवर्ड पहचानकर्ताओं से अलग-अलग होते हैं।


4
पास्कल बिल्कुल अलग दर्शन का प्रतिनिधित्व नहीं करता है। आप Wirth के दस्तावेजों को पढ़ने के लिए है, वह जैसी चीजों के लिए प्रतीकों का प्रयोग किया andऔर orहर समय। जब उन्होंने पास्कल को विकसित किया, हालांकि, उन्होंने इसे कंट्रोल डेटा मेनफ्रेम पर किया, जिसमें 6-बिट वर्णों का उपयोग किया गया था। यही कारण है कि कई बातों के लिए उपयोग शब्द करने के फैसले के लिए मजबूर किया, सरल कारण के लिए है कि वर्ण सेट बस नहीं किया है , जैसे ASCII की तरह कुछ के रूप में प्रतीकों के लिए अधिक स्थान और के रूप में लगभग। मैंने C और Pascal दोनों का उपयोग किया है, और C को काफी अधिक पठनीय पाया है। आप पास्कल पसंद कर सकते हैं, लेकिन यह स्वाद की बात है, तथ्य की नहीं।
जेरी कॉफिन

Wirth के बारे में @JerryCoffin टिप्पणी को जोड़ने के लिए, इसके बाद की भाषाओं (मोडुला, ओबेरॉन) अधिक प्रतीकों का उपयोग कर रहे हैं।
एपीग्रामग्राम

@AProgrammer: और वे कभी भी कहीं भी नहीं गए। ;)
मेसन व्हीलर

मुझे लगता है |(और, विस्तार से, ||) के लिए या समझ में आता है। आप इसे अन्य संदर्भों में व्याकरण की तरह वैकल्पिक करने के लिए भी देखते हैं, और ऐसा लगता है कि यह दो विकल्पों को विभाजित कर रहा है।
तिखन जेल्विस

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

1

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

मैं गुना जैसे कार्यों के लिए शॉर्टकट ऑपरेटरों से संघर्ष कर रहा हूं, हालांकि। स्पष्ट रूप से उनके साथ अधिक अनुभव से यह आसान होगा, लेकिन मुझे इससे foldRightअधिक पठनीय लगता है /:


4
शायद उपयोग की आवृत्ति भी इसमें आती है। मुझे नहीं लगता कि आप foldअक्सर पर्याप्त होते हैं कि एक ऑपरेटर पूरे समय बचाता है। यह भी हो सकता है कि LISPy (+ 1 2 3) अजीब लगे लेकिन (1 2 3 जोड़ें) कम है। हम ऑपरेटरों को सख्ती से द्विआधारी के रूप में सोचते हैं। पारसेक के >>.स्टाइल ऑपरेटर नासमझ हो सकते हैं, लेकिन कम से कम प्राथमिक चीज़ जो आप पारसेक में करते हैं, पार्सर को जोड़ती है, इसलिए इसके लिए ऑपरेटरों को बहुत अधिक उपयोग मिलता है।
कोडेक्सअर्बनम

1

ऑपरेटरों के साथ समस्या यह है कि उनमें से कुछ ही संख्या में संवेदी (!) विधि के नामों की तुलना में उपयोग किया जाता है जो इसके बजाय इस्तेमाल किए जा सकते हैं। एक साइड इफेक्ट यह है कि उपयोगकर्ता-निश्चित ऑपरेटर बहुत अधिक ओवरलोडिंग का परिचय देते हैं।

निश्चित रूप से, लाइन C = A * x + b * cलिखने और पढ़ने की तुलना में आसान है C = A.multiplyVector(x).addVector(b.multiplyScalar(c))

या, ठीक है, यह निश्चित रूप से लिखना आसान है, अगर आपको अपने सिर में उन सभी ऑपरेटरों के सभी अतिभारित संस्करण मिले हैं। और दूसरे-से-अंतिम बग को ठीक करते हुए, आप इसे बाद में पढ़ सकते हैं।

अब, अधिकांश कोड के लिए जो वहां चल रहा है, वह ठीक है। "परियोजना सभी परीक्षण पास करती है, और यह चलती है" - कई सॉफ्टवेयर के लिए जो हम कभी भी चाहते हैं।

लेकिन जब आप ऐसे सॉफ़्टवेयर का काम कर रहे होते हैं जो महत्वपूर्ण क्षेत्रों में जाते हैं। सुरक्षा महत्वपूर्ण सामान। सुरक्षा। सॉफ्टवेयर जो विमानों को हवा में रखता है, या जो परमाणु सुविधाओं को चालू रखता है। या सॉफ़्टवेयर जो आपके अत्यधिक गोपनीय ईमेल को एन्क्रिप्ट करता है।

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

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


0

मुझे लगता है कि सबसे चरम उदाहरण एपीएल है निम्नलिखित कार्यक्रम "जीवन का खेल" है:

life←{↑1 ⍵∨.∧3 4=+/,¯1 0 1∘.⊖¯1 0 1∘.⌽⊂⍵}

और अगर आप संदर्भ पुस्तिका के साथ कुछ दिनों के खर्च के बिना इसका मतलब निकाल सकते हैं तो आपके लिए शुभकामनाएं!

समस्या यह है कि आपके पास प्रतीकों का एक सेट है जो लगभग हर कोई सहज रूप से समझता है: +,-,*,/,%,=,==,&

और बाकी को समझने से पहले कुछ स्पष्टीकरण की आवश्यकता होती है, और आमतौर पर विशेष भाषा के लिए विशिष्ट होते हैं। उदाहरण के लिए, यह स्पष्ट करने के लिए कोई स्पष्ट प्रतीक नहीं है कि आप किसी सरणी के किस सदस्य को चाहते हैं, [], () और यहां तक ​​कि ""। उपयोग किया गया है, लेकिन समान रूप से कोई स्पष्ट कीवर्ड नहीं है जिसे आप आसानी से उपयोग कर सकते हैं, इसलिए ऑपरेटरों के विवेकपूर्ण उपयोग के लिए बनाया जाने वाला एक मामला है। लेकिन उनमें से बहुत सारे नहीं हैं।

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