कार्यात्मक भाषाओं के लिए स्वच्छ संहिता के सिद्धांतों को लागू करना


16

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

[डब्ल्यू] ई कार्यक्रम को पढ़ने में सक्षम होना चाहता है, क्योंकि यह टीओई पैराग्राफ का एक सेट था, जिनमें से प्रत्येक एब्सट्रैक्शन के वर्तमान स्तर का वर्णन कर रहा है और अगले स्तर पर पैराग्राफ के बाद पैराग्राफ का संदर्भ दे रहा है।

( क्लीन कोड , पृष्ठ ३ a: एक "टू पैरा" एक पैराग्राफ है जो कि शिशु में सुनाई देने वाले वाक्य के साथ शुरू होता है। "एक्स करने के लिए, हम स्टेप्स वाई और जेड करते हैं।" "टू वाई, वी ..." आदि। ) उदाहरण के लिए:

RenderPageWithSetupsAndTeardowns के लिए, हम यह देखने के लिए जांचते हैं कि क्या पृष्ठ एक परीक्षण पृष्ठ है और यदि ऐसा है, तो हम सेटअप और आंसू शामिल करते हैं। या तो मामले में हम पृष्ठ को HTML में प्रस्तुत करते हैं

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

हास्केल मानक पुस्तकालय से एक उदाहरण लेते हुए :

maximumBy               :: (a -> a -> Ordering) -> [a] -> a
maximumBy _ []          =  error "List.maximumBy: empty list"
maximumBy cmp xs        =  foldl1 maxBy xs
                        where
                           maxBy x y = case cmp x y of
                                       GT -> x
                                       _  -> y

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

क्या मैं विचार करने के लिए गलत हूं (कम से कम कुछ) कार्यात्मक प्रोग्रामिंग सर्वोत्तम प्रथाओं के साथ बाधाओं पर स्वच्छ कोड ? क्या एक अलग तरीके से व्याख्या करने का एक समझदार तरीका है जो वह एक अलग प्रतिमान में कहता है?


1
फंक्शनल प्रोग्रामर ओवर ट्राय कोड लिखना पसंद करते हैं, यह सच है। मैं दूरस्थ रूप से उस वातावरण में भी, हालांकि एक सर्वोत्तम अभ्यास पर विचार नहीं करूंगा।
तेलेस्टिन

अज्ञान को क्षमा करें, लेकिन एक पैरा क्या है?
शशांक गुप्ता

4
जैसा कि हाल ही में एक अन्य प्रश्न में उल्लेख किया गया था, दिज्क्स्ट्रा ने "प्राकृतिक भाषा प्रोग्रामिंग" की मूर्खता के बारे में लिखा था और मैं उनसे सहमत हूं कि कोड जो गद्य की तरह पढ़ता है वह एक पाइप सपना है। मुझे लगता है कि हास्केल में यह विशेष रूप से सच है, जो शुद्ध होने के नाते, प्रतीकात्मक रूप से प्रभाव पैदा करने के लिए चरणों के अनुक्रमों के बजाय मूल्यों के बीच समानताएं व्यक्त करता है। मुझे लगता है कि महत्वपूर्ण बात यह है कि उद्धृत कोड मुहावरेदार है। जैसे xsकि एक बुरा नाम है लेकिन यह iलूप वेरिएबल्स के लिए कार्यात्मक भाषाओं में सामान्य है ।
डोभाल

@ शशांकगुप्त प्रथम ने पुस्तक में विशिष्ट पृष्ठ के लिंक के साथ प्रश्न को संपादित किया और साथ ही यूनान बॉब ने जो लिखा उसकी मेरी अपनी समझ है।

@ शशांकगुप्त वह कुछ उदाहरण देते हैं, लेकिन विचार यह है कि इसे गद्य की तरह पढ़ना चाहिए। "सूची की अधिकतम पता लगाने के लिए, आप हर तत्व की जांच करते हैं ..."
पैट्रिक कॉलिन्स

जवाबों:


11

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

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

अंत में, क्लीन कोड और हास्केल के कोडिंग दिशानिर्देश एक ही चीज़ के लिए प्रयास करते हैं, लेकिन वहां पहुंचने के लिए अपने स्वयं के पथ लेते हुए हवा करते हैं।


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

मैं मार्टिन की क्लीन कोड बुक को स्टाइल मैनुअल नहीं मानता। मुझे लगता है कि पुस्तक की शिक्षाएं वास्तव में एक शैली गाइड और डिजाइन पैटर्न के बीच कहीं फिट होती हैं।
माइकल आर

15

मुझे यकीन नहीं है कि मैं आपके उदाहरण से आपका मतलब क्या है। पैराग्राफ, जैसा कि वह उनका वर्णन करता है, लंबी-घुमावदारता की आवश्यकता नहीं है। उसका मतलब यह नहीं है कि कोड को अंग्रेजी की तरह पढ़ा जाना चाहिए। तार्किक प्रगति में अमूर्तता के समान स्तर पर कार्यक्षमता का समूहन महत्वपूर्ण है। यह एक सैद्धांतिक संरचनात्मक अवधारणा है जो प्रोग्रामिंग प्रतिमानों को पार करती है।

बॉब मार्टिन के "टू पैरा" प्रारूप में व्यक्त, मैं आपके उदाहरण को इस प्रकार पढ़ता हूं:

  • गणना करने के लिए maximumBy, आपको एक आदेश देने वाले फ़ंक्शन और एक सूची की आवश्यकता होती है, और परिणाम उस सूची का एक तत्व होता है।
  • maximumByएक खाली सूची और किसी भी आदेश देने वाले फ़ंक्शन की गणना करना एक त्रुटि है।
  • maximumByकिसी सूची की गणना करने के लिए xs, आप maxByफ़ंक्शन का उपयोग करके उस सूची पर गुना करते हैं।
  • maxByदो सूची तत्वों की गणना करने के लिए, आप दिए गए आदेश देने वाले फ़ंक्शन का उपयोग करके उनकी तुलना करते हैं। यदि पहला तत्व अधिक है, तो इसे चुनें। अन्यथा दूसरा चुनें।

आप सबसे सामान्य अवधारणाओं के साथ शुरू कर रहे हैं और अधिक विस्तार से प्रगति कर रहे हैं, जैसे कि अनिवार्य उदाहरणों में। "टू पैराग्राफ" का विचार यह है कि जब आप पृष्ठ को ऊपर और नीचे कूदने के बिना पर्याप्त विवरण प्राप्त कर लेते हैं, तो आप एक निश्चित बिंदु पर पढ़ना बंद कर सकते हैं। यहाँ भी ऐसा ही है।

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

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

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

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