साक्षर प्रोग्रामिंग, अच्छी / बुरी डिजाइन पद्धति


10

मुझे हाल ही में साक्षर प्रोग्रामिंग की अवधारणा मिली है । और मैंने इसे पेचीदा पाया। फिर भी मुझे इस दावे के साथ सामना नहीं करना पड़ा है कि यह एक कार्यक्रम बनाने का एक बुरा तरीका है। ऐसा लगता है कि कई जगह नहीं है। यहां तक ​​कि मैं इस बारे में कोई सवाल नहीं कर सकता था।

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

समस्या को छोटे वाक्य आधारित समस्याओं में विभाजित करने की अवधारणा वास्तव में एक शानदार विचार है। इस प्रकार यह कार्यक्रम के प्रवाह की समझ को कम करेगा।

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

इसलिए मैं इस बारे में प्रतिक्रिया प्राप्त करना चाहूंगा कि किसी को इसे खराब / अच्छी डिजाइन पद्धति क्यों मानना ​​चाहिए?


2
ज़ेरोथ, मैंने साक्षर-प्रोग्रामिंग टैग बनाया और विकिपीडिया लेख के आधार पर एक सारांश जोड़ा। कृपया प्रासंगिक जानकारी के साथ टैग विकी का विस्तार करने में सहायता करें।
यानिस

@YannisRizos मैं इसे यहाँ जोड़ दूंगा, मेरे पास एडिट विशेषाधिकार नहीं हैं।
zeroth

1
खैर, मुझे न तो :) मैंने कुछ संसाधनों को जोड़ा है (विकिपीडिया लेख, और आपके प्रश्न में लिंक), वे तब दिखाई देंगे जब संपादित करें सहकर्मी की समीक्षा की जाती है और स्वीकार किया जाता है (!)। यह एक पेचीदा दृष्टिकोण है, और जब से आप पहले से ही इसकी खोज कर रहे हैं, वापस आएँ और हर बार जब आप कुछ ऐसा पाते हैं, जो आपको लगता है कि इसमें उल्लेखनीय है, तो टैग विकी को सुधारें।
यानि

1
मैं साहित्यिक प्रोग्रामिंग साइट के लेखक को यूएक्स स्टैकएक्सचेंज साइट पर जाने की सलाह दूंगा - रंग वास्तव में पढ़ने के लिए खराब हैं।
डैनी वारोड

1
FYI करें, literate-programmingStackOverflow पर एक टैग भी है। वहां और भी सामग्री है, हालांकि अभी भी ज्यादा नहीं है।
रॉस पैटरसन

जवाबों:


9

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

यह अप्रासंगिक है। दशकों से है। आप इसे प्रश्न से हटा सकते हैं, क्योंकि यह अपने अनुकूलनकर्ताओं को वश में करने के लिए आधुनिक संकलक के साथ कोई मतलब नहीं रखता है।

इसलिए मैं इस बारे में प्रतिक्रिया प्राप्त करना चाहूंगा कि किसी को इसे खराब / अच्छी डिजाइन पद्धति क्यों मानना ​​चाहिए?

साक्षर प्रोग्रामिंग के लिए कोई नकारात्मक पहलू नहीं है। (मुझे उस भावना के लिए दर्जनों -1 वोटों की उम्मीद है।) एक व्यवसायी के रूप में, मैंने कभी कोई समस्या नहीं देखी।

कुछ तर्क हैं जिनके खिलाफ "उच्च-स्तरीय भाषा में प्रोग्रामिंग करने के लिए सभी राशि को परिणामी कोड को ट्विट करके विकृत किया जा सकता है।" सही। उसी तरह से C ++ में प्रोग्रामिंग का .oनिर्माण किया गया फ़ाइल को ट्विक करके सब-ओवर किया जाता है। यह सच है, लेकिन अप्रासंगिक है।

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

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

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

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

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

बहुत बड़ी संख्या में प्रोग्रामर हैं जो केवल मामूली रूप से सफल होते हैं और फिर केवल दुर्घटना के द्वारा दिखाई देते हैं। (स्टैक ओवरफ्लो में पर्याप्त बुरे प्रश्न हैं जो इंगित करते हैं कि कई प्रोग्रामर मूल सिद्धांतों को समझने के लिए संघर्ष करते हैं।) प्रोग्रामर जो मोटे तौर पर असंगत स्टैक ओवरफ्लो प्रश्न पूछते हैं, हम जानते हैं कि वे वास्तव में साक्षर प्रोग्रामिंग का अच्छा काम नहीं कर सकते, क्योंकि वे कर सकते हैं। 'प्रोग्रामिंग का अच्छा काम नहीं करते।


7
किसी भी माध्यम, औपचारिक या अनौपचारिक में कुछ समझाते समय बड़ी संख्या में प्रोग्रामर मुश्किल से सुसंगत होते हैं, यह साक्षर प्रोग्रामिंग, टिप्पणी लिखना या ईमेल भी हो सकता है। यह एक आश्चर्य सॉफ्टवेयर है सब पर काम करता है :)
एंड्रेस एफ।

3

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

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

और निश्चित रूप से, यह आपको कोड के मूल प्रवाह और डिजाइन को तेजी से सीखने में मदद करता है, क्योंकि अधिकांश लोगों के लिए सादे अंग्रेजी अक्सर सूचक अंकगणितीय की तुलना में अधिक सहज होती है।


1

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

एक डीएसएल के पीछे का विचार समस्याओं के एक क्षेत्र को एक सरल, प्राकृतिक-भाषा-उन्मुख व्याकरण में वितरित करना है जो उन समस्याओं को हल करने के लिए निर्मित एल्गोरिदम के लिए उपयोग किया जा सकता है।

मेरे लिए, वही विचार, या कम से कम इसका मूल आधार, साक्षर प्रोग्रामिंग से संबंधित समान या कम से कम है।

उदाहरण के लिए, groovy दुनिया में, अधिक नियमित रूप से DSLs का उपयोग करने और सामान्य समस्याओं को हल करने के लिए नए DSL बनाने के लिए एक मजबूत धक्का है। यह धक्का भाषा (आसान बिल्डरों) के भीतर दोनों टूल से आता है, साथ ही कोर-लाइब्रेरीज़ जो डीएसएल-आधारित एपीआई का समर्थन करते हैं।

यह देखते हुए कि प्रवृत्ति, कम से कम दुनिया के उस कोने में, साक्षर प्रोग्रामिंग की ओर है, मैं कहूंगा कि इसके लिए प्रयास करना एक अच्छी पद्धति है।

दुर्भाग्य से, एक अच्छा डीएसएल बनाने के लिए आवश्यक सोच का स्तर अक्सर अधिकांश प्रोग्रामर से परे होता है, जो मैंने देखा है। मुझे पता है कि मैं समय-समय पर आवश्यक कुछ अवधारणाओं के साथ व्यक्तिगत रूप से संघर्ष करता हूं। यह ऐसी कठिनाई हो सकती है जिसने ऐसी तकनीकों को अधिक व्यापक प्रसार अपनाने से रोका है।

उपकरण का उपयोग करते समय यह आपका क्लासिक मामला है, लेकिन इसे बनाना एक अलग स्तर पर है।


मेरे दृष्टिकोण पर थोड़ा विस्तार करने के लिए, यह बहुत ज्यादा नहीं है कि डीएसएलएस साक्षर प्रोग्रामिंग के समान हैं, बल्कि यह कि वे साक्षर प्रोग्रामिंग को बहुत अधिक संभव बनाते हैं । विशेष रूप से जब वे प्राकृतिक भाषा डीएसएल होते हैं

ग्रूवी के संस्करण 1.8 में, अधिक शक्तिशाली कमांड चेन के साथ प्राकृतिक भाषा डीएसएल क्षमता में काफी सुधार किया गया था ।

उदाहरण के लिए, कोड की निम्नलिखित पंक्तियाँ प्रोग्रामिंग हैं , न कि केवल छद्म-वाक्य:

drink tea with sugar and milk
move left by 30.centimeters
sendFrom "Guillaume" to "Jochen"
send from: "Jochen" to "Lidia"
Email.from "Lidia" to "Guillaume" withBody "how are you?"
contact.name "Guillaume" age 33
move left by 30.centimeters
sell 100.shares of MSFT
take 2.pills of chloroquinine in 6.hours
blend red, green of acrylic
artist.paint "wall" with "Red", "Green", and: "Blue" at 3.pm
wait 2.seconds and execute { assert true }
concat arr[0] with arr[1] and arr[2]
developped with: "Groovy" version "1.8-beta-2"

नोट: कोड का नमूना गिलौम लैफॉर्ज के ब्लॉग से आता है

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

प्राकृतिक भाषा का उपयोग करते हुए सिस्टम के महत्वपूर्ण घटकों को "एनकोड" करने में सक्षम होना साक्षर प्रोग्रामिंग का बहुत सार है। कोड की विखंडू के साथ प्राकृतिक भाषा को प्रतिच्छेद करना साक्षर प्रोग्रामिंग का एक संक्षिप्त रूप है। उपयोगी होते हुए, मेरा मानना ​​है कि प्राकृतिक भाषा डीएसएल जो आपको प्राकृतिक भाषा का उपयोग करने की अनुमति देती है क्योंकि कोड ही एक बड़ी छलांग है।

सामान्य रूप से प्रोग्रामिंग की क्षमता का विस्तार करना प्रक्रिया का अगला चरण है, लेकिन काफी हद तक ऐसा करने के उपकरण पहले से ही मौजूद हैं। हां, अभी तक "सामान्य" डीएसएल नहीं है, लेकिन छोटे डोमेन के लिए, क्षमता है।

कार्रवाई में इसके अधिक उदाहरणों के लिए (कोई विशेष क्रम में नहीं):


2
देखने की दिलचस्प बात। मेरे दृष्टिकोण से यह एक डीएसएल के साथ बिल्कुल भी अच्छा नहीं है। के बाद से साक्षर प्रोग्रामिंग है में कुछ गैर डीएसएल भाषा। और उपकरण डीएसएल की तरह ज्यादा नहीं हैं। वे समस्या डोमेन की ओर उन्मुख नहीं हैं। क्या आप एक उदाहरण दे सकते हैं कि आपको लगता है कि साक्षर प्रोग्रामिंग एक डीएसएल की तरह है? एक उदाहरण के लिए एक लिंक या एक संदर्भ आपके उत्तर को स्पष्ट करने में मदद कर सकता है।
एस.लॉट

इसका एक उदाहरण ग्रूवी 1.8 में कमांड चेन है जो आपको "प्रोग्राम" जैसे turn left then rightया paint wall with red, green and yellow: docs.codehaus.org/display/GROOVY/…
cdeszaq

@ एस.लॉट - मैं मानता हूं कि डीएसएल और साक्षर प्रोग्रामिंग में निश्चित रूप से अंतर है, लेकिन मुझे लगता है कि डीएसएल सच साक्षर प्रोग्रामिंग को प्राप्त करने के लिए एक उपकरण हो सकता है जहां आप प्राकृतिक-ईश भाषा टाइप कर सकते हैं और यह वांछित एल्गोरिथ्म व्यक्त कर सकता है। मेरे लिए, प्राकृतिक भाषा और कोड का मिश्रण साक्षरता का एक संक्षिप्त रूप है।
cdeszaq

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

1
"कार्यक्रम तर्क की व्याख्या"। स्वयं तर्क नहीं। लेकिन एक स्पष्टीकरण। तर्क शायद ही स्व-व्याख्यात्मक है। इसमें कभी भी शुद्धता का प्रमाण नहीं होता (यह कठिन और कभी-कभी असंभव होता है)। इसमें शायद ही कभी बड़े-ओ जटिलता का औचित्य होता है। और यह शायद ही कभी उन विकल्पों की व्याख्या करता है जो कम प्रदर्शन या अधिक मेमोरी हैं। इसलिए, मैं सुझाव दूंगा कि डीएसएल "स्पष्टीकरण" से कम है।
S.Lott

-2

मुझे लगता है कि यह सोचना गलत है कि एलपी किसी तरह का डीएसएल है। क्योंकि LP - विकसित प्रोग्राम के जर्नल (डायग्राम्स, स्कीम्स, छद्म-कोड अंश, यानी चंक्स) के साथ है, यह आर्किटेक्चर वगैरह है ... यह पेपर नोटबुक का बिल्कुल एनालॉग है - कई डेवलपर्स इनका इस्तेमाल करते हैं लेकिन प्रोग्राम खत्म होने के बाद - अपने 'नोटबुक्स, पेपर को छोड़ दो ...

लंबे समय से पहले प्रत्येक भौतिक विज्ञानी, ज्योतिषी, रसायनज्ञ / रसायनज्ञ, गणितज्ञ की अपनी नोटबुक, कई योजनाओं के साथ पांडुलिपियां, आवश्यक जानकारी, तालिकाओं हैं, और उनके बिना आप उनके सफल अनुभव, उनके परिणामों को समझ या दोहरा सकते हैं। और हमेशा ऐसे लोगों के बीच पांडुलिपियों / नोटबुक का शिकार होता है।

आज कई प्रोग्रामर कोड लिखते हैं, और कभी-कभी वे टिप्पणी जोड़ते हैं! बाइट प्रोग्राम केवल कोड नहीं है - यह विचार, विचार, कल्पना, अवधारणा है और जब नया डेवलपर विदेशी कोड प्राप्त करता है - वह अक्सर सभी विचारों और अवधारणाओं को तोड़ता है, विभिन्न "कमियां" और "बैकसाइड" बनाता है, मुझे आशा है कि आप मुझे समझेंगे :)

तो, एलपी के लिए मुख्य आवश्यकता (उपकरण के रूप में!) भी सरल, प्रकाश, पठनीय वाक्यविन्यास के साथ इन सभी की अनुमति है। मैंने कई एलपी टूल्स की कोशिश की, लेकिन आज मैं खुद को विकसित कर रहा हूं - नैनोएलपीपी ( http://code.google.com/p/nano-lp/ ) जो इस मांग को पूरा करने का लक्ष्य है।

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