क्या एक दूसरे के लिए एक अच्छा अभ्यास है? मैं ओडर्सकी, एट अल द्वारा स्कैला पुस्तक पढ़ रहा हूं। और ऐसा लगता है जैसे इन्फिक्स का उपयोग कई संग्रह एपीआई कार्यों के लिए किया जाता है, जबकि डॉट प्रोग्रामर-परिभाषित कार्यों के लिए आरक्षित है।स्कैला - इंफिक्स बनाम डॉट नोटेशन
उत्तर
मैं व्यक्तिगत रूप से इस बात के लिए किसी भी निर्धारित नियम और कानून की जरूरत नहीं है, लेकिन मैं अक्षरांकीय लोगों के लिए केवल प्रतीकात्मक विधि नाम के साथ इन्फ़िक्स संकेतन, और डॉट नोटेशन का उपयोग करते हैं।
इन्फ़िक्स संकेतन यह बोझिल कोड बाद में संशोधित करने के लिए बनाता है। यहाँ कुछ उदाहरण हैं।
कल्पना कीजिए कि आप कोड की इस पंक्ति है:
xs filter { f } map { g }
समय में कुछ उत्तरार्द्ध बिंदु आप अंत में एक toList
जोड़ने की जरूरत पर मान लीजिए। आप यह इतना डाल:
xs filter { f } map { g } toList
यह अर्धविराम अनुमान समस्याओं का कारण बन सकता है। इन मुद्दों से बचने के लिए, आप या तो अंत में अर्धविराम डालते हैं, या एक नई लाइन डालते हैं। मेरी राय में दोनों विकल्प बदसूरत हैं। इस बकवास से बचने के लिए, मैं xs.filter(f).map(g)
के साथ जाना पसंद करता हूं। इस वाक्यविन्यास के साथ प्रतिक्रिया करना हमेशा आसान होता है।
एक अन्य उदाहरण है: मैं अपने कोड में निम्नलिखित है कहते हैं:
if(foo contains bar) { ..
कहो, मैं शर्त नकारना की जरूरत है। यदि मैं इसे निम्नानुसार संशोधित करता हूं:
if(!foo contains bar) { ..
बमर। इसे (!foo).contains(bar)
के रूप में पार्स किया जाता है। हम क्या चाहते थे नहीं।
या आप इसके अलावा में एक नई शर्त जोड़ने की जरूरत है लगता है, और आप इसे इतना संशोधित:
if(foo contains bar && cond) { ..
एक और बहुत बेकार। इसे foo.contains(bar.&&(cond))
के रूप में पार्स किया जाता है। हम फिर से क्या नहीं चाहते थे।
बेशक, आप के आसपास कोष्ठकों का एक समूह जोड़ सकता है, लेकिन डॉट नोटेशन की तुलना में है कि बदसूरत और/संपादन पढ़ने के लिए मुश्किल होगा।
अब, क्या के सभी मैंने ऊपर कहा प्रतीकात्मक विधि के नाम करने के लिए बहुत लागू होता है। हालांकि डॉट सिंटैक्स के साथ उपयोग किए जाने पर प्रतीकात्मक तरीके अप्राकृतिक लगती हैं, और इसलिए मैं उनके लिए इन्फिक्स वाक्यविन्यास पसंद करता हूं। ऊपर दिशानिर्देश को
एक अपवाद: आंतरिक DSLs। उन्हें आम तौर पर देखभाल के साथ तैयार किया जाता है ताकि उनके दस्तावेज/उदाहरणों (जो आमतौर पर इंफिक्स नोटेशन का उपयोग करता है) में निर्धारित तरीके से लिखे गए पार्सिंग मुद्दों का कारण न हो।
यह व्यक्तिगत वरीयता का मामला है। एक शैली या दूसरे का उपयोग करने का आपका निर्णय इस बात पर आधारित होना चाहिए कि आपके कोड को सबसे अधिक पढ़ने योग्य बनाता है।
लेकिन ध्यान दें कि डॉट और कोष्ठक को बंद रखना होगा करने की क्षमता केवल कुछ वाक्यात्मक निर्माण तक ही सीमित है, तो कभी कभी तुम सिर्फ उन्हें ही उपयोग किया है।
भी ध्यान रखें कि 'a.op (ख)' 'एक सेशन b' से अधिक समय लेकिन' से (एक सेशन ख) कम है '। मामूली अंतर लेकिन यह "सबसे अधिक पढ़ने योग्य" विचार का हिस्सा हो सकता है। –
आप ए। बी (बीबी) के बजाय ए? बी का उपयोग कर सकते हैं? बी अगर आपको हर बाइट को बचाने की ज़रूरत है। :) बेशक, विधियों की संख्या, इस तरह नामनीय, किसी भी तरह सीमित है। –
आधिकारिक स्काला साइट प्रलेखन कि डॉट नोटेशन से अधिक समुचित उपयोग इन्फ़िक्स संकेतन का वर्णन में एक अच्छा style guide नहीं है।
प्रत्यय संकेतन:
names.toList
// is the same as
names toList // Unsafe, don't use!
arity-1:
// right!
names foreach (n => println(n))
names mkString ","
optStr getOrElse "<empty>"
// wrong!
javaList add item
उच्च क्रम कार्य:
// wrong!
names.map (_.toUpperCase).filter (_.length > 5)
// right!
names map (_.toUpperCase) filter (_.length > 5)
प्रतीकात्मक तरीकों/ऑपरेटर:
// right!
"daniel" + " " + "Spiewak"
// wrong!
"daniel"+" "+"spiewak"
मुझे पता चला है कि map
के लिए इंफिक्स नोटेशन का उपयोग करके अच्छी तरह से काम करता है जब मैं बिल्लियों लाइब्रेरी के साथ कार्टशियन बना रहा हूं। उदा .:
(fetchIt(1) |@| fetchIt(2) |@| fetchIt(3)).map(MyCaseClass)
तुम इतनी तरह आसपास के कोष्ठकों से छुटकारा पाने के कर सकते हैं:
fetchIt(1) |@| fetchIt(2) |@| fetchIf(3) map MyCaseClass
और मेरे विचार में दूसरा संस्करण अच्छे पढ़ता है। स्वाद का मामला मुझे लगता है। बस मेरे दो सेंट के लायक जोड़ना चाहता था।
उपरोक्त काम करता है क्योंकि |
"| @ |" "मानचित्र" में m
से अधिक प्राथमिकता है। स्काला लैंग विनिर्देश के इस भाग पढ़ें और अधिक विस्तार पता लगाने के लिए:
अगर वहाँ एक अभिव्यक्ति में कई इन्फ़िक्स संचालन उच्च पूर्वता बाँध के साथ ऑपरेटरों और अधिक बारीकी से की तुलना में कम पूर्वता के साथ ऑपरेटर हैं, तो।
http://scala-lang.org/files/archive/spec/2.12/06-expressions.html#infix-operations
- 1. इंफिक्स से उपसर्ग नोटेशन
- 2. डॉट नोटेशन
- 3. LINQ: डॉट नोटेशन बनाम क्वेरी अभिव्यक्ति
- 4. Mongodb डॉट नोटेशन वाइल्डकार्ड?
- 5. डॉट नोटेशन शैली
- 6. जावास्क्रिप्ट डॉट नोटेशन
- 7. डॉट नोटेशन वस्तु
- 8. स्कैला में स्लाइस नोटेशन?
- 9. यह क्यों काम किया? (Php डॉट नोटेशन)
- 10. हास्केल इंफिक्स फ़ंक्शन एप्लिकेशन प्राथमिकता
- 11. क्लास विधियों के साथ उद्देश्य-सी डॉट नोटेशन?
- 12. शब्दकोश कुंजी unpythonic के लिए जावास्क्रिप्ट शैली डॉट नोटेशन?
- 13. डॉट नोटेशन के माध्यम से NSDictionary एक्सेस करें?
- 14. लिंक - डॉट नोटेशन के साथ बाएं बाहरी जुड़ें
- 15. पहुंच डॉट नोटेशन के साथ एक बहुआयामी सरणी
- 16. उद्देश्य-सी डॉट नोटेशन या स्क्वायर ब्रैकेट नोटेशन में क्या पसंद किया जाता है?
- 17. स्कैला
- 18. इंफिक्स नोटेशन में अभिव्यक्तियों को पार्स करने के लिए एल्गोरिदम क्या है?
- 19. पावरशेल आयात-मॉड्यूल बनाम डॉट सोर्सिंग
- 20. डॉट उत्पाद - एसएसई 2 बनाम बीएलएएस
- 21. स्कैला अभिनेता: बनाम प्रतिक्रिया
- 22. डॉट-डॉट-डॉट तर्कों का दायरा
- 23. '../' (डॉट डॉट स्लैश)
- 24. जावा ब्रैकेट नोटेशन?
- 25. एरलांग कंसुरेंसी मॉडल बनाम स्कैला बनाम गो
- 26. डॉट
- 27. स्कैला फ़ंक्शन बनाम क्लास डिचोटोमी
- 28. स्कैला में मिक्सिन बनाम संरचना
- 29. स्कैला XML.loadString बनाम शाब्दिक अभिव्यक्ति
- 30. स्कैला पैकेज ऑब्जेक्ट बनाम प्रिडफ
यह वही तर्क भी इंफिक्स नोटेशन के पक्ष में उपयोग किया जा सकता है, क्योंकि यह प्राथमिकता को नियंत्रित करने के लिए अतिरिक्त तंत्र प्रदान करता है (ऑपरेटरों को चुनने के अलावा)। और यह प्राथमिकता को और अधिक स्पष्ट रूप से स्पष्ट बनाता है। उदाहरण के लिए, अपने पहले उदाहरण को सही कार्यों के साथ पुनः लिखने का प्रयास करें और न केवल उठाए गए तरीकों: '(xs filter f map g) .toList' अभी भी बहुत साफ है और 'xs.filter (f) .map (g) .toist से अधिक स्पष्ट है) ' –
चारों ओर कोष्ठक डालने के लिए गैर-रैखिक संपादन की आवश्यकता होती है, इन्फिक्स नोटेशन से बचने का एक और कारण। चारों ओर ब्रेसिज़ को छोड़ना मामले की मदद नहीं करता है। – missingfaktor
वहां बिंदु कोष्ठक छोड़ना संपूर्ण बिंदु है। ऑपरेटरों के सापेक्ष "ताकत" और कोष्ठक/ब्रेसिज़ के उपयोग के साथ संयुक्त होने पर, * * को * प्राथमिकता को नियंत्रित करने के लिए * इंफिक्स बनाम डॉट नोटेशन का उपयोग करने की क्षमता रखने के लिए कोड को साफ रखने के लिए एक बहुत ही शक्तिशाली टूल है। –