पूर्वनिर्धारण को मजबूत करना और पोस्टकंडिशन को कमजोर करना लिस्कॉव प्रतिस्थापन सिद्धांत का उल्लंघन करता है?


19

मैंने पढ़ा कि लिस्कोव के प्रतिस्थापन सिद्धांत का उल्लंघन किया गया है:

  1. Preconditions मजबूत कर रहे हैं, या

  2. पोस्टकंडिशन कमजोर हो गए हैं

लेकिन मैं पूरी तरह से अभी तक नहीं मिलता है कि ये दो बिंदु लिस्कोव प्रतिस्थापन सिद्धांत का उल्लंघन कैसे करेंगे। क्या कोई एक उदाहरण के साथ समझा सकता है। विशेष रूप से, उपरोक्त स्थितियों में से कोई भी एक ऐसी स्थिति का कारण कैसे बनेगा जहां एक उपवर्ग वस्तु को सुपरक्लॉज ऑब्जेक्ट के लिए प्रतिस्थापित नहीं किया जा सकता है?

जवाबों:


29
  1. मान लें कि आपकी बेसकेल्स एक सदस्य इंट के साथ काम करती है। अब आपके उपप्रकार के लिए आवश्यक है कि int सकारात्मक हो। यह पूर्व-स्थितियों को मजबूत करता है, और अब कोई भी कोड जो नकारात्मक चींटियों के टूटने से पहले पूरी तरह से ठीक काम करता है।

  2. इसी तरह, एक ही परिदृश्य मान लें, लेकिन आधार वर्ग यह गारंटी देता था कि सदस्य को बुलाया जाने के बाद सकारात्मक होगा। फिर उपप्रकार नकारात्मक ints को अनुमति देने के लिए व्यवहार को बदलता है। कोड जो ऑब्जेक्ट पर काम करता है (और मानता है कि पोस्ट-कंडीशन एक सकारात्मक इंट है) अब टूट गया है क्योंकि पोस्ट-कंडीशन को बरकरार नहीं रखा गया है।

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


1

यहाँ छवि विवरण दर्ज करें

अपरिवर्तनीय - SelfDrivingVehicle का टेम्प्लेट जो सभी उपप्रकारों में अपरिवर्तित रहता है अर्थात वह क्रम जिसमें वह गंतव्य तक पहुंचने के लिए अति-व्यवहार को निष्पादित करता है।

एक और विधि यहाँ मान लें

           -List<SelfDrivingVehicle> vehicles 
           +Add(SelfDrivingVehicle vehicle)
            vehicles.add(vehicle)

Precondition - SelfDriveVehicle आधार प्रकार का इसमें कोई वाहन नहीं है (यहाँ संदर्भ जोड़ा गया है) और इसके कमजोर Precondition में जो इसके किसी भी प्रकार से परिवर्तित नहीं किया जा सकता है संपत्ति वाहनों को बदलकर और स्पष्ट रूप से मजबूत करें। कोई भी उप प्रकार केवल ऐड को लागू कर सकता है।

पोस्टकंडिशन - एक बार जब ऐड किया जाता है तो बेस टाइप को मजबूत पोस्टकंडिशन में रखा जाता है, जो वाहनों के मूल्य में परिवर्तन करके उप प्रकारों द्वारा कमजोर नहीं किया जा सकता है।

बेस टाइप के ऐड आने के बाद बेस स्टेट ऑफ अपनी मूल स्थिति में वापस आ जाता है।


-1

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

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

रेफरी: विकिपीडिया - http://en.wikipedia.org/wiki/Liskov_substitution_principle


1
दुर्भाग्य से उस उदाहरण का औपचारिक सत्यापन से कोई लेना-देना नहीं है। कोई अनुबंध नहीं हैं।
फ्रैंक हिलमैन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.