आप एक लंबे अभिव्यक्ति श्रृंखला है, तो let
का उपयोग करें। लंबे भागने वाले भाव या गहरा घोंसला वाले अभिव्यक्ति किसी भी भाषा में विशेष रूप से पठनीय नहीं हैं। यह बुरा है:
(do-something (map :id (filter #(> (:age %) 19) (fetch-data :people))))
यह मामूली बेहतर है:
(do-something (map :id
(filter #(> (:age %) 19)
(fetch-data :people))))
लेकिन यह भी बुरा है:
fetch_data(:people).select{|x| x.age > 19}.map{|x| x.id}.do_something
हम यह पढ़ रहे हैं, तो क्या हम जानते हैं की जरूरत है? हम people
के कुछ सबसेट के कुछ विशेषताओं पर do_something
पर कॉल कर रहे हैं। यह कोड पढ़ना मुश्किल है क्योंकि पहले और आखिरी के बीच इतनी दूरी है कि हम उस समय भूल जाते हैं जब हम उनके बीच यात्रा करते हैं।
रुबी के मामले में, do_something
(या जो भी हमारे अंतिम परिणाम का उत्पादन कर रहा है) लाइन के अंत में खो गया रास्ता है, इसलिए यह कहना मुश्किल है कि हम अपने people
पर क्या कर रहे हैं। क्लोजर के मामले में, यह तुरंत स्पष्ट है कि do-something
वह है जो हम कर रहे हैं, लेकिन यह कहना मुश्किल है कि हम इसे पूरी चीज़ के अंदर अंदर पढ़ने के बिना क्या कर रहे हैं।
इस सरल उदाहरण से अधिक जटिल कोई भी कोड बहुत दर्दनाक बनने जा रहा है। यदि आपका पूरा कोड इस तरह दिखता है, तो आपकी गर्दन स्पेगेटी की इन सभी पंक्तियों में आगे और पीछे थक गई है। फिर मैं do-something
उन्हें मैं people
के साथ शुरू, मैं चारों ओर मूर्ख, और:
(let [people (fetch-data :people)
adults (filter #(> (:age %) 19) people)
ids (map :id adults)]
(do-something ids))
अब यह स्पष्ट है:
मैं कुछ इस तरह पसंद करेंगे।
और आप इस के साथ दूर हो सकती है:
fetch_data(:people).select{|x|
x.age > 19
}.map{|x|
x.id
}.do_something
लेकिन मैं शायद बल्कि यह, बहुत कम से कम करना चाहते हैं:
adults = fetch_data(:people).select{|x| x.age > 19}
do_something(adults.map{|x| x.id})
यह भी जब भी let
उपयोग करने के लिए अनसुना नहीं है आपके मध्यस्थ अभिव्यक्तियों के अच्छे नाम नहीं हैं। (इस शैली कभी कभी, Clojure के अपने स्रोत कोड में प्रयोग किया जाता है defmacro
के लिए स्रोत कोड जैसे)
(let [x (complex-expr-1 x)
x (complex-expr-2 x)
x (complex-expr-3 x)
...
x (complex-expr-n x)]
(do-something x))
यह, डिबगिंग में एक बड़ी मदद हो सकता है क्योंकि आप ऐसा करके किसी भी बिंदु पर बातें निरीक्षण कर सकते हैं:
(let [x (complex-expr-1 x)
x (complex-expr-2 x)
_ (prn x)
x (complex-expr-3 x)
...
x (complex-expr-n x)]
(do-something x))
मुझे लगता है कि यह केवल मूर्खतापूर्ण है क्योंकि इसका उपयोग आप करते हैं। उपसर्ग नोटिक्स इंफिक्स से कहीं अधिक संगत है और इसलिए इसे उपयोग करने के बाद इसे पढ़ना आसान हो सकता है। –
माइक, आपको अभिव्यक्ति लिखने की आवश्यकता है '(फ़िल्टर # (expr1) (मानचित्र # (expr2) expr3)) '। क्या आप आंतरिक expr3 या फ़िल्टर से टाइप करना शुरू कर देंगे? – Alexey
मैं आमतौर पर बाहर से शुरू करता हूं और अपना रास्ता काम करता हूं। इसलिए मैं जो चाहता हूं उसके बारे में सोचता हूं और उससे पीछे की तरफ चलता हूं। –