बर्ट्रेंड मेयर को लगता है कि (/ किया) सबक्लासिंग "बंद" मॉड्यूल का विस्तार करने का एकमात्र तरीका क्यों है?


19

मेयर के ऑब्जेक्ट-ओरिएंटेड सॉफ्टवेयर कंस्ट्रक्शन (1988) में वह खुले / बंद सिद्धांत को निम्नानुसार परिभाषित करता है:

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

वह कहता है:

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

इस दुविधा का मेयर समाधान है: मौजूदा कक्षाओं को संशोधित करके कभी भी पुस्तकालय मॉड्यूल का विस्तार न करें; इसके बजाय, एक नया मॉड्यूल लिखें जो मौजूदा कक्षाओं को उपवर्गित करता है, और नए ग्राहक उस नए मॉड्यूल पर निर्भर होते हैं।

अब, 1988 में, मैं टर्बो पास्कल और ब्लेंकशिप बेसिक में खिलौना (प्रक्रियात्मक) कार्यक्रम लिख रहा था, और मेरा 21 वीं सदी का पेशेवर अनुभव जेवीएम, सीएलआर और गतिशील भाषाओं में है, इसलिए मुझे नहीं पता कि अय्यर का क्या मतलब है। "डिजाइन और प्रोग्रामिंग के लिए शास्त्रीय दृष्टिकोण" द्वारा।

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

क्या कोई ऐतिहासिक कारण है कि यह दावा 1988 में स्वतः स्पष्ट लग रहा था? क्या कहा, सी स्टेटिक लाइब्रेरी में फ़ंक्शंस या डेटा स्ट्रक्चर्स को जोड़ने से लेआउट बदल जाता है जैसे कि बैकवर्ड-कम्पेटिबल एपीआई के साथ भी, क्लाइंट्स को रीकंप्लीकेट करना पड़ता है? या Meyer वास्तव में सिर्फ एपीआई बैकवर्ड संगतता लागू करने के लिए एक तंत्र के आसपास बात कर रहा है?


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

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

@ dan1111: एफिल का उत्तराधिकार के प्रति दृष्टिकोण, सहित, लेकिन कई वंशानुक्रम के लिए इसके दृष्टिकोण तक सीमित नहीं है, C ++, Java, C #, आदि से अलग है, इसलिए यह आश्चर्य की बात नहीं है कि दृष्टिकोण अलग है। उन्होंने विशेष रूप से OO पर अपने विचारों का समर्थन करने के लिए एफिल को विकसित किया, आखिरकार।
जोर्ग डब्ल्यू मित्तग

जवाबों:


18

जहाँ तक मैं बता सकता हूँ, इस प्रश्न का उत्तर बर्ट्रेंड मेयर ने स्वयं दिया है, और उत्तर है, यह कथन सही नहीं है। डिजाइन और प्रोग्रामिंग के लिए शास्त्रीय दृष्टिकोण के साथ, वास्तव में मॉड्यूल लिखने का एक तरीका हो सकता है जो खुले और बंद दोनों हैं।

यह पता लगाने के लिए, आपको इस पुस्तक के दूसरे संस्करण (नौ साल बाद, 1997 में प्रकाशित) का अध्ययन करने की आवश्यकता है। फोर्वर्ड के अनुसार दूसरे संस्करण के लिए , यह है

अद्यतन नहीं, लेकिन पूरी तरह से परिश्रम का परिणाम है। मूल संस्करण का कोई पैराग्राफ अछूता नहीं छोड़ा गया है। (शायद ही एक भी लाइन, वास्तव में।)

विशेष रूप से, बयान जो आपको भ्रमित करता है। "Five3.3 फाइव प्रिंसिपल्स" में अभी भी ओपन-क्लोज्ड थ्योरी चैप्टर है, और "In14.7 इंट्रोडक्शन टू इनहेरिटेंस" में इस विषय पर और गहन चर्चा हुई है, लेकिन पहले संस्करण का बयान अब नहीं है।

इसके बजाय क्या है जो पूर्व तरीकों के विपरीत ओओ दृष्टिकोण में अधिक सुविधाजनक और मुहावरेदार है, इस पर ध्यान केंद्रित करता है,

विरासत के लिए धन्यवाद, OO डेवलपर्स सॉफ़्टवेयर विकास के लिए बहुत अधिक वृद्धिशील दृष्टिकोण अपना सकते हैं, जो पहले के तरीकों के साथ संभव हो सके ... (...3.3)

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

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

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


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

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

विशेष रूप से, इस भाग में मेयर विवरण में बताते हैं कि वंशानुक्रम (कुछ गुहाओं और सीमाओं के साथ, लेकिन अभी भी) को सी और यहां तक ​​कि फोरट्रान में कैसे लागू करना संभव होगा।

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


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

@DavidMoles बात है, यह कर सकता है , और मेरे उत्तर का अंतिम भाग बताता है कि, और उस मेयर ने खुद महसूस किया कि (जब वह 2 संस्करण के लिए फिर से तैयार किया गया था) और यहां तक ​​कि इसका उदाहरण दिया जा सकता है कि यह कैसे किया जा सकता है। "के लिए के रूप में क्या विशेष रूप से लेखक ने अपना मन बदल ..." आदि
gnat

हम्म। मुझे इस लाइब्रेरी का "संस्करण 2" दिखाई नहीं देता है, जो संस्करण 1 को प्रतिस्थापित करता है और इसके साथ पीछे की ओर संगत है, व्यापक संभव वैचारिक तरीके को छोड़कर "विरासत" के रूप में निम्नलिखित कार्यों को जोड़ता है।
डेविड मोल्स

(इनहेरिटेंस, मेरे लिए, इसका मतलब है कि संस्करण 1 अभी भी आसपास है और संस्करण 2 से बुलाया जाता है)
डेविड मोल्स

@DavidMoles संस्करण 2 के साथ बदलते हैं (जैसा कि स्रोत कोड और recompile को बदलें ) "संशोधन के लिए बंद" के रूप में अर्हता प्राप्त नहीं करेगा, आप इसे विकिपीडिया लेख में आसानी से देख सकते हैं : "इकाई अपने स्रोत कोड को संशोधित किए बिना अपने व्यवहार को बढ़ाने की अनुमति दे सकती है ... "
gnat
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.