छोटे काल के प्रारंभिक इतिहास में "नियत" से एलन के का क्या अर्थ था?


47

मैं स्मॉलटॉक के प्रारंभिक इतिहास को पढ़ रहा हूं और "असाइनमेंट" के कुछ उल्लेख हैं जो मुझे इसके बारे में मेरी समझ पर सवाल करते हैं:

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

( 1960-66 से - साठ के दशक के शुरुआती ओओपी और अन्य औपचारिक विचार , खंड I)

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

( "ऑब्जेक्ट ओरिएंटेड" स्टाइल , सेक्शन IV)

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

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

...तथा:

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

क्या यह कहना उचित होगा कि यहाँ अपारदर्शी, अपरिवर्तनीय उदाहरणों को प्रोत्साहित किया जा रहा है? या यह केवल प्रत्यक्ष राज्य परिवर्तन है जो हतोत्साहित किया जाता है? उदाहरण के लिए, यदि मेरे पास एक BankAccountवर्ग है, तो यह ठीक है GetBalance, Depositऔर Withdrawउदाहरण के तरीके / संदेश; बस सुनिश्चित करें कि कोई SetBalanceउदाहरण विधि / संदेश नहीं है?

जवाबों:


86

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

लेकिन वस्तुओं में समय के परिवर्तन की "विश्व रेखाएं" होती हैं। इसे वस्तु के संस्करणों के -history- के रूप में माना जा सकता है जिसमें -relationships- अनुरूप हैं। इस योजना में कोई दौड़ की स्थिति नहीं है ... एक वस्तु केवल तभी दिखाई देती है जब वह स्थिर होती है और अब कंप्यूटिंग नहीं होती है। यह एचडब्ल्यू में दो चरण की घड़ी की तरह है। (स्ट्रेची से आइडिया, और मैकार्थी से अलग, और ल्यूसिड से प्रभावित)।

शुभकामनाएँ,

एलन के


2
@ alan-kay: धन्यवाद! क्या मुझे मेरी थीसिस में यह उद्धृत करने की आपकी अनुमति है?
ओलिवियर डेगानिस

2
साइड इफेक्ट को नियंत्रित करना, या बहुत से भाषाओं के लिए होली ग्रिल के रूप में साइड इफेक्ट को नियंत्रित करना जानते हैं। लेकिन ऐसा लगता है कि कोई भी इसे अभी तक नहीं मिला है। :)
21

@OlivierDagenais हालांकि मुझे यकीन है कि एलन खुश से ज्यादा होगा (वह एक बहुत बढ़िया आदमी की तरह लगता है), एसई जवाब सीसी लाइसेंस प्राप्त हैं, इसलिए एसई प्रश्नों और उत्तरों को सोर्स करना पूरी तरह से वैध है।
वेन वर्नर

दो चरण की घड़ी? क्या यह "ऑब्जर्वर" पैटर्न और डेटाफ्लो पैटर्न की तरह एक्सेल में या रिएक्ट.जेएस की तरह है, जहां वस्तुएं बाधाओं को बनाए रखने के लिए किसी भी बदलाव का प्रचार करती हैं।
aoeu256

21

मुझे लगता है कि एलन ने पहले ही इस सवाल का जवाब दे दिया है, और इसलिए ऐसा लग सकता है कि आगे जवाब देना व्यर्थ है। हालाँकि, एलन ने आपके हर सवाल का जवाब नहीं दिया।

विशेष रूप से:

क्या यह कहना उचित होगा कि यहाँ अपारदर्शी, अपरिवर्तनीय उदाहरणों को प्रोत्साहित किया जा रहा है? या यह केवल प्रत्यक्ष राज्य परिवर्तन है जो हतोत्साहित किया जाता है? उदाहरण के लिए, यदि मेरे पास एक BankAccount वर्ग है, तो GetBalance, जमा और निकासी के तरीकों / संदेशों का होना ठीक है; बस सुनिश्चित करें कि वहाँ कोई SetBalance उदाहरण विधि / संदेश नहीं है?

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

इन ऑब्जेक्ट्स - टेलर, डिपॉजिट स्लिप आदि को सीधे तौर पर रिवाइज करने से - सिस्टम में एंटिटीज द्वारा पास किए गए मैसेज के अनुसार प्रॉब्लम डोमेन को संरचित किया जाता है।

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

यह महत्वपूर्ण क्यों है? ठीक है, अपने आप से पूछें कि लेनदेन को रिकॉर्ड करने के लिए क्या करना चाहिए:

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

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

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


OOP के सभी-बहुत-आम BankAccountखिलौना उदाहरण को फैलाने के लिए धन्यवाद ।
अकुंन

हालांकि कुल मिलाकर आपका उत्तर बहुत अच्छा है (बहुत कम लोग समझते हैं कि कोई खाता एक शेष राशि नहीं है, लेकिन लेनदेन की एक सूची है, इसलिए इसके लिए धन्यवाद), आपको डबल-एंट्री अकाउंटिंग अधिकार नहीं मिलता है। दोहरी प्रविष्टि की बात यह है कि किसी खाते में प्रत्येक डेबिट या क्रेडिट (लेन-देन की सूची) में चीजों को मिलाने के लिए अन्य खातों के अनुरूप क्रेडिट या डेबिट होते हैं। उदाहरण के लिए, यदि आप if 108 के लिए एक ग्राहक से डेबिट करते हैं (यानी, ग्राहक ने आपको इतना पैसा दिया है), तो आप उस डेबिट से मिलान करने के लिए ¥ 100 और आपके "टैक्स बकाया" खाते का राजस्व a 8 से क्रेडिट करते हैं और दिखाते हैं कि पैसा कहाँ जाता है (या जाना चाहिए)।
कर्ट जे। सैम्पसन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.