क्या Liskov प्रतिस्थापन सिद्धांत आत्मनिरीक्षण या बतख टंकण के साथ असंगत है?


11

क्या मैं सही ढंग से समझता हूं कि लिस्कोव सबस्टीट्यूशन प्रिंसिपल को उन भाषाओं में नहीं देखा जा सकता है जहां ऑब्जेक्ट खुद का निरीक्षण कर सकते हैं, जैसे कि डक टाइप की गई भाषाओं में सामान्य क्या है?

उदाहरण के लिए, रूबी में, यदि कोई वर्ग एक वर्ग से Bविरासत में मिला है A, तो प्रत्येक वस्तु xके लिए A, x.classवापस लौटने वाला है A, लेकिन यदि xकोई वस्तु है B, तो x.classवह वापस नहीं आने वाली है A

यहाँ एलएसपी का एक बयान है:

चलो क्ष (एक्स) एक संपत्ति साध्य हो वस्तुओं के बारे में x प्रकार के टी । तो फिर क्यू (y) साध्य होना चाहिए के लिए वस्तुओं y प्रकार के एस जहां एस की एक उप-प्रकार है टी

उदाहरण के लिए, रूबी में,

class T; end
class S < T; end

इस रूप में एलएसपी का उल्लंघन करें, जैसा कि संपत्ति q (x) = द्वारा देखा गया हैx.class.name == 'T'


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


अपडेट करें। संदर्भ के लिए, यहाँ एलएसपी का एक और सूत्रीकरण है जो मैंने वेब पर पाया है:

आधार वर्गों के लिए संकेत या संदर्भ का उपयोग करने वाले कार्य यह जानने के बिना व्युत्पन्न वर्गों की वस्तुओं का उपयोग करने में सक्षम होना चाहिए।

और दुसरी:

यदि S, T का एक घोषित उपप्रकार है, तो S के प्रकारों की वस्तुओं का व्यवहार करना चाहिए क्योंकि T की वस्तुओं से व्यवहार की अपेक्षा की जाती है, यदि उन्हें टाइप T की वस्तुओं के रूप में माना जाता है।

पिछले एक के साथ एनोटेट किया गया है:

ध्यान दें कि एलएसपी वस्तुओं के अपेक्षित व्यवहार के बारे में है। एलएसपी का पालन केवल तभी किया जा सकता है जब कोई इस बारे में स्पष्ट हो कि वस्तुओं का अपेक्षित व्यवहार क्या है।

ऐसा लगता है कि यह मूल से कमज़ोर है, और इसका अवलोकन करना संभव हो सकता है, लेकिन मैं इसे औपचारिक रूप से देखना चाहूंगा, विशेष रूप से समझाया गया है कि कौन तय करता है कि अपेक्षित व्यवहार क्या है।

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


अपडेट करें। मैंने पहले ही उत्तर स्वीकार कर लिया है, लेकिन मैं रूबी से एक और ठोस उदाहरण जोड़ना चाहूंगा ताकि प्रश्न का वर्णन किया जा सके। रूबी में, प्रत्येक वर्ग इस अर्थ में एक मॉड्यूल है कि Classकक्षा वर्ग का एक वंशज है Module। तथापि:

class C; end
C.is_a?(Module) # => true
C.class # => Class
Class.superclass # => Module

module M; end
M.class # => Module

o = Object.new

o.extend(M) # ok
o.extend(C) # => TypeError: wrong argument type Class (expected Module)

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

मैं समझता हूं, मैंने रूबी को केवल एक उदाहरण के रूप में दिया। मैं नहीं जानता, शायद आत्मनिरीक्षण के साथ कुछ अन्य भाषाओं में एलएसपी के कुछ "कमजोर रूप" हैं, लेकिन, अगर मैं सिद्धांत को सही ढंग से समझता हूं, तो यह आत्मनिरीक्षण के साथ असंगत है।
एलेक्सी

मैंने "रूबी" को शीर्षक से हटा दिया है।
एलेक्सी

2
संक्षिप्त उत्तर वे संगत हैं। : यहाँ है कि मैं ज्यादातर के साथ सहमत एक ब्लॉग पोस्ट है बतख टाइपिंग के लिए Liskov प्रतिस्थापन सिद्धांत
K.Steff

2
इस संदर्भ में @Alexey गुण एक वस्तु के अपरिवर्तनीय हैं। उदाहरण के लिए, अपरिवर्तनीय वस्तुओं की संपत्ति होती है कि उनके मूल्य नहीं बदलते हैं। यदि आप अच्छी इकाई परीक्षणों को देखते हैं, तो उन्हें इन गुणों के लिए बिल्कुल परीक्षण करना चाहिए।
Ktete

जवाबों:


29

यहाँ वास्तविक सिद्धांत है :

आज्ञा देना प्रकार की q(x)वस्तुओं xके बारे में एक संपत्ति है T। तब प्रकार की q(y)वस्तुओं yके लिए सिद्ध होना चाहिए, Sजहां Sइसका उप-प्रकार है T

और उत्कृष्ट विकिपीडिया सारांश:

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

और कागज से कुछ प्रासंगिक उद्धरण:

जो आवश्यक है वह एक मजबूत आवश्यकता है जो उप-प्रकारों के व्यवहार को संकुचित करता है: ऐसे गुण जो किसी वस्तु के प्रकल्पित प्रकार के विनिर्देश का उपयोग करके सिद्ध किए जा सकते हैं, भले ही वह वस्तु वास्तव में उस प्रकार के उप-प्रकार का सदस्य हो ...

एक प्रकार के विनिर्देश में निम्नलिखित जानकारी शामिल है:
- प्रकार का नाम;
- प्रकार के मूल्य स्थान का विवरण;
- प्रत्येक प्रकार के तरीकों के लिए:
--- इसका नाम;
--- इसके हस्ताक्षर (संकेतित अपवाद सहित);
--- पूर्व स्थितियों और बाद की स्थितियों के संदर्भ में इसका व्यवहार।

तो इस सवाल पर:

क्या मैं सही ढंग से समझता हूं कि लिस्कोव सबस्टीट्यूशन प्रिंसिपल को उन भाषाओं में नहीं देखा जा सकता है जहां ऑब्जेक्ट खुद का निरीक्षण कर सकते हैं, जैसे कि डक टाइप की गई भाषाओं में सामान्य क्या है?

नहीं।

A.classएक कक्षा देता है।
B.classएक कक्षा देता है।

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

लेकिन आइए एक सांख्यिकीय, संरचनात्मक (बतख) टाइप की गई भाषा पर विचार करें। इस मामले में, A.classएक बाधा के साथ एक प्रकार वापस आ जाएगा कि यह होना चाहिए Aया इसका एक उपप्रकार A। यह स्थिर गारंटी प्रदान करता है कि किसी भी उप-प्रकार को Aएक विधि प्रदान करनी चाहिए T.classजिसका परिणाम एक प्रकार है जो उस बाधा को संतुष्ट करता है।

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


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

@ एलएक्सपी का अर्थ है कि एलएसपी का मतलब क्या है। यदि मैं बी का उपयोग कर सकता हूं जहां मुझे ए की उम्मीद है, तो एलएसपी रखती है। मैं उत्सुक हूं कि आपको कैसे लगता है कि रूबी .class संभवतः इसका उल्लंघन करती है।
तेलस्तीन

3
@Alexey - यदि आपके प्रोग्राम में सम्‍मिलित है fail unless x.foo == 42और एक उपप्रकार 0 देता है तो वही बात है। यह एलएसपी की विफलता नहीं है, यह आपके कार्यक्रम का सामान्य संचालन है। बहुरूपता एलएसपी का उल्लंघन नहीं है।
तेलस्टीन जूल

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

6
@Alexey: यदि आप कुछ ऐसा लिखते हैं जो x.class == A पर निर्भर करता है, तो यह आपका कोड है जो एलएसपी का उल्लंघन करता है , भाषा का नहीं। कोड लिखना संभव है जो लगभग हर प्रोग्रामिंग भाषा में एलएसपी का उल्लंघन करता है।
एंड्रेस एफ।

7

एलएसपी के संदर्भ में एक "संपत्ति" एक ऐसी चीज है जिसे एक प्रकार (या एक वस्तु) पर देखा जा सकता है। विशेष रूप से यह एक "साबित संपत्ति" के बारे में बात करता है।

इस तरह की "संपत्ति" एक ऐसी foo()पद्धति का अस्तित्व हो सकती है जिसका कोई वापसी मूल्य नहीं है (और इसके प्रलेखन में निर्धारित अनुबंध का पालन करता है)।

सुनिश्चित करें कि आप "संपत्ति" के साथ इस शब्द को भ्रमित नहीं करते हैं जैसे कि " classरूबी में प्रत्येक वस्तु की संपत्ति है"। ऐसी "संपत्ति" एक "एलएसपी संपत्ति" हो सकती है, लेकिन यह स्वचालित रूप से समान नहीं है!

अब आपके सवालों का जवाब बहुत हद तक इस बात पर निर्भर करता है कि आप "संपत्ति" को किस तरह परिभाषित करते हैं। यदि आप कहते हैं "वर्ग की संपत्ति Aहै कि .classवस्तु के प्रकार के वापस आ जाएगी", तो Bवास्तव में करता है कि संपत्ति है।

यदि, हालांकि, आप "संपत्ति" को " .classरिटर्न A" होने के लिए परिभाषित करते हैं , तो जाहिर Bहै कि वह संपत्ति नहीं है।

हालाँकि, दूसरी परिभाषा बहुत उपयोगी नहीं है, क्योंकि आपको अनिवार्य रूप से एक निरंतर घोषित करने का एक गोल-गोल तरीका मिल गया है।


मैं केवल एक प्रोग्राम की "संपत्ति" की एक परिभाषा के बारे में सोच सकता हूं: दिए गए इनपुट के लिए यह किसी दिए गए मूल्य को लौटाता है, या, अधिक सामान्यतः, जब किसी अन्य प्रोग्राम में ब्लॉक के रूप में उपयोग किया जाता है, तो किसी दिए गए इनपुट के लिए अन्य प्रोग्राम वापस आ जाएगा दिए गए मान। इस परिभाषा के साथ, मैं यह नहीं देखता कि इसका क्या अर्थ है कि " .classवस्तु का प्रकार वापस करेगा"। अगर इसका मतलब है कि x.class == x.class, यह एक दिलचस्प संपत्ति नहीं है।
एलेक्सी

1
@ एसेक्स: मैंने अपने प्रश्न को एलएसपी के संदर्भ में "संपत्ति" का क्या अर्थ है, इस पर स्पष्टीकरण के साथ अद्यतन किया है।
जोकिम सॉयर

2
@ एसेक्स: पेपर में देख मुझे एक विशिष्ट परिभाषा या "संपत्ति" नहीं मिली। ऐसा शायद इसलिए है कि इस शब्द का प्रयोग सामान्य सीएस अर्थ में किया जाता है "ऐसा कुछ जिसे किसी वस्तु के बारे में देखा / सिद्ध किया जा सकता है"। इसका दूसरे शीश "किसी वस्तु के क्षेत्र" से कोई लेना- देना नहीं है।
जोआचिम सॉउर

4
@Alexey: मुझे नहीं पता कि मैं आपको और क्या बता सकता हूं। मैं "एक संपत्ति कुछ गुणवत्ता या किसी वस्तु का गुण है" की परिभाषा का उपयोग करता हूं । "रंग" एक भौतिक, दृश्यमान वस्तु का गुण है। "घनत्व" एक सामग्री की एक संपत्ति है। "एक निर्दिष्ट विधि होना" एक वर्ग / वस्तु की संपत्ति है।
जोआचिम सॉयर

4
@ एसेक्स: मुझे लगता है कि आप बच्चे को स्नान के पानी के साथ फेंक रहे हैं: सिर्फ इसलिए कि कुछ गुणों के लिए एलएसपी को धारण नहीं किया जा सकता है इसका मतलब यह नहीं है कि यह बेकार है या "किसी भी भाषा में पकड़ नहीं है"। लेकिन यह चर्चा यहाँ तक जाएगी।
जोआचिम सॉउर

5

जैसा कि मैं इसे समझता हूं, आत्मनिरीक्षण के बारे में कुछ भी नहीं है जो एलएसपी के साथ असंगत होगा। मूल रूप से, जब तक कोई वस्तु दूसरे के समान तरीकों का समर्थन करती है, तब तक दोनों को एक दूसरे को बदलने योग्य होना चाहिए। है यही कारण है कि, यदि आपका कोड एक उम्मीद Addressवस्तु है, तो यह फर्क पड़ता है अगर यह एक है CustomerAddressया एक WarehouseAddress, जब तक दोनों प्रदान के रूप में (जैसे) getStreetAddress(), getCityName(), getRegion()और getPostalCode()। आप निश्चित रूप से कुछ प्रकार के डेकोरेटर बना सकते हैं जो एक अलग प्रकार की वस्तु लेता है और आवश्यक तरीकों को प्रदान करने के लिए आत्मनिरीक्षण का उपयोग करता है (उदाहरण के लिए, एक DestinationAddressवर्ग जो एक Shipmentवस्तु लेता है और जहाज-को संबोधित करने के लिए प्रस्तुत करता है Address), लेकिन यह आवश्यक नहीं है और निश्चित रूप से नहीं होगा 'एलएसपी को लागू होने से रोकें।


2
@Alexey: यदि वे समान विधियों का समर्थन करते हैं, तो ऑब्जेक्ट "समान" हैं। इसका अर्थ है समान नाम, समान संख्या और प्रकार के तर्क, समान वापसी प्रकार और समान साइड-इफेक्ट्स (जब तक वे कॉलिंग कोड में दिखाई देते हैं)। विधियां पूरी तरह से अलग तरीके से व्यवहार कर सकती हैं, लेकिन जब तक वे अनुबंध का सम्मान करते हैं, तब तक ठीक है।
टीएमएन

1
@ एसेक्स: लेकिन मेरा ऐसा अनुबंध क्यों होगा? क्या वास्तविक उपयोग कि अनुबंध को पूरा करता है? अगर मैं इस तरह के एक अनुबंध किया था मैं बस के हर घटना की जगह सकता है x.class.nameके साथ 'A' , प्रभावी ढंग से कर रही है x.class.name बेकार
जोकिम सॉर

1
@Alexey: फिर से: सिर्फ इसलिए कि आप एक अनुबंध को परिभाषित कर सकते हैं जो किसी अन्य वर्ग का विस्तार करके पूरा नहीं किया जा सकता है, एलएसपी को नहीं तोड़ता है। इसका सीधा सा मतलब है कि आपने एक गैर-विस्तार योग्य वर्ग का निर्माण किया है। यदि मैं एक तरीका परिभाषित करता हूं, " यदि प्रदान किया गया कोड प्रदान करता है तो परिमित समय में समाप्त हो जाता है " तो मेरे पास एक अनुबंध भी है जिसे पूरा नहीं किया जा सकता है। इसका मतलब यह नहीं है कि प्रोग्रामिंग बेकार है।
जोकिम सॉर

2
@Alexey यह निर्धारित करने की कोशिश कर रहा है कि क्या x.class.name == 'A'बतख टाइपिंग में एक एंटी-पैटर्न है: आखिरकार, बतख टाइपिंग "अगर यह बत्तख की तरह चलती है और बत्तख की तरह चलती है, तो यह बतख है"। इसलिए अगर यह ऐसा व्यवहार करता है Aऔर Aआगे आने वाले अनुबंधों का सम्मान करता है, तो यह एक Aउदाहरण है
K.Steff

1
@ एसेक्स आपको स्पष्ट परिभाषाओं के साथ प्रस्तुत किया गया है। ऑब्जेक्ट का वर्ग उसके व्यवहार या अनुबंध या जिसे आप इसे कॉल करना चाहते हैं, का हिस्सा नहीं है। आप "ऑब्जेक्ट" को "ऑब्जेक्ट फ़ील्ड, जैसे x.myField" के साथ बराबर कर रहे हैं, जो कि इंगित किया गया है, यह समान नहीं है। इस संदर्भ में, एक संपत्ति गणितीय संपत्ति की तरह अधिक होती है , जैसे प्रकार के आक्रमणकारी। इसके अलावा, यदि आप बतख टाइपिंग चाहते हैं तो सटीक प्रकार की जांच करना एक विरोधी पैटर्न है। तो, LSP और बतख टाइपिंग के साथ आपकी समस्या क्या है, फिर से? ;)
एंड्रेस एफ।

4

बारबरा लिस्कोव के मूल पेपर को देखने के बाद, मैंने पाया है कि विकिपीडिया की परिभाषा को कैसे पूरा किया जाए ताकि एलएसपी वास्तव में लगभग किसी भी भाषा में संतुष्ट हो सके।

सबसे पहले, परिभाषा में "सिद्ध" शब्द महत्वपूर्ण है। विकिपीडिया लेख में इसकी व्याख्या नहीं की गई है, और "बाधाओं" का उल्लेख किए बिना अन्यत्र उल्लेख किया गया है।

यहाँ कागज से पहला महत्वपूर्ण उद्धरण है:

जो आवश्यक है वह एक मजबूत आवश्यकता है जो उप-प्रकारों के व्यवहार को संकुचित करता है: ऐसे गुण जो किसी वस्तु के प्रकल्पित प्रकार के विनिर्देश का उपयोग करके सिद्ध किए जा सकते हैं, भले ही वह वस्तु वास्तव में उस प्रकार के उप-प्रकार का सदस्य हो ...

और यहाँ दूसरा है, यह बताते हुए कि एक प्रकार का विनिर्देश क्या है:

एक प्रकार के विनिर्देश में निम्नलिखित जानकारी शामिल है:

  • प्रकार का नाम;
  • प्रकार के मूल्य स्थान का विवरण;
  • प्रत्येक प्रकार के तरीकों के लिए:
    • इसका नाम;
    • इसके हस्ताक्षर (संकेतित अपवाद सहित);
    • पूर्व स्थितियों और बाद की स्थितियों के संदर्भ में इसका व्यवहार।

इसलिए, एलएसपी केवल दिए गए प्रकार के विनिर्देशों के संबंध में समझ में आता है , और एक उपयुक्त प्रकार के विनिर्देश के लिए (उदाहरण के लिए खाली एक), यह शायद किसी भी भाषा में संतुष्ट हो सकता है।

मैं टेलस्टीन के जवाब को सबसे करीब मानता हूं कि मैं क्या देख रहा था क्योंकि "बाधाओं" का स्पष्ट रूप से उल्लेख किया गया था।


टेलस्टाइन, यदि आप इन उद्धरणों को अपने उत्तर में जोड़ सकते हैं, तो मैं आपको अपने स्वयं के मुकाबले स्वीकार करना पसंद करूंगा।
एलेक्सी

2
मार्कअप बिल्कुल समान नहीं है, और मैंने थोड़ा सा एम्फीसिस बदल दिया, लेकिन उद्धरण शामिल थे।
तेलस्तीन

क्षमा करें, जोकिम सॉयर ने पहले ही "सिद्ध" गुणों का उल्लेख किया है, जिसे आपने नापसंद किया था। सामान्य तौर पर, आपने केवल मौजूदा उत्तरों को पुनर्स्थापित किया है। ईमानदारी से, मुझे नहीं पता कि आप क्या ढूंढ रहे हैं ...
एंड्रेस एफ।

नहीं, यह नहीं समझाया गया था "क्या से?" यदि आप बहुत अधिक ज्ञान की अनुमति देते हैं, तो संपत्ति x.class.name = 'A'सभी xवर्ग के लिए उपयुक्त है Aप्रकार विनिर्देश परिभाषित नहीं किया गया था, और LSP के साथ अपने सटीक संबंध हालांकि अनौपचारिक रूप से कुछ संकेत दिए गए थे, या तो नहीं था। मैंने पहले ही पता लगा लिया है कि मैं लिस्कोव के पेपर में क्या देख रहा था और मैंने अपने प्रश्न का उत्तर दिया।
अलेक्सी

मुझे लगता है कि आपके द्वारा कहे गए शब्द कुंजी हैं। यदि xउस प्रकार के किसी भी प्रकार के लिए जो सुपरपाइप दस्तावेज़ हैं , तो x.woozleउपज होगी undefined, फिर कोई भी प्रकार जिसके लिए x.woozleउपज नहीं undefinedहै, एक उचित उपप्रकार होगा। यदि सुपरपाइप के बारे में कुछ भी दस्तावेज नहीं है x.woozle, तो यह तथ्य कि x.woozleसुपरपाइप का उपयोग करने से उपज undefinedहोगी, इसके बारे में कुछ भी नहीं होगा जो उपप्रकार पर क्या कर सकता है।
सुपरैट

3

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

बतख टाइपिंग में कुछ भी निहित नहीं है, एलएसपी टूट जाता है। केवल अगर आप इसका दुरुपयोग करते हैं, जैसा कि आपके उदाहरण में।

अतिरिक्त विचार: किसी वस्तु के वर्ग के लिए स्पष्ट रूप से जाँच करना, बतख टाइपिंग के उद्देश्य को पराजित नहीं करता है, वैसे भी?


एंड्रेस, क्या आप एलएसपी की अपनी परिभाषा दे सकते हैं, कृपया?
एलेक्सी

1
@Alexey उपप्रजातियों के संदर्भ में एलएसपी की सटीक परिभाषा विकिपीडिया में बताई गई है। अनौपचारिक परिभाषा है Liskov's notion of a behavioral subtype defines a notion of substitutability for mutable objects; that is, if S is a subtype of T, then objects of type T in a program may be replaced with objects of type S without altering any of the desirable properties of that program (e.g., correctness).। एक वस्तु का सटीक वर्ग "कार्यक्रम के वांछनीय गुणों" में से एक नहीं है; अन्यथा यह न केवल डक टाइपिंग के विपरीत चलेगा बल्कि सामान्य रूप से सबटाइपिंग के साथ जावा के स्वाद को भी शामिल करेगा।
एन्ड्रेस एफ।

2
@Alexey यह भी ध्यान दें कि आपका उदाहरण x.class == ALSP और बतख टाइपिंग दोनों का उल्लंघन करता है । यदि आप वास्तविक प्रकारों की जांच करने जा रहे हैं, तो बतख टाइपिंग का उपयोग करने का कोई अर्थ नहीं है।
एंड्रेस एफ।

एंड्रेस, यह परिभाषा मेरे लिए समझने के लिए पर्याप्त सटीक नहीं है। कौन सा कार्यक्रम, एक दिया, या कोई? एक वांछनीय संपत्ति क्या है? यदि कक्षा एक पुस्तकालय में है, तो विभिन्न अनुप्रयोग विभिन्न गुणों को वांछनीय मान सकते हैं। एक यह नहीं देखता कि एलएसपी का उल्लंघन कोड की रेखा कैसे कर सकता है, क्योंकि मुझे लगा कि एलएसपी एक दिए गए प्रोग्रामिंग भाषा में वर्गों की एक जोड़ी की संपत्ति थी: या तो ( A, B) एलएसपी को संतुष्ट करें या नहीं। यदि एलएसपी कहीं और उपयोग किए गए कोड पर निर्भर करता है, तो यह समझाया नहीं जाता है कि किस कोड की अनुमति है। मुझे यहाँ कुछ मिलने की उम्मीद है: cse.ohio-state.edu/~neelam/courses/788/lwb.pdf
एलेक्सी

2
@Alexey LSP एक विशिष्ट डिज़ाइन के लिए रखती है (या नहीं)। यह एक डिजाइन में देखने के लिए कुछ है; यह सामान्य रूप से एक भाषा की संपत्ति नहीं है। यह वास्तविक परिभाषा से अधिक सटीक नहीं है Let q(x) be a property provable about objects x of type T. Then q(y) should be provable for objects y of type S where S is a subtype of T:। यह स्पष्ट है कि x.classयहाँ दिलचस्प गुणों में से एक नहीं है; अन्यथा जावा का बहुरूपता भी काम नहीं करेगा। नहीं है कुछ भी नहीं अपने "x.class समस्या" में बतख टाइपिंग के लिए निहित। क्या आप अभी तक सहमत हैं?
एंड्रेस एफ।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.