लिंकलेडिस्ट का विस्तार। लिस्कोव प्रतिस्थापन सिद्धांत का उल्लंघन?


13

Add_first (), add_last (), add_after (), remove_first (), remove_last () और remove () जैसे फ़ंक्शन के साथ एक क्लास लिंक्डलिस्ट मौजूद है

अब एक वर्ग स्टैक है जो कार्यात्मकता प्रदान करता है जैसे कि पुश (), पॉप (), झांकना () या शीर्ष (), और इन विधियों को लागू करने के लिए यह लिंक्डलिस्ट वर्ग के तरीकों का विस्तार करता है। क्या यह लिस्कोव प्रतिस्थापन सिद्धांत का उल्लंघन है?

उदाहरण के लिए, लिंक्ड सूची की nth स्थिति में नोड जोड़ने के लिए add_after () मामले पर विचार करें। यह बेस क्लास में किया जा सकता है लेकिन स्टैक क्लास में नहीं। क्या पोस्टकंडिशन यहां कमजोर किए जा रहे हैं या क्या आप add_after () विधि को स्टैक के शीर्ष पर जोड़ने के लिए संशोधित करते हैं?

इसके अलावा, यदि उल्लंघन नहीं है, तो क्या यह खराब डिज़ाइन है? और आप लिंक्डलिस्ट क्लास का उपयोग करके स्टैक कार्यक्षमता को कैसे लागू करेंगे?


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

7
हां यह एक बुरा डिजाइन है क्योंकि यह आपको स्टैक के आंतरिक प्रतिनिधित्व को एक लिंक की गई सूची (जैसे एक सरणी) के अलावा किसी अन्य चीज़ में बदलने से रोक देगा। आप उन ऑपरेशनों को भी उजागर कर रहे हैं जो स्टैक आमतौर पर समर्थन नहीं करते हैं। विरासत के बजाय रचना का उपयोग करें।
ली

2
क्या आप विस्तार करना चाहते हैं LinkedList? आप एक निश्चित जोशुआ बलोच (जिसने जावा संग्रह ढांचे को डिजाइन करने में एक प्रमुख भूमिका निभाई) की सलाह पर ध्यान केंद्रित करना चाह सकते हैं, जब उन्होंने कहा कि "उत्तराधिकार पर रचना को प्राथमिकता दें" - हो सकता है कि LinkedListआपके स्टैक वर्ग के अंदर हो , लेकिन वास्तव में इसे विस्तारित न करें?
corsiKa

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

1
ऐसा लगता है कि जो होता है वह इसके विपरीत होता है। अगर मैं ऐसा कर रहा था, तो संभवत: मैं एक लिस्टेड क्लास क्लास को "स्टैक" इंटरफ़ेस लागू करने के लिए तैयार करूंगा, जो ऐसा करने में पूरी तरह सक्षम है। अन्यथा यह गलत तरीका है क्योंकि स्टैक एक अवधारणा है, एक लिंक की गई सूची एक कार्यान्वयन है जो अन्य चीजों के बीच एक स्टैक के रूप में कार्य कर सकती है।
वैधता

जवाबों:


31

अब एक वर्ग स्टैक है जो कार्यात्मकता प्रदान करता है जैसे कि पुश (), पॉप (), झांकना () या शीर्ष (), और इन विधियों को लागू करने के लिए यह लिंक्डलिस्ट वर्ग के तरीकों का विस्तार करता है। क्या यह लिस्कोव प्रतिस्थापन सिद्धांत का उल्लंघन है?

नहीं। सबटाइप में विधियों को जोड़ना पूरी तरह से ठीक है।

उदाहरण के लिए, लिंक्ड सूची की nth स्थिति में नोड जोड़ने के लिए add_after () मामले पर विचार करें। यह बेस क्लास में किया जा सकता है लेकिन स्टैक क्लास में नहीं।

यह है LSP का उल्लंघन। एलएसपी का कहना है कि किसी कार्यक्रम के वांछनीय गुणों को बदले बिना एक उपप्रकार के उदाहरणों के लिए उपप्रकार के उदाहरणों को प्रतिस्थापित किया जाना चाहिए। यदि कोई उपप्रकार एक विधि को हटाता है, तो उस विधि को कॉल करने वाला कोई भी कोड क्रैश हो जाएगा (या NoMethodErrorउन पंक्तियों के साथ एक अपवाद, या कुछ मिल जाएगा )। जाहिर है, "दुर्घटनाग्रस्त नहीं" एक वांछनीय संपत्ति है।

क्या पोस्टकंडिशन यहां कमजोर किए जा रहे हैं या क्या आप add_after () विधि को स्टैक के शीर्ष पर जोड़ने के लिए संशोधित करते हैं?

add_after()इस तरह से विधि को संशोधित करना इतिहास के नियम (नियमों का सबसे महत्वपूर्ण!) का उल्लंघन है और इस तरह एलएसपी के उल्लंघन को ठीक करने में मदद नहीं करता है।

और आप लिंक्डलिस्ट क्लास का उपयोग करके स्टैक कार्यक्षमता को कैसे लागू करेंगे?

रचना का उपयोग करके।

नोट: मैंने जो कुछ भी ऊपर लिखा है, वह केवल उन भाषाओं पर लागू होता है, जो घटाव और उपवर्ग को भ्रमित करती हैं! एलएसपी सबटाइपिंग के बारे में है , उप- वर्गिंग नहीं। एक ऐसी भाषा में जो दोनों को भ्रमित नहीं करती है, यह तब तक Stackउप-वर्ग बनाने के लिए पूरी तरह से स्वीकार्य होगा LinkedList, जब तक आप इसे एक उपप्रकार नहीं बनाते हैं LinkedList


9
इतिहास नियम क्या है? मैं इसे इंटरनेट में खोजने में विफल रहा।
ज़ापाडलो

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

2
मुझे लगता है कि विकिपीडिया लेख में व्याख्या काफी अच्छी है: wikipedia.org/wiki/Liskov_substitution_principle लेकिन हमेशा की तरह, आपको वास्तव में मूल स्रोत को पढ़ना चाहिए।
जॉर्ज डब्ल्यू मित्तग

@ JörgWMittag: जबकि मुझे लगता है कि "इतिहास" होगा या नहीं देखा जाएगा, इसके बारे में अपने अनुबंध की गारंटी में शामिल करने के प्रकारों के लिए यह उचित होगा, मुझे नहीं लगता कि यह आवश्यक है कि प्रत्येक सुपरटेप टिप्पणियों के प्रत्येक अनुक्रम का उत्पादन करने में सक्षम हो। यह उपप्रकार की एक वस्तु पर संभव हो सकता है - केवल यह कि सुपरपेप्ट संभावना का दस्तावेज है कि सुपरपाइप के उपभोक्ता अपने अनुक्रमों का निरीक्षण कर सकते हैं।
सुपरैट

1

चूँकि सब कुछ Jörg W Mittag द्वारा पहले से ही संबोधित किया गया था, इसलिए मैं निम्नलिखित भाग पर थोड़ा विस्तार करूँगा:

क्या पोस्टकंडिशन यहां कमजोर किए जा रहे हैं या क्या आप add_after () विधि को स्टैक के शीर्ष पर जोड़ने के लिए संशोधित करते हैं?

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

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