2012-04-19 12 views
33

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

उत्तर

43

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

इन्फ़िक्स संकेतन यह बोझिल कोड बाद में संशोधित करने के लिए बनाता है। यहाँ कुछ उदाहरण हैं।

कल्पना कीजिए कि आप कोड की इस पंक्ति है:

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। उन्हें आम तौर पर देखभाल के साथ तैयार किया जाता है ताकि उनके दस्तावेज/उदाहरणों (जो आमतौर पर इंफिक्स नोटेशन का उपयोग करता है) में निर्धारित तरीके से लिखे गए पार्सिंग मुद्दों का कारण न हो।

+6

यह वही तर्क भी इंफिक्स नोटेशन के पक्ष में उपयोग किया जा सकता है, क्योंकि यह प्राथमिकता को नियंत्रित करने के लिए अतिरिक्त तंत्र प्रदान करता है (ऑपरेटरों को चुनने के अलावा)। और यह प्राथमिकता को और अधिक स्पष्ट रूप से स्पष्ट बनाता है। उदाहरण के लिए, अपने पहले उदाहरण को सही कार्यों के साथ पुनः लिखने का प्रयास करें और न केवल उठाए गए तरीकों: '(xs filter f map g) .toList' अभी भी बहुत साफ है और 'xs.filter (f) .map (g) .toist से अधिक स्पष्ट है) ' –

+2

चारों ओर कोष्ठक डालने के लिए गैर-रैखिक संपादन की आवश्यकता होती है, इन्फिक्स नोटेशन से बचने का एक और कारण। चारों ओर ब्रेसिज़ को छोड़ना मामले की मदद नहीं करता है। – missingfaktor

+1

वहां बिंदु कोष्ठक छोड़ना संपूर्ण बिंदु है। ऑपरेटरों के सापेक्ष "ताकत" और कोष्ठक/ब्रेसिज़ के उपयोग के साथ संयुक्त होने पर, * * को * प्राथमिकता को नियंत्रित करने के लिए * इंफिक्स बनाम डॉट नोटेशन का उपयोग करने की क्षमता रखने के लिए कोड को साफ रखने के लिए एक बहुत ही शक्तिशाली टूल है। –

12

यह व्यक्तिगत वरीयता का मामला है। एक शैली या दूसरे का उपयोग करने का आपका निर्णय इस बात पर आधारित होना चाहिए कि आपके कोड को सबसे अधिक पढ़ने योग्य बनाता है।

लेकिन ध्यान दें कि डॉट और कोष्ठक को बंद रखना होगा करने की क्षमता केवल कुछ वाक्यात्मक निर्माण तक ही सीमित है, तो कभी कभी तुम सिर्फ उन्हें ही उपयोग किया है।

+5

भी ध्यान रखें कि 'a.op (ख)' 'एक सेशन b' से अधिक समय लेकिन' से (एक सेशन ख) कम है '। मामूली अंतर लेकिन यह "सबसे अधिक पढ़ने योग्य" विचार का हिस्सा हो सकता है। –

+0

आप ए। बी (बीबी) के बजाय ए? बी का उपयोग कर सकते हैं? बी अगर आपको हर बाइट को बचाने की ज़रूरत है। :) बेशक, विधियों की संख्या, इस तरह नामनीय, किसी भी तरह सीमित है। –

2

आधिकारिक स्काला साइट प्रलेखन कि डॉट नोटेशन से अधिक समुचित उपयोग इन्फ़िक्स संकेतन का वर्णन में एक अच्छा 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" 
0

मुझे पता चला है कि 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

संबंधित मुद्दे