क्या दीजकस्ट्रा ने कोड संशोधन के लिए इरादा किया था, जब उन्होंने चिंताओं को अलग करने के बारे में लिखा था?


9

सबसे पहले, मैंने एक अंशकार एद्जर डब्ल्यू। दिक्जस्त्र का 1974 का पेपर "वैज्ञानिक विचार की भूमिका पर" पढ़ा:

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

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

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

एक संक्षिप्त उदाहरण के लिए, यहां कुछ कोड है जिसमें डेटा एक्सेस है, और दृश्य (आउटपुट):

$sql = "SELECT * FROM product WHERE id = " . db_input($id);
$row = db_fetch_array(db_query($sql)); 
<option value="<?=$row['id']?>"<?= $row['ver'] == $row['ver'] ? '  selected="selected"' : '' ?>>Version <?=$row['ver']?></option>

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

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

फिर हम भौतिक मॉड्यूलर कोड पृथक्करण और डिजाइन पैटर्न के साथ खुद को बोझ क्यों बना रहे हैं? क्या यह केवल एक पहलू पर ध्यान केंद्रित करने के लिए पर्याप्त नहीं होगा, भले ही आपका कोड कैसे संरचित हो?

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

क्या शारीरिक के बजाय चिंताओं को अलग करना एक मानसिक व्यायाम होना चाहिए?
दूसरे शब्दों में, प्रोग्रामिंग के मानसिक (फोकस पर) और भौतिक (कोड पर कोड) पहलुओं के बीच एक डिस्कनेक्ट होना चाहिए?


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

ठीक है, इसलिए शायद मैं 'मानसिक चिंताओं के व्यायाम के रूप में' चिंताओं को अलग करने, और कागज पर कोड के एक पहलू को संक्षिप्त करने के तरीके के रूप में संशोधित कर सकता हूं। हालाँकि अब मैं चिंताओं को अलग करता हूं और अलग-अलग अवधारणाओं के रूप में संशोधित करता हूं।
डेनिस

@ JörgWMittag, क्या आप संरचित और मॉड्यूलर प्रोग्रामिंग के बीच अंतर को परिभाषित कर सकते हैं? Google पर कुछ लिंक बताते हैं कि वे समान हैं।
डेनिस

स्ट्रक्चर्ड = IF, WHILE, FORबजाय GOTO। मॉड्यूलर = एक अच्छी तरह से परिभाषित सार्वजनिक एपीआई के साथ मॉड्यूल एक छिपी आंतरिक कार्यान्वयन और प्रतिनिधित्व से सख्ती से अलग हो जाते हैं। (जैसे मोडुला, मेसा, मोडुला -2, मोडुला -3, बाद में पास्कल बोलियाँ ( UNIT)।)
जोर्ग डब्ल्यू मित्तग

जवाबों:


2

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


14

चिंताओं का पृथक्करण सोच का एक अमूर्त तरीका है जिसमें अलग-अलग चीजों पर विचार करना शामिल है जो संबंधित नहीं हैं।

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


9

मेरा सुझाव है कि, जबकि कागज ऐतिहासिक रुचि का है, 40 साल पहले "चिंताओं को अलग करने" शब्द से दिक्जस्त्र का क्या मतलब है, आज विशेष रूप से प्रासंगिक नहीं है। आजकल इसका उपयोग बड़े पैमाने पर उपयोग के संदर्भ में किया जाता है।

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


5
मुझे लगता है कि यह ध्यान दिया जाना चाहिए कि सेपरेशन ऑफ सेपरर्न्स के बारे में आधुनिक विचार शुरुआती पेपरों से आए थे, जिन्होंने अंततः आईबीएम से एस्पर्ट ओरिएंटेड प्रोग्रामिंग को जन्म दिया। मुझे लगता है कि शुरुआती कागजात (90 के दशक के उत्तरार्ध में) 2000 का सबसे बड़ा प्रभाव हैं। यह एक समय हो गया है और वेब साइट सभी बदल गए हैं। यकीन नहीं होता कि मैं उन्हें फिर से पा सकता हूं।
बेरीन लोरिट्सच

2
कठिन हिस्सा यह परिभाषित करने की कोशिश कर रहा है कि "एक चीज" का क्या मतलब है। इसके बिना, व्यावहारिक कोड लेखन के संदर्भ में विचार बेकार है, और इसे गलत तरीके से लिखने, पढ़ने, समझने, बनाए रखने और कोड का परीक्षण करने की कठिनाई पर तुरंत हानिकारक प्रभाव पड़ता है।
jpmc26

1
यह वास्तव में हमें आपकी स्थिति को समझने में मदद करेगा यदि आप (क) समझाते हैं कि आप क्या सोचते हैं कि दिज्कस्ट्रा का मतलब "चिंताओं को अलग करना" है और (ख) आप यह क्यों समझते हैं कि उसका क्या मतलब है जो अब प्रासंगिक नहीं है।
बजे जॉन आर। स्ट्रॉहम

2

मैं आपको उन चिंताओं के पृथक्करण का एक व्यक्तिगत उदाहरण दे सकता हूं जो मुझे लगता है कि दिज्क्स्ट्रा की अवधारणाओं के लिए तुलनीय है। जब मैं सॉफ्टवेयर में एक विशेष विषय वस्तु का विश्लेषण करता हूं तो मैं तीन विचारों का निर्माण करता हूं।

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

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

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


1

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

  • पोर्टेबल
  • विभिन्न बाहरी उपकरणों के बहुत से सुलभ
  • कई प्रोग्रामर द्वारा सुलभ
  • संस्करण और तुलनीय
  • बड़े पैमाने पर ऑपरेटिंग सिस्टम के साथ जो फ़ाइल हैंडलिंग में बहुत अच्छा होता है

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

यह नहीं है कि कवक या शैवाल हालांकि कैसे बढ़ते हैं ... यह एक विनम्र तथ्य के लिए कैसे है?


-1

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

किसी को OO का उपयोग करके विकसित होने में SOLID प्रिंसिपलों का पालन करना चाहिए। यहां उनके लिए एक अच्छा लिंक है, लेकिन, "चिंताओं के अलगाव" पर TLDR ज्यादातर S SOLID में है: एकल जिम्मेदारी सिद्धांत या एसआरपी।

यह, निश्चित रूप से, एक शारीरिक व्यायाम है, मानसिक नहीं। आपके विशिष्ट उदाहरण के लिए, MVC (या यह भाई-बहन MVVM और MVP है) एक को अलग-अलग फ़ाइलों में मॉडल, दृश्य और नियंत्रक / प्रस्तुतकर्ता / ViewModel के भौतिक रूप से अलग करने के लिए निर्देश देता है । मैंने कुछ MVVM कार्यान्वयन देखे हैं जहाँ ये अलग-अलग विधानसभाओं में लागू किए जाते हैं ताकि "अवधारणाओं को मिलाने" की प्रवृत्ति को और अधिक बाधित किया जा सके।

परंतु। यह सिर्फ सरल से परे है "यह एक दृश्य है और यह एक मॉडल है", यदि आप इस पर अंकल बॉब के विचार का पालन करते हैं।

किसी विशेष ओओ तत्व के लिए आवश्यकताओं के स्रोत पर भी विचार करने की आवश्यकता है। यदि आप मिश्रण कर रहे हैं, तो कहिए कि ग्राहक क्या चाहता है, ऑपरेशन कार्मिक क्या चाहता है, आप SRP का भी उल्लंघन कर रहे हैं। या, अंकल बॉब के रूप में इसे करने के लिए: ए क्लास में एक और केवल एक कारण होना चाहिए।

मैं अत्यधिक अनुशंसा करता हूं कि आप आपूर्ति किए गए लिंक का उपयोग करके इसे आगे अनुसंधान करें या "ठोस सिद्धांतों" के लिए एक वेब खोज करें।


नहीं। ठोस सिद्धांतों को वास्तव में कोड (= दार्शनिक) लिखने की वास्तविकता से दूर कर दिया गया है, जिसे वे केवल किसी भी दूरस्थ रूप से उपयोगी तरीके से समझ सकते हैं, जब आप पहले से ही अच्छे कोड लिखने का तरीका जानते हैं, तो वे किस बिंदु पर बेमानी हैं। पहले से ही अनुभव और क्षमता के बिना मार्गदर्शक सिद्धांतों के रूप में उनका उपयोग करना बेहद खराब कोड का उत्पादन करता है।
jpmc26
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.